在一台机器上规划任务
你有 𝑛
个任务,要求你找到一个代价最小的的顺序执行他们。第 𝑖
个任务花费的时间是 𝑡𝑖
,而第 𝑖
个任务等待 𝑡
的时间会花费 𝑓𝑖(𝑡)
的代价。
形式化地说,给出 𝑛
个函数 𝑓𝑖
和 𝑛
个数 𝑡𝑖
,求一个排列 𝑝
,最小化
𝐹(𝑝)=𝑛∑𝑖=1𝑓𝑝𝑖(𝑖−1∑𝑗=1𝑡𝑝𝑗)
特殊的代价函数
线性代价函数
首先我们考虑所有的函数是线性的函数,即 𝑓𝑖(𝑥) =𝑐𝑖𝑥 +𝑑𝑖
,其中 𝑐𝑖
是非负整数。显然我们可以事先把常数项加起来,因此函数就转化为了 𝑓𝑖(𝑥) =𝑐𝑖𝑥
的形式。
考虑两个排列 𝑝
和 𝑝′
,其中 𝑝′
是把 𝑝
的第 𝑖
个位置上的数和 𝑖 +1
个位置上的数交换得到的排列。则
𝐹(𝑝′)−𝐹(𝑝)=𝑐𝑝′𝑖𝑖−1∑𝑗=1𝑡𝑝′𝑗+𝑐𝑝′𝑖+1𝑖∑𝑗=1𝑡𝑝′𝑗−(𝑐𝑝𝑖𝑖−1∑𝑗=1𝑡𝑝𝑗+𝑐𝑝𝑖+1𝑖∑𝑗=1𝑡𝑝𝑗)=𝑐𝑝𝑖𝑡𝑝𝑖+1−𝑐𝑝𝑖+1𝑡𝑝𝑖
于是我们使用如果 𝑐𝑝𝑖𝑡𝑝𝑖+1 −𝑐𝑝𝑖+1𝑡𝑝𝑖 >0
就交换的策略做一下排序就可以了。写成 𝑐𝑝𝑖𝑡𝑝𝑖 >𝑐𝑝𝑖+1𝑡𝑝𝑖+1
的形式,就可以理解为将排列按 𝑐𝑖𝑡𝑖
升序排序。
处理这个问题,我们的思路是考虑微扰后的变换情况,贪心地选取最优解。
指数代价函数
考虑代价函数的形式为 𝑓𝑖(𝑥) =𝑐𝑖e𝑎𝑥
,其中 𝑐𝑖 ≥0,𝑎 >0
。
我们沿用之前的思路,考虑将 𝑖
和 𝑖 +1
的位置上的数交换引起的代价变化。最终得到的算法是将排列按照 1−e𝑎𝑡𝑖𝑐𝑖
升序排序。
相同的单增函数
我们考虑所有的 𝑓𝑖(𝑥)
是同一个单增函数。那么显然我们将排列按照 𝑡𝑖
升序排序即可。
Livshits–Kladov 定理
Livshits–Kladov 定理成立,当且仅当代价函数是以下三种情况:
- 线性函数:𝑓𝑖(𝑡) =𝑐𝑖𝑡 +𝑑𝑖
,其中 𝑐𝑖 ≥0
; - 指数函数:𝑓𝑖(𝑡) =𝑐𝑖e𝑎𝑡 +𝑑𝑖
,其中 𝑐𝑖,𝑎 >0
; - 相同的单增函数:𝑓𝑖(𝑡) =𝜙(𝑡)
,其中 𝜙(𝑡)
是一个单增函数。
定理是在假设代价函数足够平滑(存在三阶导数)的条件下证明的。在这三种情况下,问题的最优解可以通过简单的排序在 𝑂(𝑛log𝑛)
的时间内解决。
本页面主要译自博文 Задача Джонсона с одним станком 与其英文翻译版 Scheduling jobs on one machine。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。
本页面最近更新:2025/9/22 01:44:35,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:Tiphereth-A, sshwy, c-forrest, Enter-tainer, HeRaNO, ouuan
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用