目录

题目

思路

代码

运行结果


题目

某车间需要用一台车床和一台×××加工A,B,C,D4个零件。每个零件都需要先用车床加工,再用×××加工。车床和×××加工每个零件所需的工时(包括加工前的准备时间以及加工后的处理时间)如下表所示。

若按ABCD顺序加工,需要多少小时完成所有零件加工?

若调整加工顺序,最少需要多少小时完成所有零件加工?

思路

我的思路非常简单,直接枚举每一个位置。也就是所谓的暴力递归

例子:

这里有四个零件ABCD分别要加工

第一个位置从ABCD里选择一个,我就选择B,那么就剩下ACD

第二个位置从ACD里选一个,我就选择A,那么就剩下CD

第三个位置从CD里选一个,我就选择C,那么就剩下D

第四个位置放只能放D

这个算法的复杂度及其高,如果没有算错的话应该是n!,但是我做了一些剪枝优化,复杂度会比这个要低很多。

这里分别有四种情况需要判断

1.第一次进入的时候怎么处理,这里只用处理一种情况

①第一种情况:

xxx运行时间 = 车床处理第1个零件时间 + xxx处理第1个零件的时间

2.第n次进入的时候怎么处理(n>=2),这里需要处理三种情况

②第二种情况:

车床:第i+1个零件加工完后 ;xxx:第i个零件正好加工完

也就说xxx 是一直处于加工状态,没有空闲。

整个过程加工时间也就是  xxx停止运行时间,也就是已经把车床给的零件都加工完了

xxx运行时间= xxx处理完i个零件所需时间 + xxx加工第i+1个时间

③第三种情况:

车床:第i+1个零件加工完后 ; xxx:还在加工第i个零件

xxx运行时间= xxx处理完i个零件所需时间 + xxx加工第i+1个时间

此时你会发现②和③的加工时间是一样的,所以在代码里把他合并起来

④第四种情况:

车床:加工完第i+1个零件之前; xxx:已经把第i个零件加工完了,有空闲时间

也就是说 车床在加工完第i+1个零件时候,xxx早就把第i个零件加工完了,并且空闲了一段时间

xxx运行时间 = 车床加工前i+1个零件时间  + xxx加工第i+1个零件所需时间

代码

主函数:

public class Main {// arrayList  存储输入数据 相当于一个数组private static ArrayList<Work> arrayList = new ArrayList<Work>();//ans_src 用来存路径答案private static  ArrayList<String> ans_src=new ArrayList<String>();//  s 用来记录当前路径private  static String s="";// n 表示有多少个零件要加工   ans用来记录最短加工时长private static   int n=0,ans=-1;public static void main(String[] args) {Work w= new Work();arrayList.add(w);Scanner sc = new Scanner(System.in);n= sc.nextInt();//输入数据for (int i=1;i<=n;i++){Work work = new Work();int a,b;a=sc.nextInt();work.setA(a);b=sc.nextInt();work.setB(b);work.setFlag(true);arrayList.add(work);}//开始进行递归for (int i=1;i<=n;i++){//谁是第一个加工的? 每一个都要枚举一遍//i 表示 加工谁//1 表示 当前加工了多少个了// 0  0  前者表示车床加工时长  后者表示xxx加工时长//最后是记录加工路径//在记录路径的时候 我用了tran函数堆 i进行了转换,也就是说1对应A 2对应B...dfs(i,1, 0,0,""+tran(i));}System.out.println("所有可能如下::");for (int i = 0; i <ans_src.size(); i++) {System.out.println(ans_src.get(i));System.out.println("---------------------");}System.out.println("==================================");System.out.println("最短加工时长:"+ans);System.out.println("加工顺序:"+s);}/***  暴力枚举每一个位置* @param pos 表示 加工谁* @param where 表示 当前加工了多少个了* @param A 表示车床加工时长* @param B 表示xxx加工时长* @param src 记录加工路径*/public  static void  dfs(int pos,int where,int A,int B,String src){Work work = arrayList.get(pos);//先判断当前零件是否被加工过了,如果加工过了就退出//true 表示没被加工 false 表示被加工if (!work.isFlag())return;//标记当前零件被加工过了work.setFlag(false);int a= work.getA();//车床2   也就是车床在处理i+1个零件所需的时间int b= work.getB();//xxx2   也就是xxx在处理i+1个零件所需的时间if (where==1){//第一次进入的时候怎么处理,这里只用处理一种情况//第①种情况A=a;B=a+b;}else{//第n次进入的时候怎么处理(n>=2),这里需要处理三种情况if (A+a==B||A+a<B){//车床1+xxx1 == 车床1+车床2  或者 车床1+车床2 < 车床1+xxx1//第②种情况+第③种情况A+=a;B+=b;}
//            else if(A+a<B){//车床1+车床2 < 车床1+xxx1的情况//第③种情况
//                A+=a;
//                B+=b;
//            }else{// A+a>B  车床1+车床2 < 车床1+xxx1//第④种情况A+=a;B=A+b;}}for (int i=1;i<=n;i++){//接下来加工第i+1个位置,那选择谁?dfs(i,where+1,A,B,src+"---->"+tran(i));}//表示当前已经把 n个零件加工完了if (where==n){src+=";所需要的加工时间==>"+B;if (!ans_src.contains(src)){ans_src.add(src);}if(ans==-1){//遍历完后查看答案ans=B;s=src;}else{if (ans>B){ans=B;s=src;}}}//递归回溯//把当前零件的标记去了work.setFlag(true);}public static String tran(int pos){//对i进行转换 1->A  2 ->B 以此类推return Character.toString((char)('A'+pos-1));}
}

