1.问题分析

有n个机器零件{j1,j2,j3,……,jn},每个零件必须先由机器1处理,再由机器2处理。零件ji需要机器1、机器2处理的时间为t1i,t2i。如何安排零件加工顺序使第一个零件从机器1上加工开始到最后一个零件在机器2上加工完成,所需的总加工时间最短?

根据问题的描述,不同的加工顺序,加工完所有零件所需要的时间肯定不同。

例如:现在有三个机器零件j1,j2,j3

在机器1加工时间是:2,5,4

在机器2加工时间是:3,1,6。

(1)如果按照{j1,j2,j3}的顺序加工,如图所示:

(2)如果按照{j1,j2,j3}的顺序加工,如图所示:

我们可以看到,第一台机器可以连续加工,而第二台机器开始加工的时间是当前第一台机器的下线时间和第二台机器下线时间的最大值。

3个机器零件有3的全排列种可能性的排列:

1 2 3

1 3 2

2 1 3

2 3 1

3 2 1

3 1 2

我们要找的就是其中一个加工顺序,使第一个零件从机器1上加工到最后一个零件在机器2上加工完成所需要的总加工时间最短。

实际上就是找到n个零件的一个全排列,使得总加工时间最短。那么每个排列都是一个可行解,解空间是一颗排列树。

例如3个零件的解空间树如图所示:

从根到叶子结点的路径就是机器零件的一个加工顺序。

现在已经知道这个解空间是一个排列树,排列树种从根到叶子结点都是一个可行解,但不一定是最优解,如何得到最优解呢?这就需要我们在搜索排列树的时候,定义限界函数得到最优解。

2.算法设计

(1)定义问题的解空间。

机器零件加工问题解的形式是n元组:{x1,x2,x3,…,xi,…,xn}。分量xi表示第i个零件号,n个零件组成的集合是S={1,2,3,……,n}。xi的取值是S-{x1,x2,x3,…,x(i-1)}。

(2)解空间的组织结构。

是一棵排列树,例子如上图所示。

(3)搜索空间

a.约束条件:

由于任何一种零件加工次序不存在无法调度的情况,都是合法的。因此任何一个排列都表述一个可行解。

b.限界条件(剪枝函数):

用 f2 表示当前已经完成的零件在第二台机器加工结束所需要的时间,用 bestf 表示当前找到的最优加工方案的完成时间。显然,继续向深处搜索时,f2不会减少,只会增加。因此当 f2 ≥ bestf 时,没有继续向深处搜索的必要。限界条件可以描述为:f2<bestf,f2初值是0,bestf的初值是无穷大。

c.搜索过程:

扩展结点沿着某个分支扩展时,需要判断限界条件,如果满足,则进入深一层继续搜索;如果不满足,则剪掉该分支。搜索到叶子节点时,即找到最优解。搜索直到全部的活结点变成死结点为止。

3.伪代码 

(1)数据结构:

我们用一个结构体node来存储机器零件在第一台机器上的加工时间x和第二胎机器上的加工时间y。定义一个这样的结构体数组T[ ]来存储所有的机器零件的加工时间。

例如第三个机器零件在第一台机器上的加工时间是5,在第二台机器上加工时间是2,那么T[3].x=5,T[3].y=2。

struct node
{int x;//在第一台机器加工的时间int y;//在第二台机器加工的时间
}T[MX];
//结构体数组存储所有机器加工时间。

(2)按限界条件搜索求解:

t表示当前扩展结点在t层。f1表示当前第一台机器上加工的完成时间,f2表示当前第二台机器上加工的完成时间。

如果t>n,表示已经到达叶子结点,记录最优值和最优解,返回。否则,分别判断每个分支是否满足约束条件,如果满足则进入下一层backtrack(t+1);如果不满足则反操作复位,考查下一个分支。

