约束条件下最优化问题

Published: by Creative Commons Licence

  • Tags:

未知数区间约束问题

题目1:给定n个非负未知数x1,,xn,以及m个条件。第i个条件选择一个区间[li,ri]以及一个非负数ci,并要求rij=lixici。在上述约束条件下,我们希望最大化ni=1xi,如果结果是无穷则输出1。其中1n,m106

这个问题可以这样来解决。首先我们可以发现在最优情况下x1一定会取到最大,如果x1未取到最大,则一种情况是x2,,xn都是0,这时候我们可以让x1增加1,这与当前是最优情况相悖。第二种情况是存在一个最小的下标j,满足1<jxj>0,这时候我们让xj减少1,同时让x1增加1,重复这个过程直到x1达到最大为止,可以发现这个过程不会导致任意约束条件被破坏。

因此具体的做法按照下标从小到大处理xi,同时维护一个平衡树,平衡树中按照约束c排序,存储所有覆盖了xi的约束。之后我们选择最小的约束y,并将xi设置为y,并将平衡树中所有约束全部减少y

至于无穷,如果我们发现某个未知数没有被约束,则结果为无穷。

这个做法的时间复杂度为O((n+m)log2m)

题目2:给定n个非负未知数x1,,xn,以及m个条件。第i个条件选择一个区间[li,ri]以及一个非负数ci,并要求rij=lixici。在上述约束条件下,我们希望最小化ni=1xi。其中1n,m106

类似问题1,这个问题也可以贪心解决。首先我们可以发现在最优情况下x1一定会取到最小,如果x1未取到最小,这时候我们让x2增加1,同时让x1减少1,重复这个过程直到x1达到最小为止,可以发现这个过程不会导致任意约束条件被破坏。

这道题目的做法,就是遍历下标,当我们遍历到i的时候,找到所有右边界恰好为i的约束,将xi设置为最大的约束值。这个过程可以通过维护前缀和来优化,总的时间复杂度为O(n+m)

题目3:给定2n个非负未知数x1,,x2n,以及2n个条件。第i个条件要求nj=0xi+j(mod2n)Ai。在上述约束条件下,我们希望最小化2ni=1xi。其中1n1050Ai109

提供一道题目

X=2ni=1xi,很显然如果存在一种方案的总和为X,那么一定存在一种方案的总和为X+1。因此我们可以对X进行二分。

现在求最小值问题,变成了决策问题,给定一个X,判断是否存在一种赋值方案满足条件。

0=s0s1s2n=X,其中si表示x1++xi

这时候我们考虑每个条件的意义

  • in,则对应sn+i1si1Ai
  • i>n,则对应XAisi1si1n

换言之,对于0i<n,都存在这样的约束:Lisi+nsiRi

我们令sn=Y。我们希望找到一组s1sn1sn+1s2n1,满足sn1Y以及s2n1X

我们可以用一个贪心算法来找到最小的sn1s2n1。具体就是让i1遍历到n1。先把si赋值为si1si+n赋值为si+n1,如果不满足条件,有两种可能:

  • si+nsi<Li,这时候令si+n=si+Li
  • si+nsi>Ri,这时候令si=si+nRi

现在令f1(a,b)以及f2(a,b)分别表示当s0=a,且sn=b的时候,通过上面贪心算法得到的最小的sn1s2n1

很显然如果aabb,那么一定有f2(a,b)f2(a,b),因此为了让f2(a,b)X,我们的Y不能超过某个上限H

同理我们令b=0a=Y,这时候可以发现,随着Y的减小,f1(a,b)会不断增大,因此Y不能太小,否则会导致f1(a,b)Y条件被破坏。因此Y不能小于某个下限L

我们只需要检查LH是否成立即可。查找LH都可以通过二分实现。

总的时间复杂度为O(n(log2M)2),其中M=O(max2ni=1Ai)

题目4:给定n个非负未知数x1,,xn,以及n个系数a1,,an,以及m个条件。第i个条件选择一个区间[li,ri]以及一个非负数ci,并要求rij=lixici。在上述约束条件下,我们希望最大化ni=1aixi,其中1n,m104

这个题目非常有意思。首先很显然能想到线性规划

maxni=1aixii,rji=ljxicii,xi0

但是数据量过大,如果直接用单纯形法,存储系数矩阵所需的空间就达到O(nm)级别。

这里顺带一提,由于线性规划有整数解当且仅当系数矩阵是全单模矩阵,恰巧这个矩阵就是全单模的。实际上系数每一行只有0和1,并且所有1都是连续出现的,考虑将其转换为上三角矩阵,可以发现最终得到的矩阵的对角线元素将都是1,因此行列式值只可能是1和-1。

转换成对偶形式

minmi=1ciyii,j,ljirjyjaii,yi0

对偶问题可以用另一种方式来解释:为持续n天的项目招募工人,有m类工人,第i类工人可以从li工作到ri,每个工人的费用为ci,且第j天的工作至少需要aj个工人。

提供一道题目

