簡體   English   中英

尋求資源分配算法

[英]Resource Allocation Algorithm Sought

對於我的一個項目(不,不是一項家庭作業或考試問題,盡管我認為這會做得很好),但我需要一種算法。 這個問題看起來足夠熟悉和籠統,以至於我很確信它已經在文獻中得到了解決,但是我手頭上沒有算法書,也不清楚用什么術語來描述它,因此使用谷歌搜索是有限的。

除去多余的細節,問題如下:為您提供了一組資源{R_1,R_2,... R_n}和一組任務{T_1,T_2,... T_m}。 可以使用資源替代集TR_m = {{R_1m1,R_1m2,...},{R2m1,R_2m2,...},...}中的任何一個來完成每個任務。 每個資源一次只能由一個任務使用。 問題在於查看是否可以同時完成所有任務,或者,如果不可能,則可以同時完成最大數量的任務(從T_1開始)。

僅僅為每個任務分配第一組可用資源的幼稚算法有時會不必要地失敗:考慮TR_1 = {{R_1,R_2},{R_1}}和TR_2 = {{R_1},{R_2}}。 T_1會抓住R_1,R_2和T_2會失敗,而TR_1可能剛剛抓住R_1,TR_2可能已經抓住R_2。

我正在尋找一種算法,最好是優雅且簡單的算法,它將做得更好。

就其重要性而言,資源主要由可互換的子集組成,並且任務通常只需要每個集合中的一個或多個資源,因此幼稚算法通常會成功,但並非總是如此。

而且,通常任務和資源少於十個,並且問題(當前在Python 3中編碼)不是實時的,因此蠻​​力通常是可以接受的解決方案,但我正在尋找更好的解決方案。

有什么建議或鏈接嗎?

假設所有任務都相同。

那么您的問題等同於已知的NP-完全最大集包裝問題

因此,您的問題當然是NP難題,您不太可能為此找到完美的算法。

使用可以使用Branch和Bound

您可能會分支到“對於任務i ,我該選擇哪個集合?”,首先選擇最大的集合以使樹中的故障盡可能多地發生,以節省工作量。 對於初始解決方案,您可以將其翻轉以快速找到一個合理的(但不是最佳的)解決方案,最終可以通過稍后在實際搜索中進行更多的修剪來節省工作。

您還可以在以下模型的s[q,t]上分支,該模型最接近0.5(以某種方式“最不肯定”的選擇)。

邊界可以基於此ILP模型的線性松弛:

maximize sum of x[t] over all t

variables:
0 <= x[t] <= 1  ; x[t] decides whether task t is scheduled or not
0 <= r[i,t] <= 1 ; r[i,t] decides whether task t uses resource i
0 <= s[q,t] <= 1 ; s[q,t] decides whether set q of task t is used

constraints:
1. for all tasks t: (sum s[q,t] over all valid q) - x[t] = 0
2. for all sets s[q,t]: (sum r[i,t] over all i in the set) - size_of_set * s[q,t] >= 0
3. for all resources i: sum r[i,t] over all t <= 1
  1. 強制恰好有一組資源與所選任務相關聯。
  2. 強制通過選擇任務t的集合q使用的資源由​​任務t使用(> = 0,因為集合可能重疊)
  3. 強制不超過一次使用所有資源。

我可能在模型中犯了錯誤,但不確定其性能如何。 無論如何,可以使用線性編程來解決它(毫無疑問,有一個適用於Python的庫),然后進行幾次Gomory切割以取得良好的效果(它們看起來很嚇人,但它們實際上很簡單),雖然不是很多,僅使用Gomory割線來嘗試獲得全整數的解決方案通常會非常緩慢地收斂。 做其中一些是改進解決方案的廉價方法。

這將為您提供一個估計值,使您可以修剪一些搜索空間。 它實際修剪的量取決於它與實際解決方案的距離。 我預測它將傾向於選擇一個因數介於0和1之間的任務的多個集合,因為選擇一個“僅一點”的集合就可以將相同的資源用於多個任務。 然后,它必須選擇多個集合,因為每個任務必須總共使用1個集合,但這也意味着它擁有更多的資源選擇,因此可以做到這一點。 從某種意義上說,線性編程是一種偷偷摸摸的方法,從某種意義上說,它總是想給你最討厭的答案

當然,在此模型中,您將排除不再可能的任何可能性(已分配的資源和包含這些資源的集合以及可能具有零個可能集合的任務),並跳過已安排的任務。

如果這太復雜,則可以這樣計算出一個更簡單的界限:對於所有任務t ,取其最小集合s[t]的大小。 檢查直到總大小大於未分配資源的數量為止可以使用的數量(因此,請選擇最小的資源,再添加下一個最小的資源,依此類推-對它們進行排序或使用最小堆)。

當然,如果到目前為止已經分配了資源,那么那么多任務現在都沒有任何可能的總和(包括已經安排好的任務),那么到目前為止您將無法獲得最好的解決方案,而您可以放棄當前的最佳解決方案。遞歸樹的分支。

對於最初的解決方案,您可以嘗試使用所描述的貪婪算法,但要進行一次更改:采用僅包含未分配資源的最小集合。 通過這種方式,它試圖“避開”其他任務,盡管顯然您可以構造出比選擇第一個可能的情況差的情況。

編輯:當然,如果某個任務的集合中有一個集合是該集合中另一個集合的超集,則只需刪除它即可。 使用該超集再好不過了。 碰巧可以修復OP中給出的示例,但通常不會。

暫無
暫無

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

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