work类:

/*** @return*/
public class Work {private  int A;//车床加工时间private  int B;//xxx加工时间private  boolean flag;//是否被加工// true 表示当前零件没被加工  false 表示当前零件已经被加工了public Work(int a, int b, boolean flage) {A = a;B = b;this.flag = flage;}public Work() {}public int getA() {return A;}public void setA(int a) {A = a;}public int getB() {return B;}public void setB(int b) {B = b;}public boolean isFlag() {return flag;}public void setFlag(boolean flage) {this.flag = flage;}@Overridepublic String toString() {return "Work{" +"A=" + A +", B=" + B +", flag=" + flag +'}';}
}

运行结果

输入:

4
8 6
4 7
6 2
6 5

输出:

所有可能如下::
A---->B---->C---->D;所需要的加工时间==>29
---------------------
A---->B---->D---->C;所需要的加工时间==>28
---------------------
A---->C---->B---->D;所需要的加工时间==>30
---------------------
A---->C---->D---->B;所需要的加工时间==>32
---------------------
A---->D---->B---->C;所需要的加工时间==>28
---------------------
A---->D---->C---->B;所需要的加工时间==>31
---------------------
B---->A---->C---->D;所需要的加工时间==>29
---------------------
B---->A---->D---->C;所需要的加工时间==>26
---------------------
B---->C---->A---->D;所需要的加工时间==>29
---------------------
B---->C---->D---->A;所需要的加工时间==>30
---------------------
B---->D---->A---->C;所需要的加工时间==>26
---------------------
B---->D---->C---->A;所需要的加工时间==>30
---------------------
C---->A---->B---->D;所需要的加工时间==>32
---------------------
C---->A---->D---->B;所需要的加工时间==>32
---------------------
C---->B---->A---->D;所需要的加工时间==>29
---------------------
C---->B---->D---->A;所需要的加工时间==>30
---------------------
C---->D---->A---->B;所需要的加工时间==>33
---------------------
C---->D---->B---->A;所需要的加工时间==>30
---------------------
D---->A---->B---->C;所需要的加工时间==>29
---------------------
D---->A---->C---->B;所需要的加工时间==>31
---------------------
D---->B---->A---->C;所需要的加工时间==>26
---------------------
D---->B---->C---->A;所需要的加工时间==>30
---------------------
D---->C---->A---->B;所需要的加工时间==>33
---------------------
D---->C---->B---->A;所需要的加工时间==>30
---------------------
==================================
最短加工时长:26
加工顺序:B---->A---->D---->C;所需要的加工时间==>26进程已结束,退出代码0

