从组合优化问题建模到贪心法求解以简单调度为例

news/2024/10/18 12:36:48/文章来源:https://www.cnblogs.com/cloud-ken/p/18474011

此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报
所用教材:北京大学屈婉玲教授《算法设计与分析》
课程资料:https://www.icourse163.org/course/PKU-1002525003
承诺不用于任何商业用途,仅用于学术交流和分享

  • 更多内容请关注课题组官方中文主页:https://JaywayXu.github.io/zh-cn/

1. 简单调度问题(1.2)

  • 问题描述: 有n项任务,每项任务加工时间已知. 从0时刻开始陆续安排到一台机器上加工. 每个任务的完成时间是从0时刻到任务加工截止的时间.
  • 求: 总完成时间(所有任务完成时间之和)最短的安排方案.

实例

  • 假定有一个实例:
    任务集 \(S=\{1,2,3,4,5\}\),
    加工时间: \(t_1=3, t_2=8, t_3=5, t_4=10, t_5=15\)

贪心法解法

  • 此时我们可以按照贪心法进行求解,即将加工任务按照加工时间从小到大进行排序,则加工时间少的任务会被多次重复计算而加工时间多的任务重复计算次数少。可以得到:
    贪心法解法

问题建模

  • 输入: 任务集: \(S=\{1,2, \ldots, n\}\), 第 \(\boldsymbol{j}\) 项任务加工时间: \(\boldsymbol{t}_{\boldsymbol{j}} \in \mathbf{Z}^{+}, \boldsymbol{j}=\mathbf{1 , 2 , \ldots , n}\).

  • 输出:调度 \(I, S\) 的排列 \(i_1, i_2, \ldots, i_n\)

  • 目标函数: \(I\) 的完成时间, \(t(I)=\sum_{k=1}^n(n-k+1) t_{i_k}\)

  • 最优解 \(I^*\) : 使得 \(t\left(I^*\right)\) 达到最小, 即 \(\boldsymbol{t}\left(\boldsymbol{I}^*\right)=\min \{\boldsymbol{t}(\boldsymbol{I}) \mid \boldsymbol{I}\)\(\boldsymbol{S}\) 的排列 \(\}\)

  • 描述:对于n个任务的任务集中的每个任务j,其加工时间是一个正整数,用\(\boldsymbol{t}_{\boldsymbol{j}}\)表示,输出是一个调度I,其表示任务一个排列顺序。目标函数则是调度I的完成时间。最优解就是使得目标函数t(I)达到最小的任务排列,此处记作\(I^*\)

贪心法求解简单调度

  • 设计策略:加工时间短的先做
  • 算法:根据加工时间从小到大排序,依次加工
  • 算法正确性:对所有输入实例都得到最优解
  • 证明:加入调度f, 第i,j项任务相邻且有逆序(即加工时间长的任务排在加工时间短的任务之前), 即\(t_i>t_j\)。交换任务i和j得调度g.
  • 总完成时间 \(t(g)-t(f)=t_j-t_i<0\)
  • 所以通过这个式子说明,我们减少了一个逆序以后,它的加工时间是总的时间是减少了。当调度I没有逆序出现时,因此它在总的加工时间中达到最小的,它是个最优解。

反例

  • 当然,贪心法不能求解所有问题,往往不是正确的。
  • 例如,在如下背包问题中:
    背包问题反例
  • 假设我们使用贪心法,使用单位重量下的物品价值进行评价,则有 单位重量价值大的优先, 总重不超 6按照 \(\frac{\boldsymbol{v}_i}{\boldsymbol{w}_i}\) 从大到小排序: \(1,2,3,4\)

\[\frac{7}{3} > \frac{9}{4}>\frac{9}{5}>\frac{2}{2} \]

  • 通过贪心法,我们得到的解是物品{1,4},重量是2+3=5,价值是7+2=9。然而,我们可以找到一个更好的解物品{2,4},重量是4+2=6,价值是9+2=11。因此,简单使用贪心法不能求解所有组合优化问题。

2. 简单投资问题(1.2)

  • 问题: \(m\) 元钱, 投资 \(n\) 个项目. 效益函数 \(f_i(x)\),表示第 \(i\) 个项目投 \(x\) 元的效益, \(i=1,2, \ldots, n\).求如何分配每个项目的钱数使得总效益最大?

实例:

简单投资问题

