0/1分数规划详解

0/1分数规划学习笔记

由于模拟赛出了这道题而本蒟蒻对分数规划一无所知,所以痛定思痛地学习分数规划,介绍0/1分数规划的相关知识以及分享本人心中对分数规划的浅薄理解,如有不妥或错误,敬请各路大佬在评论区指正。

(这是我写的最认真的数学笔记)

1、0/1分数规划模型

0/1分数规划模型是指,给定一系列整数\(a_1\),\(a_2\)......\(a_n\)以及\(b_1\),\(b_2\)......\(b_n\),求一组解\(x_i\)\(1\leq i \leq n\)\(x_i=0 |1\)),使得下式最大化。

\[\frac{\sum_{i=1}^{n}{a_i}\cdot{x_i}}{\sum_{i=1}^{n}{b_i}\cdot{x_i}} \]

这里有一个误区(是我存在过的误区),就是0/1分数规划的\(x_i\)值是恒定的,也就是说,针对于上式,不存在分子的\(x_i\)为0而分母的\(x_i\)得1的情况。而必须是同时得0或同时得1.

所以我们会发现,这个模型可以这样去理解:

给定长度相等的两个数列(即若干对整数\(a_i\),\(b_i\)),从中选出若干对,使得选出的数对的\(a\)之和和\(b\)之和的商最大。

这个模型很重要!!!

2、针对0/1分数规划模型的推论

我们在考虑解决0/1分数规划问题的时候,其实就是在找一组解{\(x_1,x_2,x_3,\cdots x_n\)},\(x_i\in {0,1}\),使得上面的式子成立。

我们随便猜测一个值\(A\),使得下式成立:

\[\sum_{i=1}^{n}({a_i}-A\cdot{b_i})\cdot{x_i}\geq0 \]

如果存在这样一组解

那么我们把上式变形得到:

\[(\sum_{i=1}^{n}{a_i}\cdot{x_i})-A\cdot(\sum_{i=1}^{n}{b_i}\cdot{x_i})\geq0 \]

即:

\[\exists\{{x_1},{x_2},\cdots{x_n}\}\Rightarrow\frac{\sum_{i=1}^{n}{a_i}\cdot{x_i}}{\sum_{i=1}^{n}{b_i}\cdot{x_i}}\geq A \]

也就是说,这个设出来的值\(A\)要比我们所求的最大值小

如果我们存在任意一组解使得下式成立

\[\sum_{i=1}^{n}({a_i}-A\cdot{b_i})\cdot{x_i}<0 \]

那么我们同样可以把上式变形得到:

\[(\sum_{i=1}^{n}{a_i}\cdot{x_i})-A\cdot(\sum_{i=1}^{n}{b_i}\cdot{x_i})<0 \]

同理,我们得到:

\[\forall\{{x_1},{x_2},\cdots{x_n}\}\Rightarrow\frac{\sum_{i=1}^{n}{a_i}\cdot{x_i}}{\sum_{i=1}^{n}{b_i}\cdot{x_i}}< A \]

也就是说,这个设出来的值\(A\)要比我们求的最大值大。

所以,通过以上的论述,我们发现,我们所求的最大值,其实可以用二分答案来实现,事实上,这的确也是0/1分数规划的最常见、最常用的实现方式。

3、0/1分数规划的实现

刚刚我们已经说过,0/1分数规划的最常见、最常用的实现方式是二分答案,联想到二分算法,我们能够想出,二分答案的精髓和难点在于判断函数check()的书写,那么针对于二分答案解决0/1分数规划,我们能够通过刚刚的推导发现,我们只需要判断“是否存在一组解满足\(\sum_{i=1}^{n}({a_i}-A\cdot{b_i})\cdot{x_i}\geq0\)”,并由此得到应该向上拓展答案区间还是向下拓展答案区间。

所以,我们把原问题转化为:给定\(a_1\),\(a_2\)......\(a_n\)\(b_1\),\(b_2\)......\(b_n\)\(A\),求一组解:\(x_1,x_2,x_3,\cdots x_n\),使得\(\sum_{i=1}^{n}({a_i}-A\cdot{b_i})\cdot{x_i}\)最大化。

通过刚才的推导,我们发现,针对于这个问题,我们只需要判断这个最大值是否非负即可,所以,我们得出了二分思路:

实数域(解的可能区间)二分mid,我们取的每一个mid其实是刚刚问题中的\(A\),也就是说,我们需要计算这个式子的最大值,检查是否非负,如果非负,则右移区间,否则左移。

求解完毕。

posted @ 2019-08-14 15:13  Seaway-Fu  阅读(1506)  评论(0编辑  收藏  举报