车床零件加工调度问题相关推荐

  1. 如何解决编程的误差问题_柏威机械丨高精密零件加工是如何解决误差精度问题的?...

    机械的快速发展,对于设备零件的精度就有了更高的要求,而高精度的零件加工需求,就需要广东零件加工企业(柏威机械)对加工工艺进行改进. 机械加工工艺是根据图纸对零件进行加工的过程,加工工艺不止一种,对于一 ...

  2. 数控车床加工的工艺与普通车床的加工工艺

    数控车的工艺与工装削 数控车床加工的工艺与普通车床的加工工艺类似,但由于数控车床是一次装夹,连续自动加工完成所有车削工序,因而应注意以下几个方面. 合理选择切削用量 对于高效率的金属切削加工来说,被加 ...

  3. 数控车床编程加工工艺的处理

    数控车床编程加工工艺的处理 一.确定工件的加工部位和具体内容 1)确定被加工工件需在本机床上完成的工序内容及其与前后工序的联系. 2)工件在本工序加工之前的情况.例如铸件.锻件或棒料.形状.尺寸.加工 ...

  4. HALCON示例程序measure_metal_part_id.hdev使用xld边缘拟合检测零件加工是否合格

    HALCON示例程序measure_metal_part_id.hdev使用xld边缘拟合检测零件加工是否合格 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () Imag ...

  5. 零件加工 贪心 题解

    1019: B06-贪心-零件加工[提高组] 时间限制: 1 Sec  内存限制: 128 MB 提交: 24  解决: 7 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 工匠小K最 ...

  6. C++——NOIP模拟题——零件加工

    零件加工 题目描述 工匠小 K 最近有 n 个零件需要加工.每个零件都需要 ti 天的时间来完成,每个零件每延迟一天加工都要缴纳一定的罚金 si .延迟的天数为从今天算起到该工作开始的那天,第一个零件 ...

  7. AOJ 15951 零件加工问题二

    题目传送门 Description 有个国有中型企业,接到一批需要加工零件的订单,员工们非常高兴,工厂领导为了鼓 励员工尽快地完成加工任务,出台了奖励政策:"如果在保证质量要求的前提下,每完 ...

  8. Edgecam2021数控车床编程加工视频教程

    Edgecam2021数控车床编程加工视频教程 链接:https://pan.baidu.com/s/1MWUhyOkOCj7JOrwuhXZvBA  提取码:nuxv 

  9. 拨叉零件加工工艺及钻18孔夹具设计(说明书+CAD图纸+solidworks三维图+工序卡+过程卡)

    摘  要 本次设计内容涉及了机械制造工艺及机床夹具设计.金属切削机床.公差配合与测量等多方面的知识. 弯臂加工工艺规程及钻孔的夹具设计是包括零件加工的工艺设计.工序设计以及专用夹具的设计三部分.在工艺 ...

最新文章

  1. 【c语言】输入两个数,交换这两个数后,再输出
  2. 多国相继出台政策法规:为「自动驾驶」的「创新发展」保驾护航
  3. Sabayon:治理 GNOME 用户的设置
  4. kohana中的路由规则
  5. 6.LibSVM核函数
  6. 适合 Kubernetes 初学者的一些实战练习 (三)
  7. python面向对象三大特性、类的约束、print带颜色输出及super补充
  8. JPA 2 | 获取联接以及我们是否应该使用它们
  9. C语言指针,申请、释放内存,线程
  10. hdu 4339 Query 线段树 多校联合赛(四) 第九题
  11. ip地址规划工具_ROS、Simulink、Carsim的互联与规划、控制算法的验证
  12. 《Linux 系列》- 常用命令- 文件浏览命令]
  13. mysql lex yacc脚本_终于成功配置lex和yacc的工具Parser Generator
  14. 手把手教你迁移微信小程序到 QQ 浏览器
  15. python风格迁移_图像风格迁移实战(附Python实战)
  16. xp计算机限制打开u盘,处置xp系统电脑限制使用u盘的解决方法
  17. 由计算机病毒引起的问题属于,多数情况下由计算机病毒程序引起的问题属于()故障。A.硬件B.软件C.操作D.电源...
  18. 云服务器连接不上怎么办
  19. 通过海康sdk实现指定时间段内的录像文件下载
  20. Tungsten Fabric如何实现路由的快速收敛?收敛速度有多快?

热门文章

  1. python计算器基础知识_Python基础知识+计算器练习
  2. Elasticsearch 第二天
  3. Mac下matplotlib显示中文(不用安装字体)
  4. Ubuntu18.04+ROS melodic 控制UR5机器人(持续更新)
  5. 如何配置一台能够进行Gromacs科学计算的电脑
  6. mesos papers
  7. Python 用户输入和循环的学习
  8. 企业微信公费电话怎么使用?
  9. 酷夏来临,如何做好足部养生预防脚病?
  10. USB 4(USB 4.0)的设计规范(原版)