用贪心算法编程求解任务安排问题

news/2025/3/29 2:46:03/

题目:用贪心算法编程求解以下任务安排问题

        一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0 开始执行直至时间1 结束,第2 个任务从时间1 开始执行至时间2 结束,…,第n个任务从时间n-1 开始执行直至时间n结束。
具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下。
(1) n个单位时间任务的集合S={1,2,…,n};
(2) 任务i的截止时间di ,1≤i≤n,1≤ di ≤n,即要求任务i在时间di 之前结束;
(3) 任务i的误时惩罚wi ,1≤i≤n,即任务i未在时间di 之前结束将招致wi 的惩罚;若按时完成则无惩罚。

已知:给定的n 个单位时间任务,各任务的截止时间di ,各任务的误时惩罚wi ,1≤i≤n,

要求:确定S的一个时间表(最优时间表)使得总误时惩罚达到最小。

解析:任务调度问题

  1. 按照任务的截止时间从小到大排序,即将任务按照最后期限从早到晚排列。
  2. 依次考虑每个任务,若将该任务放在当前时间表的最早可用时间能使总误时惩罚减少,则将该任务放入时间表中。
  3. 若将该任务放入时间表中会使总误时惩罚增加,则舍弃该任务。
  4. 重复步骤2-3,直到所有任务都被考虑完毕。

优先安排截止时间更早的任务,以保证能够满足所有任务的期限要求;同时在可行的情况下,优先安排误时惩罚更高的任务,以最大程度地减少总误时惩罚。

贪心策略:

  1. 按照任务的截止时间从小到大排序,即将任务按照最后期限从早到晚排列。
  2. 依次考虑每个任务,若将该任务放在当前时间表的最早可用时间能使总误时惩罚减少,则将该任务放入时间表中。
  3. 若将该任务放入时间表中会使总误时惩罚增加,则舍弃该任务。
  4. 重复步骤2-3,直到所有任务都被考虑完毕。

优先安排截止时间更早的任务,以保证能够满足所有任务的期限要求;同时在可行的情况下,优先安排误时惩罚更高的任务,以最大程度地减少总误时惩罚。

实现:

def task_scheduling(tasks):# 按照截止时间将任务按照从小到大排序sorted_tasks = sorted(tasks, key=lambda x: x[1])# 初始化完成时间和总误时惩罚completion_time = 0total_penalty = 0# 初始化任务排列schedule = []for task in sorted_tasks:# 如果当前任务完成时间超过了它的截止时间,计算误时惩罚if completion_time > task[1]:total_penalty += task[2]# 更新完成时间为当前任务结束时间completion_time = max(completion_time, task[1]) + 1# 将当前任务添加到任务排列中schedule.append(task[0])return schedule, total_penalty# 测试样例
tasks = [(1, 4, 70), (2, 2, 60), (3, 4, 50), (4, 3, 40), (5, 1, 30), (6, 4, 20)]
schedule, penalty = task_scheduling(tasks)
print("任务排列:", schedule)
print("总误时惩罚:", penalty)

      对于任务的排列,我们可以看到程序使用了贪心算法,按照任务的截止时间从小到大进行排序,并尽可能地将截止时间早的任务放在前面执行,这样可以最大限度地避免误时惩罚的产生。


http://www.ppmy.cn/news/1291942.html

相关文章

【LeetCode】150. 逆波兰表达式求值(ASCII码)

今日学习的文章链接和视频链接 leetcode题目地址:150. 逆波兰表达式求值 代码随想录题解地址:代码随想录 题目简介 即将后缀表达式转换成中缀表达式并计算。 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 …

[C#]C# OpenVINO部署yolov8图像分类模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 抛弃了前几代模型的 Anchor-Base。 YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来,领域内的研究者们…

计算机网络——网关或代理

1. 网关或代理的概念 网络中的代理服务器(proxy)或网关(passerelle)的概念。 在OSI模型的各个层次中,代理或网关充当中间实体,可以在不同的层次上提供连接和转发功能。 2. 代理或网关工作层次 在这种配置中…

opengl和directx中,渲染管线是什么?

在opengl 3D画图(渲染或图像处理)中,很多人都围绕着一个pipeline的词做很多解释,似乎明白这个词的含义成了入门必须要领悟的一道门槛。但实际上呢? 这都是因为翻译错误搞得大家非要解释一番的。好好的翻译工具不用&am…

Windows找不到文件‘chrome‘,请确定文件名是否正确后,再试一次。

本文主要记录遇到vscode运行HTML文件提示: Windows找不到文件‘chrome‘,请确定文件名是否正确后,再试一次。问题的解决办法。 目录 一、打开设置 二 、搜索Live Server Config (1)安装Live Server插件 &#xff0…

网络安全试题进阶——附答案

选择题 什么是CSRF攻击的全称? A. Cross-Site Request ForgeryB. Cross-Site ScriptingC. Credential Sniffing and Retrieval ForceD. Cyber Security and Risk Framework 哪种安全攻击利用用户的社交工程,诱使他们点击似乎是合法链接的恶意链接&#x…

MySQL数据管理(一)

一、列类型 列类型指规定数据库中该列存放的数据类型 列类型分类 数值类型字符串类型日期和时间型数值类型 数值类型 字符串类型 日期和时间类型 MySQL允许“不严格”语法,任何标点符号都可以作为日期部分之间的间隔符,如“24-01-03”、“24.01.03”…

使用KVM命令集管理虚拟机

1、KVM基本功能管理 1)查看命令帮助 [rootlocalhost ~]# virsh -h ......//省略输出内容 2)查看KVM的配置文件存放目录(rhel7.1是虚拟机系统实例的配置文件) [rootlocalhost ~]# ls /etc/libvirt/qemu autostart networks r…