0/1分数规划详解

本文深入探讨了0/1分数规划模型,介绍了其基本概念、推论及实现方法。通过对分数规划的理解,将问题转化为求解特定条件下的最优解,并采用二分法寻找最大值。适用于算法竞赛和优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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\),也就是说,我们需要计算这个式子的最大值,检查是否非负,如果非负,则右移区间,否则左移。

求解完毕。

转载于:https://www.cnblogs.com/fusiwei/p/11352092.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值