C C 回溯法 作業排程問題

2021-10-07 01:36:56 字數 1807 閱讀 8935

問題描述

n個作業(1,2,…,n)要在兩台機器上處理,每個作業必須先由機器1處理,然後再由機器2處理,機器1處理作業i所需時間為a1,機器2處理作業i所需時間為bj(1<=i<=n),批處理作業排程問題要求確定這n個作業的最優處理順序,使得從第1個作業在機器1上處理開始,到最後乙個作業在機器2上處理結束所需時間最少。

:作業-機器時間關係表為

約束條件

當前作業的執行時間和必須小於之前已選擇序列時間和的最小值

解圖

圖中limit為限制條件,real為完成當前作業執行時間和,當real>=limit則回溯。

完整**

#include

const

int inf=

1000

;const

int max_task=10;

//最大任務數

int n;

//任務數

int a[max_task][2

];//儲存每個作業分別在機器1與機器2上的時間消耗

int result[max_task]

;//儲存排列樹中的一條路徑

int best_result[max_task]

;//儲存最優路徑

int min=inf;

//安排任務最小完成時間

int rop[max_task+1]

;//每個深度對應遍歷進度

int finish[max_task+1]

;//每一層消耗時間和

void

swap

(int result[max_task]

,int best_result[max_task]

)//複製陣列

void

allot_task

(int depth)

} f2=f1+a[i][1

];//該作業完成時間

if(f2

)//該序列執行到此作業消耗時間

f2=finish[depth-1]

; finish[depth]

=f2;

if(depth==n)

//最後乙個作業

visited[i]

=false;

rop[depth]=0

;return;}

else

if(depth

else}}

visited[rop[depth]-1

]=false;

//跟換當前層次作業需要把之前作業解標記

} visited[rop[depth]-1

]=false;

rop[depth]=0

;return;}

main()

allot_task(1

);printf

("最優排程序列為:");

for(

int i=

0;i)printf

("\n消耗時間為:%d\n"

,min)

;}

執行結果

回溯法 批作業排程問題

問題 給定n個作業的集合。每個作業必須先由機器1處理,然後由機器2處理。所有作業在機器2上完成處理的時間和稱為該作業排程的完成時間和。批處理作業排程問題要求對於給定的n個作業,制定最佳作業排程方案 給出作業的加工順序 使其完成時間和達到最小。分析 所有可能的解為各個任務的乙個全排列,因此是乙個子集樹...

回溯法 批處理作業排程 回溯法 批處理作業排程

問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理時間。則所有作業在機器2上完成處理時間和f f2i,稱為該...

回溯法 批處理作業排程問題

給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先由機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji i 1,2,n j 1,2。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理的時間。則所有作業在機器2上完成處理的時...