我有一種情況,我必須創建一個 C# 例程,它具有以下邏輯來獲取人員串列并根據偏好將他們分成 2 個團隊:
我有一個包含 20 個名字的陣列:
var names = new List(){"Joe", "Bill", "Scott", "Jonathan", . . .}
每個名字可以給出 0 到 3 個偏好,所以對于每個名字,我有一個長度為 0 到 3 的陣列,并且是一個串列中包含其他名字的字串陣列(他們是他們想要加入團隊的人)
我現在需要解決將 20 人的串列分成 2 個團隊并根據人們的偏好進行優化來創建團隊(子串列)的問題。因此,每個人都應該至少獲得一個人,并將其包含在他們的團隊偏好中(如果數學上可能的話)。沒有一個人高于其他任何人的優先級,只是嘗試優化匹配最多的數量。
我可以將字串串列轉換為物件串列
List<Person> list = CreateList(array)
其中 Person 類如下
public class Person
{
public string Name;
public List<Person> Preferences;
}
但現在我想弄清楚如何使用這個資料結構來生成 2 個團隊,我最終得到 2 個由 10 人組成的團隊串列。
uj5u.com熱心網友回復:
最佳流量方法可以解決您的問題 - 最大化圖表中的流量,該圖表分支容量表達偏好。有一個 N^3 演算法。
請參見此處的示例:用于與選擇和排名進行最佳匹配的演算法
uj5u.com熱心網友回復:
與其設定鄰接矩陣并嘗試通過線性代數提取一些有意義的向量解,我認為您可能會從迭代的“團隊隊長”型別模型中獲得一些進展。
我首先將每個人的偏好表示為一個行向量,模仿鄰接矩陣的行。
為便于說明,我以A、B、C、D 4個人為例,A和D想在一起,B想和C在一起,C想和A在一起。
鄰接矩陣的行是[1,0,0,1],[0,1,1,0],[1,0,1,0],[1,0,0,1]。所以我會繼續將每個人表示為他們在鄰接矩陣中的行。A 是 [1,0,0,1],B 是 [0,1,1,0],C 是 [1,0,1,0],D 是 [1,0,0,1]。
現在我要創建團隊隊長。我將尋找兩個點積最小的向量。您的要求不保證存在零點積。例如,每個人都可能希望與某個特定的人在一起。但是您仍然可以找到兩個點積最小的向量,并且在實踐中可能完全正交。
現在讓那兩個人成為隊長。在這個例子中,這意味著 A=[1,0,0,1] 和 B=[0,1,1,0] 是可行的隊長。
現在反復允許他們開始挑選他們的團隊。A 可以通過與 C 和 D 取點積來找到他的最佳新成員,觀察 D 產生最大的點積,從而得到團隊 {A,D}, {B,C}。
當然,就您而言,它并不止于此。因此,讓我們考慮一下如果還有 E、F、G 和 H 等待被選中會發生什么。在這種情況下,團隊 {A,D} 會將(列)矩陣 [A][D] 與(列)向量 [E]、[F]、[G] 和 [H] 相乘,看看哪個產品具有最大范數,選擇它并允許團隊 {B,C} 通過相同的程序選擇其最新成員:max{norm([B][C]*[candidate])}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/374297.html
上一篇:在N維空間中均勻分布點的演算法
