問題描述:作業調度與N個任務和M機
我n
優先約束的工作和m
獨立的機器。每項作業的成本分配爲c
(以1
時間單位完成作業所需的機器數量)。它需要1
時間單位完成一項工作,只有當c
機器被分配給它時才能完成工作(工作是原子性的,不可能完成一半的工作)。
總之,有n
作業和他們的優先約束,m
機器和截止日期d
(一些時間單位數)。
我的目標:
我要檢查它是否可以將工作分配給機器,所有的工作都內d
時間單位完成。如果可能的話,我想打印一份時間表,爲每個作業分配時間單位(處理作業的時間單位,請參閱下面的示例)。
例子:
n = 5; // number of jobs
m = 6; // number of machines
d = 4; // deadline (number of time units in which the jobs need to be finished)
Precedences: (read "Job(x,y)<--Job(q,p)" as "job x with cost y needs to be
finished before job q with cost p can be started")
Job(3,1)<--Job(2,3)<--Job(1,4)
Job(5,3)<--Job(4,3)
Job(6,1)
The solution: in this case it's possible to assign jobs to machines such that each job
finishes in <=d time units.
A possible schedule is 1 2 3 3 4 1.
(read schedule as "job 1 and job 6 are done in the first time unit, job 2
is done during the second time unit, jobs 3 and 4 during the third time unit,
job 5 during the fourth time unit")
我目前的做法:(第二次嘗試感謝@Ole VV的反例)
我想要做一個回溯的方式(最好的方法,我可以拿出)。目前我遇到麻煩實施它。
我想存儲作業及其優先順序。然後我確定一個集合A,其中包含當前時間單位可以解決的所有作業。然後,我找到一個集合B(它包含我在這個時間單元中考慮解決的所有集合),它包含所有可用有限數量的機器解決的A的子集,使得沒有其他工作可以添加到每個子集通過向其中一個子集添加作業,該子集中所有作業的成本超過「m」)。然後我重複這個程序,但沒有解決的工作(A \ B),我對B中的每個子集進行遞歸調用。當傳遞的剩餘工作集合(A \ B)爲空時(所有工作完成),停止如果遞歸深度爲< = d
(如果滿足截止日期),則返回找到的計劃。
@Ole V.V.提供的示例中此方法的示例:
的步驟是指遞歸的深度,盒子指的是就業機會(第一個數字是作業ID,第二個是在單位時間成本在步驟0我明確地寫出來的子集(集。在這個步驟中我認爲要解決的工作)
現在我的問題是存儲作業及其優先級,找到可以當前時間單位解決的作業(集合A),找到我需要的作業子集考慮在當前時間單位(B組)中解決問題,並將其放在一個遞歸函數中,最終輸出找到的時間表或「沒有時間表找到」,如果沒有我的時間表截止日期。
我的算法會在第一步中選擇作業1和作業4,因爲它會查找成本總和儘可能接近機器數量的作業子集。在步驟2中選擇作業2和3,在步驟3中完成作業5。截止日期已滿足。 –
你是@AnnaVopureta。我現在已經將工作成本提高到了5到5臺機器,所以你不能從一開始就選擇工作1和4。請檢查一下我的論點是否有效。 –
你是對的!在這種情況下,我的算法會說沒有這樣的時間表(甚至有一個)。所以我的方法在一般情況下不起作用:/ –