从组合优化问题建模到贪心法求解以简单调度为例
此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报
所用教材:北京大学屈婉玲教授《算法设计与分析》
课程资料: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} $
小结
优化问题求解的关键
- 建模: 对输入参数和解给出形式化或半形式化的描述
- 设计算法: 采用什么算法设计技术
- 正确性: 是否对所有的实例都得到正确的解
- 分析算法一一效率