簡體   English   中英

從最大分散重復元素的列表列表中找到最佳組合

[英]Finding the optimal combination from a list of lists that maximally disperses repeating elements

我有一個列表列表,其中每個單獨的列表代表哪些人可以進行工作時間表輪班。 我的實際數據是 50 個班次的列表:

[['P3', 'P2', 'P4', 'P5'], ['P1', 'P3', 'P2', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1'], ['P5'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5' ', 'P2', 'P4'], ['P3', 'P2', 'P4', 'P5'], ['P3', 'P2', 'P4', 'P5'], ['P2 ', 'P5'], ['P1', 'P2', 'P5'], ['P1', 'P2', 'P5'], ['P1', 'P3', 'P5', 'P2' ', 'P4'], ['P5'], ['P2'], ['P1', 'P3', 'P4', 'P5'], ['P1', 'P3', 'P4', 'P5'], ['P1', 'P3', 'P4', 'P5'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P2' ', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1', 'P3' ', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4' '],['P1','P3','P4'],['P1','P3','P2','P4'],['P1','P2','P4'],[ 'P1', 'P2', 'P4', 'P5'], ['P1', 'P2', 'P5'], ['P1', 'P3', 'P2', 'P5'], [ 'P1', 'P3', 'P2', 'P5'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5' ', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P 5'、'P2'、'P4']、['P1'、'P3'、'P5'、'P2'、'P4']、['P2']、['P4']、['P1' , 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', ' P5','P2','P4'],['P1','P3','P5','P2','P4'],['P1','P3','P5','P2' , 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1' , 'P3', 'P2', 'P4']]

我試圖以 50 的最終列表結束(即 ['P3', 'P2', 'P4', 'P1', 'P5', 'P2', ...] 有兩個標准之一:

選項 A:重復元素最大程度地分散

選項 B:每個重復元素至少間隔 2 個索引空間,即 ['P1', 'P1'] 或 ['P1', 'P2', 'P1] 不可接受,但 ['P1, 'P2', 'P3', 'P1'] 沒問題。

我不知道如何處理選項 A tbh。 對於選項 B,這是我目前所擁有的:

AssignList = []
for ix, x in enumerate(AvailableList):
    randx = random.choice(x)
    if len(AssignList)==1:
        while randx==AssignList[0]:
            randx=random.choice(x)
    if len(AssignList)>1:
        while (randx==AssignList[-1]) | (randx==AssignList[-2]):
            randx=random.choice(x)
    AssignList.append(randx)
print(AssignList)

但是我的方法的問題是我認為它到達了一些列表,其中有一個選擇會導致無限循環。 非常感謝任何一種方法的提示!

為了實施選項 A,我建議引入分配給列表的分數或罰分。 根據您如何定義“最大分散”,您可以對 select 進行正確的分數或罰分 function。 通過選擇一個合適的選項,可以自動滿足選項 B。 考慮以下系統:您根據以下條件分配罰分:

  1. Penalty(list) = 1/(2-max(dist,2)) ,其中dist是同類型最近元素的距離
  2. Penalty(list) = Σ_i 1/(2-max(dist_i,2) ,並且 i 與 P_i 的索引相同,並且 dist_i 是列表中 P_i 實例的最小距離。
  3. Penalty(list) = Σ_i 1/pow(2-max(dist_i,2),2) ,您將 pow(...,2) 應用於前一個。

您可以將罰分分配給每個列表,並選擇罰分最低的那些。 當距離為 1 或 2 時,懲罰為無窮大。

從第 1 到第 2,您不僅考慮最近的 2 分,還考慮距離較遠的其他點,他們的點球也將貢獻較少。

從第 2 次到第 3 次,你會進一步懲罰親密關系。

您也可以將懲罰標准化,因為現在您擁有的分數越多,您給予的懲罰就越多,這已經是微不足道的了。 或者也許你不想考慮這種影響,但從這一點來看,你的罰分是什么樣的取決於你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM