非单位时间的任务安排问题

  • 问题描述和要求
    • 测试样例
    • 具体代码

问题描述和要求

具有截止时间和误时惩罚的任务安排问题可描述如下:
(1)给定 n 个任务的集合 S={1,2,…,n};
(2)完成任务 i 需要 ti时间,1≤i≤n;
(3)任务 i 的截止时间 di,1≤i≤n,即要求任务 i 在时间 di之前结束;
(4)任务 i 的误时惩罚 wi,1≤i≤n,即任务 i 未在时间 di之前结束将招致 wi 的惩罚;若按时完成则无惩罚。

算法设计:设计一个贪心选择思想与动态规划思想相结合的算法,解决以上任务 安排问题,确定 S 的一个最优时间表,使得总误时惩罚达到最小。

数据输入:首先输入一个正整数 n 表示任务的个数。接下来的 n 行中,每行输入 三个整数,分别代表相应任务需要的时间 ti,截止时间 di,以及误时惩罚 wi。

结果输出:输出任务安排结果以及总的误时惩罚。

测试样例

测试样例1:

测试样例2:

测试样例3:

测试样例4:

测试样例5:

具体代码

import java.util.Arrays;public class arrange {public static void main(String args[]){int [][]task1 = {{1,4,70,1},{2,2,60,2},{1,4,50,3},{1,3,40,4},{1,1,30,5},{1,4,20,6},{3,6,80,7}};//四个数依次为:花费时间、时间期限、惩罚、任务编号int [][]task2 = {{1,4,70,1},{2,2,60,2},{1,4,50,3},{1,6,40,4},{1,1,30,5},{1,4,20,6},{3,5,20,7}};int [][]task3 = {{2,5,100,1},{3,4,70,2},{1,6,30,3},{5,8,150,4},{4,7,20,5}};int [][]task4 = {{6,6,30,1},{1,3,40,2},{2,3,80,3},{5,7,60,4},{5,8,30,5},{3,11,10,6},{8,10,100,7},{4,5,70,8},{3,4,60,9},{6,12,50,10}};int [][]task5 = {{6,6,30,1},{1,12,40,2},{2,3,20,3},{2,7,60,4},{5,8,30,5},{3,11,10,6},{2,10,20,7},{4,5,70,8},{3,4,60,9},{4,12,30,10}};int [][]task = task1;int [][]newtask = sortGreedy(task,1);//已经经过排序的task数组dynamic(newtask,newtask[newtask.length-1][1]);//第二个参数为时间长度,根据实际情况取最大的结束时间节点作为时间长度//       可以用这个来查看排序后的数组(可以思考第 12 行第二个参数为什么是那个)
//        for(int i=0;i<newtask.length;i++){//            System.out.print(i+1+" ");
//            System.out.println(Arrays.toString(newtask[i]));
//        }}public static void dynamic(int[][] a,int amount){int[][] p = new int[a.length+1][amount+1];      //构造最优解矩阵int[][] s = new int[a.length+1][amount+1];      //构造flag矩阵,用于与判断第i个任务是否完成for(int i=0;i<p.length;i++){                    //i表示任务数for(int j=0;j<amount+1;j++){                //j表示结束时间if(i==0){p[i][j]=0;}else{if(j<a[i-1][0]){                    //当结束时间小于花费时间一定不做任务ip[i][j]=p[i-1][j]+a[i-1][2];}else{p[i][j]=Math.min(p[i-1][j]+a[i-1][2],p[i-1][Math.min(j,a[i-1][1])-a[i-1][0]]);    //比较做与不做的最小代价if(p[i-1][j]+a[i-1][2]>p[i-1][Math.min(j,a[i-1][1])-a[i-1][0]]){s[i][j]=(i-1)*10+(Math.min(j,a[i-1][1])-a[i-1][0]);}}}}}//接下来是输出环节System.out.println("Process the following tasks in reverse order:");int flag = s[a.length][amount];int last = flag % 10;int front = (flag-last) / 10;int temp=amount;while(flag==0){temp--;flag = s[a.length][temp];last = flag % 10;front = (flag-last) / 10;}while(last!=0){if(flag==0){if(front==0){                               //当已经进行到第一个任务时结束回溯break;}front--;flag = s[front][last];if(flag!=0){last = flag % 10;front = (flag-last) / 10;}continue;}else {System.out.println("Task " + a[front][3]);flag = s[front][last];if (flag != 0) {last = flag % 10;front = (flag - last) / 10;}}}System.out.println("Task "+a[front][3]);System.out.println("Minimun penalty is "+p[a.length][amount]);
//        //这段代码查看我们构造的 p 矩阵
//        for(int i=0;i<p.length;i++){//            System.out.print(i+1+" ");
//            System.out.println(Arrays.toString(p[i]));
//        }
//        //这段代码查看我们构造的 s 矩阵
//        for(int i=0;i<s.length;i++){//            System.out.print(i+1+" ");
//            System.out.println(Arrays.toString(s[i]));
//        }}//排序函数public static int[][] sortGreedy(int[][] a, int column) {int[][]aa = new int[a.length][4];//用来存放排序后的a[][]int[] b = new int[a.length];// 存放需要排序列的数组int[] c = new int[a.length];// 存放b[]升序后的数组int[] z = new int[a.length];// 存放排序后数组元素原来所在数组的下标for (int i = 0; i < a.length; i++) {//提取需要排序的一列存到b[]b[i]=a[i][column];}for (int i = 0; i < a.length; i++) {//提取需要排序的一列存到b[]c[i]=b[i];}Arrays.sort(c);// 升序排列    为了得到排序后元素 排序前的下标z[]for (int i = 0;i<c.length; i++) {for (int j = 0;j<c.length; j++) {if (c[i] == b[j]) {z[i] = j;b[j] =-999999;break;} else {continue;}}}for(int i=0;i<a.length;i++){//建立aa[][]存放排序后的a[][] 并打印aa[i]=a[z[i]];//利用z[]下标数组排序}return aa;}}

##还有什么问题就问我
qq1516961638

非单位时间的任务安排问题相关推荐

  1. 非单位时间任务安排问题 贪心 动态规划 回溯

    问题描述: 动态规划+贪心思想: (这题好像一般归类在贪心,但我感觉主要就是个动态规划) 1.首先将任务按其截止时间非减序排序. 2.对任务 1 , 2 , -- , i,如果截止时间为 d ,则最小 ...

  2. 2020计算机考研初试考试先后顺序,2020考研初试考试时间及科目安排

    时光如梭,不知不觉进入四月下旬了,2020的考生复习备考已经有一段时间了,作为2020考研的同学,我们要利用好一切所能利用的资源.政策,尽自己最大努力,实现你的目标.根据历年考试时间推测,2020研究 ...

  3. 波形生成:均匀和非均匀时间向量

    波形生成-- 脉冲.chirp.VCO.正弦函数.周期性/非周期性和调制信号 使用 chirp 生成线性.二次和对数 chirp.使用 square.rectpuls 和 sawtooth 创建方波. ...

  4. 河南职称计算机啥时间考试,河南省2020年高级职称考试时间与具体安排

    河南省2020年高级职称考试时间定了吗?具体安排是什么?准考证去哪打印?医学教育网小编为您解答如下: 一.准考证打印 2020年7月27日至8月1日,考生可登录中国卫生人才网(http://www.2 ...

  5. 学完之后,有什么证书发吗?要另外收费吗?收费多少? 学员每天的上课时间是怎样安排的?...

    学完之后,有什么证书发吗?要另外收费吗?收费多少?学员每天的上课时间是怎样安排的? 学完之后,我们有相关的硬件维修工程师证书颁发.证书由于等级的不同费用也不一样,中级的600元,高级的800元.每天我 ...

  6. 凉山州计算机等级考试时间,2020年四川凉山中考考试时间及科目安排(已公布)...

    2020年四川凉山中考考试时间及科目安排已公布:7月13-15日 (一)考试科目 中考考试科目为:语文.数学.英语(含听力).物理.化学.道德与法制.历史.体育.理科实验操作(物理.化学).彝(藏)语 ...

  7. 2022年软考时间是怎么安排的,有哪些工种可以选择?如何备考?

    大家好,这里是网络技术联盟站,我是瑞哥. 最近微信上有三个小伙伴咨询我软考的考试时间问题,那么这些小伙伴基本上都是初考,所以对于怎么查询考试时间和如何备考不太清楚,本期瑞哥给大家简单介绍一下软考考试时 ...

  8. vue日程安排_使用Fullcalendar管理时间计划调度安排

    原标题:使用Fullcalendar管理时间计划调度安排 Fullcalendar可以很好的管理日程安排事件,可以管理时间和任务调度,比如日常值班岗位安排.举办活动会议议程安排.项目行动安排.车间劳动 ...

  9. Python计算两日期之间排除节假日与非上班时间的工作时间

    Python计算两日期之间排除节假日与非上班时间的工作时间 前言 一.基本思路 二.代码示例 总结 文章目录 前言 一.基本思路 二.代码示例 总结 前言 工作中遇见需要写UDF计算事项办理时间的需求 ...

最新文章

  1. 大白话讲解闭包笔试题
  2. Matlab问题汇总!
  3. List集合去重的一种方法
  4. 小半计算机谱子,小半 _桃李醉春风个人制谱园地_中国曲谱网
  5. 第三次作业-Scrum
  6. php获取访问者ip地址汇总,php获取访问者IP地址汇总_PHP
  7. 回调函数总结(个人见解)
  8. FFmpeg的模块介绍(一)
  9. sakai 工具翻译——测试和测验1
  10. 神州数码交换机建立VSF与删除VSF
  11. 曲线运动与万有引力公式_高中物理公式大全!
  12. 电脑如何更改设置本机IP地址
  13. MODULE_AUTHOR 功能
  14. 实现SDT(software-defined Things)的IOT案例(2)
  15. 和风天气获取天气情况
  16. Thread.Sleep vs. Task.Delay
  17. 易企秀H5 json配置文件解密分析
  18. S2ANet(Align Deep Features for Oriented Object Detection)解读
  19. 腾讯云服务器怎么搭建多个ip,(技巧)利用腾讯云架设多ip实现单窗口单ip
  20. 计算机老是跳出usb设备无法识别,如何解决电脑一直弹出USB设备无法识别的问题?...

热门文章

  1. 小白web学习笔记--信息收集
  2. 大一大学计算机基础教程课后答案,大学计算机基础教程课后习题答案大一
  3. 网络环境下连接SQL Server和Oracle 19c的方法
  4. [用python辅助学生中考与高考-3]:中考科技特长生知多少
  5. 【调试】AD7665无法读出数据到ARM的串口上
  6. 02-部署wtm vue项目
  7. 嵌入式入门———开发板文件烧录
  8. linux修改文件名为gbk,Linux下文件名编码转换-Convmv
  9. java比较时间大小 [按hh:mm:ss做比较]
  10. 微信小程序开发工具的下载