一、問題描述
給定 n 個作業的集合 j = 。每乙個作業 j[i] 都有兩項任務分別在兩台機器上完成。每乙個作業必須先由機器1 處理,然後由機器2處理。作業 j[i] 需要機器 j 的處理時間為 t[j][i] ,其中i = 1, 2, …, n, j = 1, 2。對於乙個確定的作業 排程,設f[j][i]是作業 i 在機器 j 上的完成處理的時間。所有作 業在機器2上完成處理的時間之和 f = sigma f[2][i] 稱為該作業 排程的完成時間之和。
批處理作業排程問題要求對於給定的 n 個作業,制定最佳作業排程 方案,使其完成時間和達到最小。
二、解題思路及所選演算法策略的可行性分析
用優先佇列式分支限界法解決此問題。由於要從n個作業的所有排列中找出有最小完成時間和的作業排程,所以批處理作業排程問題的解空間樹是一顆排列樹。對於批處理作業排程問題,可以證明存在最佳作業排程使得在機器1和機器2上作業以相同次序完成(因為每個作業必須先在機器1上完成作業才能在機器2上進行作業)。
如果對於未安排的作業,對於其中乙個作業,每當該作業在機器1上完成處理後都能立即在機器2上開始處理,則機器1沒有空閒時間,達到滿工作狀態,將此情況的未安排作業在機器2上的工作時間總和記為s1,同理將機器2滿工作狀態的情況下的工作時間總和記為s2,則必有:
所有作業機器2上完工時間和 >= 已安排作業機器2上完工時間和 + max
其中當未安排作業按照在機器1、2上工作時間非遞減順序進行排程時,s1和s2同時取得極小值且和排程無關,由此可作為分支限界法中的限界函式。
偽**描述及複雜度分析
bbflow()elsewhile(enode!=null&&enode.s<=n)
三、**實現
package分支限界法;
public
class nodes implements
comparable
public nodes(nodes e,int ef,int ebb,intn)
@override
public
intcompareto(object o)
}public
class
bbflow
public
void swap(int b,int i,int j,int k,int
t)
public
void swap(int x,int i,int
j)
/*** 對n個作業在機器1和2上所需時間排序
*/public
void
sort()
for(int i=0;i)}}
for(int i=0;i)
a[c[i]][j]=i;}}
/*** 計算完成時間和下界
* @param
enode
* @param
f *
@return
*/public
int bound(nodes enode,int
f) }
for(int k=0;k)
}f[1]=enode.f[1]+m[enode.x[enode.s]][0];
f[2]=((f[1]>enode.f[2])?f[1]:enode.f[2])+m[enode.x[enode.s]][1];
int sf2=enode.sf2+f[2];
int s1=0;
int s2=0;
int k1=n-enode.s;
int k2=n-enode.s;
int f3=f[2];
//計算s1的值
for(int j=0;j)
}//計算s2的值
for(int j=0;j)
}//返回完成時間和下界
return sf2+((s1>s2)?s1:s2);
}/*** 優先佇列式分支限界法解批處理作業排程問題
* @param
nn *
@return
*/public
int bbflow(int
nn) }
}else
swap(enode.x,enode.s,i);
}//完成結點擴充套件
}
//取下乙個擴充套件結點
enode=heap.poll();
}while(enode!=null&&enode.s<=n);
return
bestc;
}public
static
void
main(string args) ,,};//
m的下標從0開始
bbflow f=new
bbflow(n,m);
f.bbflow(n);
system.out.println("最優批處理作業排程順序為:");
for(int i=0;i)
system.out.print((f.bestx[i]+1)+" ");
system.out.println();
system.out.println("最優排程所需的最短時間為:"+f.bestc);
}}/*************************
*執行結果
*最優批處理作業排程順序為:
*1 3 2
*最優排程所需的最短時間為:18
*************************/
演算法作業 批處理作業排程 回溯 分支限界法
問題描述 給定 n 個作業的集合 j 每乙個作業 j i 都有兩項任務分別在兩台機器上完成。每乙個作業必須先由機器1 處理,然後由機器2處理。作業 j i 需要機器 j 的處理時間為 t j i 其中i 1,2,n,j 1,2。對於乙個確定的作業 排程,設f j i 是作業 i 在機器 j 上的完成...
批處理作業問題 分支限界法
include using namespace std 最小堆的插入與刪除 template class minheap int size const minheap insert const t x minheap deletemin t x private int currentsize,max...
回溯法 批處理作業排程 回溯法 批處理作業排程
問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。對於乙個確定的作業排程,設fji是作業i在機器j上完成處理時間。則所有作業在機器2上完成處理時間和f f2i,稱為該...