回溯法求最优解问题-流水车间调度

来源:互联网 发布:淘宝的安佳牛奶 编辑:程序博客网 时间:2024/05/02 05:07

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);}
0 0
原创粉丝点击