回溯法求最优解问题-流水车间调度
来源:互联网 发布:淘宝的安佳牛奶 编辑:程序博客网 时间: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
- 回溯法求最优解问题-流水车间调度
- 最优流水调度问题
- 动态规划之 最优流水调度问题
- 回溯法解最优装载问题
- 回溯法解最优装载问题
- 回溯法获得最优解问题
- 回溯法:最优装载问题
- 算法设计与分析:第五章 回溯法 5.8流水作业车间调度
- 回溯法最优装载问题(java)
- 【回溯法解决最优装载问题】
- 车间作业调度问题 遗传算法
- 最优调度问题
- 回溯法求迷宫问题
- 回溯法求装载问题
- 回溯法求迷宫问题
- 【回溯法】求子集问题
- 回溯法求迷宫问题
- 用回溯法求解0—1背包问题,并输出问题的最优解
- EhCache缓存在集群环境中同步问题
- 可执行程序的结构
- bzoj1002【fjoi2007】轮状病毒
- Balloon Comes!
- 新生儿是否应饿着
- 回溯法求最优解问题-流水车间调度
- Android开发者不容错过的十大实用工具
- 实现一个android拨号联系人
- [BZOJ2330][SCOI2011]糖果
- 机器学习(6)——模型选择、参数选择
- 揭开移动 APM 的五大神秘面纱
- ny 1002括号配对问题
- 反思我这几天的惰性
- 计算机专业的一些基本知识