1.问题的解空间是一颗排列树,简单的解决方法是在搜索排列书的同时,不断更新最优解,最后找到问题的解。
2.机器M1进行顺序加工,其加工时间f1是固定的, f1=f1+job[x[j]][1];。
机器M2则有可能空闲或积压。M2空闲时:f2[i]=f1+job[x[j]][2];
M2积压时:f2[i]=f2[i-1]+job[x[j]][2];
M2有空闲:
M2积压:
3.还要对解空间进行排序,就会尽快出现一个接近最优的解,在以后的搜索中,当某一排列前几步的加工时间,已经大于当前时间的最小值时,就不进行进一步的搜索计算,这个操作称为限界。
#include<stdio.h>
#include"stdlib.h"
int job[100][2],x[100],bestx[100],n,f1=0,bestf,f2[100]={0};
void swap(int i,int j);
void jtry(int i);
void jtry(int i){
int j;
if(i==n+1){ //搜索到底,记录
for(j=1;j<=n;j++)
bestx[j]=x[j];
bestf=f2[n];
}
else //没到底,交换进行全排列
for(j=i;j<=n;j++){ //交换i--n
f1=f1+job[x[j]][1];
if(f2[i-1]>f1)
f2[i]=f2[i-1]+job[x[j]][2];
else
f2[i]=f1+job[x[j]][2];
if(f2[i]<bestf){ //比目前的最小时间还小,进行递归全排列
swap(i,j);
jtry(i+1);
swap(i,j); //恢复原来的顺序
}
f1=f1-job[x[j]][1]; //把当前作业x[j][1]的去掉,向前一个回溯
}
}
void swap(int i,int j){
int t;
t=x[i];
x[i]=x[j];
x[j]=t;
}
void main(){
int i,j;
printf("输入作业数量:");
scanf("%d",&n);
printf("\n依次输入每个作业的时间(空格隔开)");
for(i=1;i<=2;i++)
for(j=1;j<=n;j++)
scanf("%d",&job[j][i]);
bestf=32767; //先随便给一个数,尽量大
for(i=1;i<=n;i++)
x[i]=i; //初始化顺序
jtry(1);
printf("\n最佳顺序:");
for(i=1;i<=n;i++)
printf("%d",bestx[i]);
printf("\n时间为:%d",bestf);
}