void backtrack(int t)
{if(t>n){for(int i=1;i<=n;i++){bestx[i]=x[i];//记录最优排列}bestf=f2; //更新最优值.return ;}for(int i=t;i<=n;i++) //枚举{f1+=T[x[i]].x;int temp=f2;f2=max(f1,f2)+T[x[i]].y;if(f2<bestf) //限界条件(剪枝函数){swap(x[t],x[i]);backtrack(t+1);//继续深搜swap(x[t],x[i]);//复位,反操作}f1-=T[x[i]].x;f2=temp;//复位,反操作。}
}

4.源代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;const int INF=999999999;
const int MX=11111;
int n; //机器零件的个数
int bestf; //最优加工零件时间
int f1; //在机器1加工的时间
int f2; //在机器2加工的时间
int x[MX]; //记录最优方案零件的编号
int bestx[MX]; //记录最优方案的加工顺序struct node
{int x;//在第一台机器加工的时间int y;//在第二台机器加工的时间
}T[MX];
//结构体数组存储所有机器加工时间。void backtrack(int t)
{if(t>n){for(int i=1;i<=n;i++){bestx[i]=x[i];//记录最优排列}bestf=f2; //更新最优值.return ;}for(int i=t;i<=n;i++) //枚举{f1+=T[x[i]].x;int temp=f2;f2=max(f1,f2)+T[x[i]].y;if(f2<bestf) //限界条件(剪枝函数){swap(x[t],x[i]);backtrack(t+1);//继续深搜swap(x[t],x[i]);//复位,反操作}f1-=T[x[i]].x;f2=temp;//复位,反操作。}
}int main()
{cout << "请输入零件的个数n"<< endl;cin >> n;cout << "请依次输出每个零件在第一台机器加工的时间x和在第二台机器加工的时间y"<< endl;for (int i=1;i<=n;i++){cin >> T[i].x >> T[i].y;x[i]=i; //零件的编号}bestf=INF; //赋予∞f1=0;f2=0;memset(bestx,0,sizeof(bestx)); //清空数组memset(x,0,sizeof(x));backtrack(1); //从排列树第一个结点开始搜索cout << "最优的机器零件加工顺序为:"<< endl;for (int i=1;i<=n;i++){cout << bestx[i] <<" ";}cout << endl;cout << "最优的机器零件加工的时间为:"<< endl;cout << bestf << endl;return 0;
}

5.测试结果

回溯——机器零件加工最优加工顺序问题相关推荐

  1. 【回溯法】机器零件加工-最优加工顺序

    题目 有n个机器零件{J1,J2,-,Jn},每个零件必须先由机器1处理,再由机器2处理.零件Ji需要机器1,机器2的处理时间为t(1i),t(2i).如何安排零件加工顺序,使第一个零件从机器1上加工 ...

  2. 0.1- 机械加工工艺-----切削加工基础

    1.钳工:通过工人手持工具进行切削加工.    机械加工:采用不同的机床(如车床.铣床.刨床.磨床.钻床等)对工件进行切削加工. 2.零件几何参数:         1.宏观几何参数:包括:尺寸.形状 ...

  3. UA SIE545 优化理论基础9 优先与分治策略1 文件的最优存储顺序

    UA SIE545 优化理论基础9 优先与分治策略1 文件的最优存储顺序 单磁带存储 相同查询频率 相同文件长度 查询频率与文件长度均不同 单磁带存储 相同查询频率 这一章介绍优先策略与分治策略,我们 ...

  4. 现代制造工程笔记04-精密超精密加工和特种加工(主要掌握加工原理加工条件)

    一.精密加工与超精密加工 不同时期对精密加工的定义以及要求不一样 1.1金刚石超精密加工() 1.2精密磨料加工--精密砂带抛光加工 1.3超声波加工 1.4 电解加工(加工材料必须是金属)--工件失 ...

  5. 精密加工与超精密加工的一些问题整理

    1.到底什么是精密加工技术? 加工精度在10-0.1um,表面粗糙度值0.3-0.03um的加工技术,但这个界限是随着加工技术的进步不断变化的,今天的精密加工可能就是明天的一般加工. 精密加工技术是为 ...

  6. 特种加工对于机械加工领域发展的意义

    特种加工对于机械加工领域发展的意义 特种加工对机械加工工艺的变革 摘要:结合特种加工技术的出现背景和技术特点,本文主要从特种加工技术区别于传统加工的特点引入思考,阐述了特种加工技术对机械加工工艺变革的 ...

  7. 计算机辅助二维铣削加工,外形铣削加工计算机辅助制造.ppt

    外形铣削加工计算机辅助制造.ppt * * 计算机辅助制造--- 外形铣削加工 广州市轻工职业学校 宁志良 本课工作任务: 应用MasterCAM软件建构图示工件实体,编制数控铣削加工程序,完成工件加 ...

  8. smt贴片加工的优劣势有哪些?

    随着电子行业的飞速发展,生产设备不断地升级,smt贴片加工技术变得越来越成熟,通过SMT贴片加工技术可以贴装更多.更小.更轻的元器件,使电路板实现高精密.小型化的要求,那么smt贴片加工技术作为电子行 ...

  9. 计算机模拟某种材料加工过程,材料加工过程计算机模拟的现状与未来.doc

    材料加工过程计算机模拟的现状与未来 [摘 要]随着经济全球化发展趋势不断加剧,制造业面临极大的市场挑战,以不断提高制造加工技术水平,促进加工技术改革和创新.现代发展中,制造业正向着高质量.低成本和高效 ...

最新文章

  1. Oracle官方教程之Fork/Join
  2. 数据算法 --hadoop/spark数据处理技巧 --(二次排序问题和TopN问题)
  3. Java内存模型_基础
  4. 苹果或推出Windows版Safari浏览器;微软正“取下”Chromium版Edge浏览器的Beta标签;亚马逊申请新专利……...
  5. 谷歌浏览器如何设置flash访问权限
  6. 从一个深度图里面导出NARF特征
  7. 6-5-2:STL之stack和queue——双端队列deque
  8. pandas后台导出excel_pandas导出Excel表格,银行卡号、身份证号无法正常显示的问题,该怎么解决?...
  9. labview 变量
  10. 识别速度3.6ms/帧!人像抠图、工业质检、遥感识别,用这一个分割模型就够了...
  11. B - 简单暴力(计算今年第几天)
  12. 三叔学FPGA系列之二:Cyclone V中的POR、配置、初始化,以及复位
  13. UGUI的InputField
  14. RS报内存错误XQE-ROL-0183
  15. Dotween Yoyo
  16. TypeError: Cannot set property ‘styles‘ of undefined
  17. 小技巧-不使用js制作高级足球比赛赛程表
  18. 计算机价格谈判议程,价格谈判的几个小技巧
  19. 计算机类综合素质测评考什么,综合素质测试考什么内容
  20. jsp超市会员积分管理系统

热门文章

  1. 江在川上曰:js中的JSON解析和序列化
  2. 关于Microsoft Edge 浏览器无法使用selenium调用问题
  3. 项目一:使用python tkinter模块做简单的计算器
  4. dlink 备份文件_D-Link路由器备份路由器配置信息教程
  5. 网易我的世界手机版服务器文件在哪个文件夹,网易我的世界手机版怎么导入地图...
  6. 把Safari当chrome用(插件篇)
  7. 按键精灵-UI配置丢失问题解决办法
  8. 利用Basemap画世界地图
  9. sm-crypto配合hutool加解密报pad block corrupted错误
  10. 大学寒假这样过,过完惊艳所有人,不只是你的宿友,mysql基础教程西泽pdf