车床零件加工调度问题

news2024/12/24 7:34:12

目录

题目

思路

代码

运行结果


题目

         某车间需要用一台车床和一台×××加工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;
    }

    @Override
    public 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动端APP测试常见面试题精析

现在面试测试职位&#xff0c;要求非常全面&#xff0c;那么APP测试一般需要哪些技术呢&#xff1f;下面总结了APP测试常见面试题&#xff1a; 1.Android四大组件? Activity:描述UI&#xff0c;并且处理用户与机器屏幕的交互。应用程序中&#xff0c;一个Activity就相当于手…

c++ 基础(新手入门必看)

C基础讲解&#xff0c;用于C语言向C的衔接 文章目录命名空间C输入输出缺省参数函数重载引用内联函数auto关键字基于范围for循环指针空值 -- nullptr命名空间 如果你以前看到过C的程序&#xff0c;那么你大概率会看到这样一行代码 这行代码就用到了命名空间的知识&#xff0c;…

QT 系统学习 day06 ,摄像头,语音识别(语音转文字,文字转语音,Qt 的人脸识别系统),

1.调用摄像头&#xff0c;拍照&#xff0c;存储照片 1.摄像头文件 /******* 摄像头相关类 *****/ #include <QCamera> /*** 摄像头类 ***/ #include <QCameraInfo> /*** 系统摄像头属性类 ***/ #include <QCameraImageCapture> /*** 用于记录摄像头数据的类…

C语言入门(一)——程序的基本概念

程序的基本概念 程序和编程语言 自然语言和形式语言 程序的调试 第一个程序 程序的基本概念 程序和编程语言 1.程序 程序&#xff08;Program&#xff09;告诉计算机应如何完成一个计算任务&#xff0c;这里的计算可以是数学运算&#xff0c;比如解方 程&#xff0c;也可…

Centos7下安装PostgreSQL14及其基本命令使用

MySQL关系型数据库目前算是互联网公司使用最多的。前两天看到一个推文&#xff0c;相对比国内使用MySQL&#xff0c;PostgreSQL在国内的普及貌似不高&#xff1f;国外像网络电话公司Skype公司等在大量使用PostgreSQL 作为互联网从业者&#xff0c;保持学习是必须的。开始学习Po…

小甲鱼C语言【课后笔记第一章——打印(printf)

目录 1、“打印”就是“输出”的意思 2、使用 GCC 编译程序&#xff1a;gcc 源代码 -o 可执行文件。 3、printf 是格式化输出函数 a、函数概要 b、函数原型 c、参数分析 d、返回值 e、演示 4. 转义字符 5. 反斜杠的奥义 6、课后习题&#xff08;编程题&#xff09; 1、…

性能工具之JMeter模拟多IP地址访问

文章目录一、前言二、前置条件三、操作步骤一、前言 今天一同事在压测时提到怎么用 JMeter 里虚拟多个 IP 来发送请求&#xff0c;我想了一下以前用LR时用过虚拟ip地址&#xff0c;JMeter 还没有使用过。想着原理应该是相通的&#xff0c;既然 LR 都能支持的话&#xff0c;那 …

多线程学习笔记(四)-- 常见类及使用

1. thread的方法 Thread.sleep()&#xff1a;占用cpu资源 Thread.yeild()&#xff1a;当前线程让渡cpu资源&#xff0c;大家竞争&#xff0c;也有再抢到cpu的机会 t1.join()&#xff1a;在t2线程中&#xff0c;调用t1.join()&#xff0c;是等待t1执行完成 2. 线程状态 3. sy…

力扣(LeetCode)142. 环形链表 II(C++)

哈希表 最直观的思想&#xff0c;哈希表记录遍历的结点&#xff0c;如果结点重复出现&#xff0c;则有环。如果遍历到空结点&#xff0c;无环。 class Solution { public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> ad;auto tail head;while(…

java计算机毕业设计ssm医患交流平台93xzr(附源码、数据库)

java计算机毕业设计ssm医患交流平台93xzr&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

用Excel自带图表插入带分类变量的箱形图(单坐标轴并列箱)

箱型图主要用来观察一个或多个类别下&#xff0c;数值型变量的分位数及离群值的特征和分布&#xff0c;以及在一定程度上观察到偏度和峰度的状态。网上有一些自己计算分位数来绘制箱型图的方法&#xff0c;但一方面是没有直接使用excel自带的箱型图好看和功能全面&#xff0c;二…

qq群聊机器人接入ChatGPT-简介和源码

qq群聊机器人接入ChatGPT 最近 ChatGPT 很火&#xff0c;也注册了账号玩了玩&#xff0c;确实灰常强大。但是也有的小伙伴可能没办法注册账号&#xff0c;我就想着把qq群机器人接入ChatGPT。 过程还是比较简单顺利的。下面简单介绍一下 直接跳过介绍&#xff0c;查项目代码 1…

绘制金字塔-第10届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第100讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

基于java(springboot)校园新闻管理系统源码(java毕业设计)

基于java(springboot)校园新闻管理系统 校园新闻管理系统是基于java编程语言&#xff0c;MySQL数据库&#xff0c;和springboot框架&#xff0c;用idea开发工具开发的设计&#xff0c;本设计分为学生用户&#xff0c;管理员两个角色&#xff0c; 学生的主要功能是可以注册登陆…

Cpolar实现虚拟机内网穿透,搭建私人云服务器

Cpolar实现虚拟机内网穿透,搭建私人云服务器 一、Cpolar功能介绍 Cpolar官网 Cpolar是一个安全的内网穿透的服务&#xff0c;可以将内网下的本地服务器通过安全隧道暴漏给公网。允许公网用户可以正常访问内网服务&#xff0c;是一款免费的内网穿透软件。只需要一行命令&#…

Python小炼(1):初识Python

"也许对我来说&#xff0c;太多拘束可能" 本篇的主要内容,针对的是一些常见的语法&#xff0c;在python中是怎样表示的&#xff0c;例如,python变量如何定义、选择、循环、判断结构是如何表示的&#xff1f;python函 数定义是怎么定义的…… ----前言 一、认识pyt…

无需代理及注册在VsCode中使用ChatGPT

无需代理及注册在VsCode中使用ChatGPT 安装 要安装扩展&#xff0c;请按照下列步骤操作&#xff1a; 1.打开 Visual Studio Code 2.单击左侧栏中的扩展程序图标 3.搜索"ChatGPT中文版" 4.点击安装按钮安装扩展 5.重启VSCode 用法 开始使用 在编辑器中右键触发…

【LeetCode每日一题:1691. 堆叠长方体的最大高度~~~排序+贪心】

题目描述 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个 子集 &#xff0c;并将它们堆叠起来。 如果 widthi < widthj 且 lengthi < …

Java学习笔记6.3.3 文件操作 - 对象序列化与反序列化

文章目录零、本讲学习目标一、对象序列化与反序列化&#xff08;一&#xff09;对象序列化与反序列化概念&#xff08;二&#xff09;对象序列化与反序列化示意图&#xff08;三&#xff09;实际开发中序列化和反序列化的场景&#xff08;四&#xff09;实现对象序列化的两种方…

26岁,干了三年测试,月薪才12k,能跳槽找到一个更高薪资的工作吗?

在我们的身边&#xff0c;存在一个普遍现象&#xff1a;很多人从事软件测试岗&#xff0c;不计其数&#xff0c;经历的心酸难与外人道也。可是技术确难以提升、止步不前&#xff0c;薪资也只能看着别人水涨船高&#xff0c;自己却没有什么起色。 虽然在公司里属于不可缺少的一…