文章目录
- 💂 个人主页:风间琉璃
- 🤟 版权: 本文由【风间琉璃】原创、在优快云首发、需要转载请联系博主
- 💬 如果文章对你有
帮助
、欢迎关注
、点赞
、收藏(一键三连)
和订阅专栏
哦
前言
提示:这里可以添加本文要记录的大概内容:
一、负载均衡
问题描述:有m台相同机器,n个任务,任务j的处理时间为 t j t_j tj,每个任务只能在一台机器上连续工作,一台机器同一时间只能处理一个任务。将完成最后一个任务所需的时间为负载时间,希望能够让这个负载时间最短。负载均衡是NP-Hard问题,因为分割问题可以归约到负载均衡问题。
J(i) 表示分配给机器 i 的任务子集。
机器i的负载(即总处理时间)为 L i = ∑ j ∈ J ( i ) t j L_i = \sum_{j \in J(i)} t_j Li=∑j∈J(i)tj。
最大负载(makespan)是所有机器中最大的负载,即: L ∗ = max i L i L^* = \max_i L_i L∗=maxiLi
引理:
- L ∗ ≥ m a x ( t j ) L^* \geq max(t_j) L∗≥max(tj),最优负载时间大于等于完成最长任务的工作所需时间。
- L ∗ ≥ ( 1 / m ) ∑ t j L^* \geq (1/m) \sum t_j L∗≥(1/m)∑tj,最优负载时间大于等于所有任务的平均时间。
1.1 List-Scheduling贪心算法
List-Scheduling 是一种贪心策略,其核心思想是将各个工作依次(无排序)安排到累计工作时长最短的机器中。
该贪心算法是一个2倍近似算法。证明如下:
设 L i L_i Li为瓶颈机器i的负载(即所有机器中负载最大的机器)。设j是最后分配到机器i的任务。
根据贪心算法的步骤,当最后一个任务j被分配到机器i时,机器i的负载是所有机器中最小的。因此,分配任务j前,机器i的负载满足:
L
i
−
t
j
≤
L
k
对于所有
1
≤
k
≤
m
L_i - t_j \leq L_k \quad \text{对于所有 } 1 \leq k \leq m
Li−tj≤Lk对于所有 1≤k≤m
因为左侧机器i的
L
i
L_i
Li负载时间都小于所有的机器的负载时间
L
k
L_k
Lk,则也肯定小于m个机器负载的平均时间,即
L
i
−
t
j
≤
(
1
/
m
)
∑
K
L
k
=
(
1
/
m
)
∑
k
t
k
L_i - t_j \leq (1/m) \sum_K L_k = (1/m) \sum_k t_k
Li−tj≤(1/m)∑KLk=(1/m)∑ktk。 由第二个引理有
L
i
−
t
j
≤
L
∗
L_i - t_j \leq L^*
Li−tj≤L∗。又最终分配到机器i的任务j的处理时间
t
j
t_j
tj 满足
t
j
≤
L
∗
t_j \leq L^*
tj≤L∗(引理1)。因此,机器i的负载满足:
L
i
=
(
L
i
−
t
j
)
+
t
j
≤
L
∗
+
L
∗
=
2
L
∗
L_i = (L_i - t_j) + t_j \leq L^* + L^* = 2L^*
Li=(Li−tj)+tj≤L∗+L∗=2L∗
1.2 LPT Rule
LPT Rule算法先将任务按处理时间降序排序(与前面贪心算法的唯一区别),然后将每一个任务依次安排到负载最小的机器。
引理 3:如果任务数量n > m,则最优解的最大负载 L ∗ L^* L∗ 至少为 2 t m + 1 2t_{m+1} 2tm+1,其中 t m + 1 t_{m+1} tm+1 是任务列表中第m+1大的任务处理时间。
考虑前m+1个任务
t
1
,
t
2
,
…
,
t
m
+
1
t_1, t_2, \ldots, t_{m+1}
t1,t2,…,tm+1。由于这些任务按照降序排列,显然每个任务的处理时间至少为
t
m
+
1
t_{m+1}
tm+1。
由于有m+1个任务和m台机器,根据鸽巢原理,至少有一台机器将分配到两个任务。因此,至少有一个机器的负载会达到至少
t
m
+
1
t_{m+1}
tm+1加上另一个任务的处理时间。于是,有:
L
∗
≥
2
t
m
+
1
L^* \geq 2t_{m+1}
L∗≥2tm+1
证明:
设机器i的最终负载为 L i L_i Li。对于最后一个任务 t j t_j tj,根据 LPT 规则,它被分配到负载最小的机器上,因此:$L_i - t_j \leq L^* $
因为 LPT 规则按任务的降序分配,因此最后任务的处理时间
t
j
≤
t
m
+
1
t_j \leq t_{m+1}
tj≤tm+1,又由引理3有
t
j
≤
(
1
/
2
)
L
∗
t_j \leq (1/2)L^*
tj≤(1/2)L∗
L
i
=
{
L
i
−
t
j
}
+
t
j
≤
L
∗
+
(
1
/
2
)
L
∗
≤
(
3
/
2
)
L
∗
L_i = \{L_i -t_j\} + t_j \leq L^* + (1/2)L^* \leq (3/2)L^*
Li={Li−tj}+tj≤L∗+(1/2)L∗≤(3/2)L∗
二、带权值点覆盖
给定一个带权无向图 G=(V,E),每个顶点 v∈V有一个非负权值 w(v)。需要找到一个顶点集合 C⊆V,使得:
- C是一个点覆盖,即对于每一条边 (u,v)∈E,至少有 u∈C 或 v∈C;
- C的权值和 ∑ v ∈ C w ( v ) \sum_{v \in C} w(v) ∑v∈Cw(v)最小。
这是一个经典的优化问题,属于 NP 困难问题
2.1 竞价法
输入:图 G=(V, E),权重向量 w
初始化:把所有的边的价格都初始化为0,
p
e
=
0
p_e=0
pe=0。
迭代定价:在以下条件成立时不断迭代:存在至少一条边e=(i,j),其两个端点i和j均未"紧致"(顶点所有边的价格之和等于顶点的权值)
循环体:选择这条边e,不断的增加它的价格
p
e
p_e
pe,直到其中一个端点变得紧致。
最后把所有紧致的顶点加入到集合 S 中。
返回 S。
首先初始化所有的边的价格为0,然后通过为每条边设置价格,逐步增加价格以支付其两个端点之一的覆盖费用,直到某个端点的累积价格等于其权重(称为“紧致”)。一旦顶点紧致,它就被选入顶点覆盖集合。算法确保所有边都被覆盖,同时总价格不超过顶点覆盖的权重。最终返回的顶点集合是一个权重不超过最优解两倍的近似解,如下图所示。
公平性(Fairness):每个顶点i的所有相邻边支付的总价格不能超过顶点的权重 w i w_i wi,即: ∑ e = ( i , j ) p e ≤ w i \sum_{e =(i,j)} p_e \leq w_i ∑e=(i,j)pe≤wi
引理:对于任意顶点覆盖S和任意满足公平性条件的价格 p e p_e pe,以下不等式成立: ∑ e ∈ E p e ≤ w ( S ) \sum_{e \in E} p_e \leq w(S) ∑e∈Epe≤w(S)
其中:
- w ( S ) = ∑ i ∈ S w i w(S) = \sum_{i \in S }w_i w(S)=∑i∈Swi,表示点覆盖S的权重和。
- ∑ e ∈ E p e \sum_{e \in E} p_e ∑e∈Epe表示所有边支付的总价格。
2倍近似算法的证明:
核心思路:将点覆盖中的顶点的所相邻的边 缩放 到集合V中顶点所相邻的边,然后相当于每条边计算了2次。
2.2 ILP整数规划
整数规划模型:
-
决策变量
用一个 0/1 决策变量 x i x_i xi表示顶点i是否被包含在集合S中:
x i = { 1 如果顶点 i 被选入集合 S , 0 如果顶点 i 未被选入集合 S . x_i = \begin{cases} 1 & \text{如果顶点 } i \text{ 被选入集合 } S, \\ 0 & \text{如果顶点 } i \text{ 未被选入集合 } S. \end {cases} xi={10如果顶点 i 被选入集合 S,如果顶点 i 未被选入集合 S.
决策变量 x i x_i xi是二元变量: x i ∈ { 0 , 1 } , ∀ i ∈ V x_i \in \{0, 1\}, \quad \forall i \in V xi∈{0,1},∀i∈V -
目标函数:
优化目标是最小化顶点集合 S的总权重,最小化被选顶点的总权重: minimize ∑ i ∈ V w i x i \text{minimize } \sum_{i \in V} w_i x_i minimize ∑i∈Vwixi
-
约束条件:
确保每条边e = (i, j)至少有一个端点被选择: x i + x j ≥ 1 , ∀ ( i , j ) ∈ E x_i + x_j \geq 1, \quad \forall (i, j) \in E xi+xj≥1,∀(i,j)∈E。这表示每条边必须被顶点覆盖。
结论:
-
如果 x ∗ x^* x∗是整数线性规划(ILP)模型的最优解,那么集合 S = { i ∈ V : x i ∗ = 1 } S = \{i \in V : x^*_i = 1\} S={i∈V:xi∗=1}是一个最小权重的顶点覆盖。
-
通过顶点覆盖问题的整数规划形式,可以证明整数规划是一个 NP-hard 的搜索问题
2.3 带权顶点覆盖的线性规划 (LP)
点覆盖的整数规划是一个NP难问题,因此我们希望能找到它的近似算法,牺牲准确度以快速求解。为了降低问题的计算复杂度,我们将整数约束 x i ∈ { 0 , 1 } x_i \in \{0, 1\} xi∈{0,1}放宽为连续变量的范围约束 0 ≤ x i ≤ 1 0 \leq x_i \leq 1 0≤xi≤1。得到线性规划模型如下:
LP 和 ILP 的区别:
- 约束松弛:ILP 强制 x i x_i xi为 0 或 1(整数),但 LP 允许 x i x_i xi是[0,1] 区间内的实数。
- 解空间变化:LP 的解空间更大,因为它允许分数解。ILP 的解空间是 LP 解空间的一个子集。
- 最优值关系:LP 的最优值 Z L P ≤ Z I L P Z_{LP} \leq Z_{ILP} ZLP≤ZILP。
通过求解线性规划模型的分数解
x
∗
x^*
x∗,我们可以通过以下方法将其转换为整数解,从而构造一个近似算法。使用 舍入方法 ,将
x
i
∗
x_i^*
xi∗ 转换为整数解
x
i
x_i
xi:
x
i
=
{
1
如果
x
i
∗
≥
1
2
0
否则
.
x_i = \begin{cases} 1 & \text{如果 } x_i^* \geq \frac{1}{2} \\ 0 & \text{否则}. \end{cases}
xi={10如果 xi∗≥21否则.
定理:如果
x
∗
x^*
x∗ 是带权点覆盖问题线性规划(LP)松弛的最优解,则集合
S
=
{
i
∈
V
:
x
i
∗
≥
1
2
}
S = \{ i \in V : x_i^* \geq \frac{1}{2} \}
S={i∈V:xi∗≥21} 是一个点覆盖。同时,这个点覆盖的权重至多是原整数规划(ILP)问题最小权重的两倍。
证明S是一个点覆盖
任取一条边 ( i , j ) ∈ E (i, j) \in E (i,j)∈E,在线性规划的约束中,有 x i ∗ + x j ∗ ≥ 1 x_i^* + x_j^* \geq 1 xi∗+xj∗≥1,表示这条边的两个端点的解的和至少为 1。如果 x i ∗ < 1 2 x_i^* < \frac{1}{2} xi∗<21,则 x j ∗ ≥ 1 2 x_j^* \geq \frac{1}{2} xj∗≥21;同样,如果 x j ∗ < 1 2 x_j^* < \frac{1}{2} xj∗<21,则 x i ∗ ≥ 1 2 x_i^* \geq \frac{1}{2} xi∗≥21。
因此,至少有一个端点满足 x i ∗ ≥ 1 2 x_i^* \geq \frac{1}{2} xi∗≥21,即边(i, j)被集合S覆盖。由此可知,集合S是一个有效的点覆盖。
2倍近似解证明:核心思路是整数规划的最优解大于等于线性规划的解。
设 S ∗ S^* S∗ 是整数规划(ILP)问题的最优解,且其权重为 w ( S ∗ ) = ∑ i ∈ S ∗ w i w(S^*) = \sum_{i \in S^*} w_i w(S∗)=∑i∈S∗wi。
在线性规划松弛中,因为 w ( S ∗ ) w(S^*) w(S∗)是 ILP 的最优值,而 LP 是 ILP 的松弛,有LP 的目标值满足$w(S^) \geq \sum_{i \in S} w_i x_i^ $。
在舍入过程中,集合S包含所有满足 x i ∗ ≥ 1 2 x_i^* \geq \frac{1}{2} xi∗≥21的顶点, w ( S ∗ ) = ∑ i ∈ S ∗ w i ≥ w ( S ) = ∑ i ∈ S w i x i ∗ ≥ 1 2 ∑ i ∈ S w i w(S^*) = \sum_{i \in S^*} w_i \geq w(S) = \sum_{i \in S} w_ix_i^* \geq \frac{1}{2}\sum_{i \in S}w_i w(S∗)=∑i∈S∗wi≥w(S)=∑i∈Swixi∗≥21∑i∈Swi
最后得到: w ( S ) ≤ 2 ⋅ w ( S ∗ ) w(S) \leq 2 \cdot w(S^*) w(S)≤2⋅w(S∗)。
第一个大于等于是因为 整数规划是最优解,线性规划是松弛的,因此整数规划的最优解大于等于线性规划的解。
第二个大于等于是直接将 x i ∗ ≥ 1 2 x_i^* \geq \frac{1}{2} xi∗≥21代入线性规划的表达式中即可。
三、其它题
1.装箱子
2 K着色整数规划
结束语
感谢阅读吾之文章,今已至此次旅程之终站 🛬。
吾望斯文献能供尔以宝贵之信息与知识也 🎉。
学习者之途,若藏于天际之星辰🍥,吾等皆当努力熠熠生辉,持续前行。
然而,如若斯文献有益于尔,何不以三连为礼?点赞、留言、收藏 - 此等皆以证尔对作者之支持与鼓励也 💞。