这个问题并不太好解决。我们可以进一步解释这个问题:为持续n天的项目招募工人,和INF个免费的不带工具的工人。有m类工具套餐,第i类工具可以从li使用到ri,每个工具的费用为ci。目前每天都需要INF个工人带同样数量的工具参加劳作,但是第j天只能免费提供INFaj个工具。现在问要完成项目至少需要多少费用。

这个问题和刚刚提过的问题是等价的,即第j天需要至少提供aj个工具。

而新的问题可以通过网络流来解决,源点向第一天建立一条容量为INF费用为0的边,第j天向次日(第n日向汇点)连容量为INFaj费用为0的边,而工具i则对应从第li日向ri+1日连的容量为INF费用为ci的边。

这个问题可以通过费用流来计算,具体的时间复杂度不知。

还有一种神奇的做法是通过带上下界费用流来解决。具体就是对于第j类工人,我们直接从rj+1lj连一条容量无穷,费用为cj的边,这条边的容量表示具体雇佣多少第j类工人。同时第i天向第i+1天连一条容量为无穷且下界为aj,费用为0的边。

负重问题

题目1:给定n只骆驼,m条桥,骆驼需要经过这些桥。其中第i只骆驼的重量为wi,第i个桥的长度为li,负重为vi。你可以任意调整骆驼的先后顺序,并且为两只相邻骆驼赋予一个距离。现在希望骆驼队伍能顺利通过所有桥的前提下,最小化队伍头部骆驼和尾部骆驼的距离。如果有若干只骆驼之间最大距离小于li,且它们的总重量超过vi,则它们不能通过桥i。其中18n,1m105,1wi,li,vi109

原题

一开始想的是贪心让相邻骆驼距离尽可能接近,利用二分,对于每个排列的时间复杂度为O(nmlog2109),但是可以发现实际上我们可以把二分去掉,时间复杂度为O(nm),但是加上排列后时间复杂度为O(n!nm),这个显然太慢了。

我们可以发现对于排列1,2,,n,如果某个距离分配无法通过,则必定存在一个区间[l,r],以及某条桥i,区间中的骆驼的总距离小于li,但是总重量大于vi。因此如果区间都满足桥的约束,则就能顺利通过所有桥。

事实上虽然m很大,但是可以发现每个区间[l,r]仅存在一个最大的约束条件,而如果通过预处理m条桥(桥的负重越大,长度也越大),我们这里可以O(log2m)得到具体的约束条件。这部分实际上是未知数区间约束问题的第二题,可以在O(n2log2m)时间复杂度内解决。

总的时间复杂度为O(n!n2log2m)

独立集问题

题目1:给定n个点,其中第i个点的位置为(xi,yi),它的权重为wi,要求选择一组点,要求这些点都不同行,也不同列,问最大权重之和为多少。

最简单就是进行位压DP,时间复杂度为O(n2n)。这里可以使用meet in middle技巧,可以优化到O(n2n2)。如果n很小还是不错的。

还可以用最大权拟阵交算法解决这个问题,时间复杂度大致为O(n4)。具体的思路:将x当成一种颜色,我们现在定义独立集为不同颜色的元素组成的集合,可以发现这一定义满足拟阵的要求。对于y同样处理。满足条件的选择一定同时是两个拟阵中的独立集,于是问题就变成了最大权拟阵交。

还可以用最大权二分图匹配解决这个问题。对应到二维点,可以发现每一行最多取一个元素,每一列最多可以取一个元素。建立一个二分图,一侧顶点代表可能的横坐标,一侧顶点代表可能的纵坐标,对于球i,可以对应的加入一条边(xi,yi),其权重为球的wi。可以发现满足条件的一种选择方案与二分图的匹配是一一对应的,因此现在的问题变成了求二分图的最大权匹配。这个用费用流跑的话,可以做到O(n2log2n)

题目2:给定n个点,对于i,j,如果有|ij|=a|ij|=b,则在两个顶点之间连一条边,否则就不连边。要求计算最大独立集的大小。其中1n10181a,b22=M

一道题目

这道题目实际上没有太大价值,但是证明用到的技术很不错。

考虑p=a+b,记r=n(modp)。考虑最优解的二进制表示形式,我们把它划分为长度为rpr交替的序列A1B1A2B2Ak1Bk1Ak。之后我们不妨设AiBi1出现总数最大的连续两个元素(还有可能是BiAi+1,证明方法类似)。之后我们可以很安全的将A1B1,A2B2,,Ai1Bi1替换为多个AiBi,并将Bi+1Ai+2,Bi+2Ai+3,,BkAk+1替换为多个BiAi。此时我们的结果是不会变差的,而且由于Ai+1中的1的数目不超过Ai1的数目,因此我们同时将Ai+1替换为Ai。此时我们可以发现得到了一个不逊色最优解的答案AiBiAiBiAiBiAi

上面的部分证明一定存在一个最优解,其周期为p。接下来我们只需要枚举所有可能的前p个选择。这里我们可以直接用meet in middle来做,时间复杂度为O(M2M),当然更好的方法是发现我们只需要决定前b个元素,后a个元素可以直接贪心选择(这里假设ba),时间复杂度是相同的,也是O(M2M)