问题建模

  • 输入:\(n, m, f_i(x), i=1,2, \ldots, n, x=1,2, \ldots, m\) n 项目数,m钱数,\(f_i(x)\)表示效益函数。
  • 解: \(n\) 维向量 \(<x_1, x_2, \ldots, x_n>, x_i\) 是第 \(i\) 个项目的钱数, 使得下述条件满足:
  • 目标函数:$ \max \sum_{i=1}^n f_i\left(x_i\right) $
  • 约束条件:$ \sum_{i=1}^n x_i=m, \quad x_i \in \mathbf{N} $

小结

优化问题求解的关键

  • 建模: 对输入参数和解给出形式化或半形式化的描述
  • 设计算法: 采用什么算法设计技术
  • 正确性: 是否对所有的实例都得到正确的解
  • 分析算法一一效率

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python: invalid value encountered in divide以及invalid value encountered in double_scalars报错

运行命令python eqtl_prepare_expression.py data.tpm.gct data.reads_count.gct --tpm_threshold 0.1 --count_threshold 2 --sample_frac_threshold 0.2 --normalization_method tmm --output data.txt时出现了报错“invalid value encountered in divide”以及“invalid val…

java报错大合集

​D:\代码\Mybatis-84\src\test\java\com\lu\TestNews.java:100:39 java: 找不到符号符号: 方法 of(int,int)位置: 接口 java.util.List解决idea中的jdk变成1..8了而List.of()是9出的所有报错,改回17 在“class java.lang.String”中没有名为“name”的属性的 getter纯属粗心…

DataDream:调一调更好,基于LoRA微调SD的训练集合成新方案 | ECCV24

尽管文本到图像的扩散模型已被证明在图像合成方面达到了最先进的结果,但它们尚未证明在下游应用中的有效性。先前的研究提出了在有限的真实数据访问下为图像分类器训练生成数据的方法。然而,这些方法在生成内部分布图像或描绘细粒度特征方面存在困难,从而阻碍了在合成数据集…

深入理解浮点数的表示

浮点数的表示 通常,浮点数表示为: \[N = (-1)^{S} \times M \times R^{E} \]其中,S取值为0或者1,用来决定浮点数的符号;M是一个二进制定点小数,称为尾数,一般用定点原码小数表示;E是一个二进制顶点整数,称为阶码或者指数,用移码表示。R是基数(隐含),可以约定为2、4、…

20222410 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1.实验内容正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程通过组合应用各种技术实现恶意代码免杀 如果成功实现了免杀的,简单语言描述原理,不要截图…

构建自己的DEX

构建自己的DEX 简介:用户可通过主流钱包Dapp浏览器,访问URL地址,进行Swap, BSC链界面演示技术栈Solidity React Typescript Vite Wagmi Openzeppelin环境配置PancakeSwap V2 路由地址 0xB6BA90af76D139AB3170c7df0139636dB6120F7e https://remix.ethereum.org/ 开发部署环境…

ubantu20.4重置密码

一、重启ubantu系统,按shift键一直不放,再按E键 二、更改这里,删除ro 在Splash 后配置(rw init=/bin/bash),再按CTRL+X键 三、输入passwd root ,输入两次密码,直到看到“password updated successfully”表示成功了 四、输入exit退出,重启即可完成密码重置 五、如果重…

TB 级数据入库无压力:Apache DolphinScheduler 助力 ClickHouse 优化

引言 🚀 如今,随着大数据、物联网、人工智能等技术的快速发展,数据量呈现指数级增长。企业迫切需要一个既能快速处理大规模数据,又能保障性能稳定的数据库系统。ClickHouse 在数据分析与查询性能方面表现优异,但随着数据规模不断增长,其在数据写入与合并阶段的瓶颈也日渐…

20222417 2024-2025-1《网络与系统攻防技术》实验二实验报告

1.实验内容 1.1实践目标 (1)使用netcat获取主机操作Shell,cron启动某项任务(任务自定) PS:cron是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterpreter(或其他软件)生成可执行文件(后…

开源免费数据库监控工具,MySQL、Oracle、Postgres或MSSQL

在信息系统项目中,UI、业务逻辑、数据库操作、文件操作、网络、API调用等许多环节都有可能产生性能问题,其中,数据库读写是最为常见的操作,我们也发现其实许多项目中的大部分瓶颈多来自于数据库操作。因此,在做性能优化的过程中,我们总是特别关注持久层的代码、数据库的设…

Unity生命周期

基础概念 游戏的本质就是一个死循环,每一次循环都会处理游戏逻辑并更新一次游戏画面之所以能看到画面在动,是因为切换画面速度达到一定速度时人眼就会认为画面是动态且流畅的一帧就是执行了一次循环,Unity底层已经封装好了这个死循环我们只需要利用Unity的生命周期函数的规则…