[转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环
01分数规划
前置技能
二分思想
最短路算法
一些数学脑细胞?
问题模型1
基本01分数规划问题
给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此二元组获得的价值(非负),costicosti是选择此二元组付出的代价(非负),设xi(xi∈{0,1})xi(xi∈{0,1})代表第ii个二元组的选与不选,最大(小)化下式
maximize(or minimize) r=∑valuei⋅xi∑costi⋅xi
maximize(or minimize) r=∑valuei⋅xi∑costi⋅xi
下面先说最大化
解决方法
二分法
设rr最大值为r∗r∗,
r∗=∑valuei⋅xi∑costi⋅xi
r∗=∑valuei⋅xi∑costi⋅xi
∑valuei⋅xi−r∗⋅∑costi⋅xi=0
∑valuei⋅xi−r∗⋅∑costi⋅xi=0
设一个函数,自变量为rr值,
f(r)=∑valuei⋅xi−r∗⋅∑costi⋅xi
f(r)=∑valuei⋅xi−r∗⋅∑costi⋅xi
观察这个函数,假如{xi}{xi}固定,则这个函数就是坐标系中一条直线(y=B−A⋅xy=B−A⋅x),每一组{xi}{xi}对应着一条直线,这些直线斜率非正(因为−A=−∑costi⋅xi≤0−A=−∑costi⋅xi≤0),纵截距非负(因为B=∑valuei⋅xi≥0B=∑valuei⋅xi≥0 ),如图1。

对于每一条直线,当f(r)=0f(r)=0时,横截距就是这一组的rr,那么r∗r∗就是每条直线横截距的最大值(每组{xi}{xi}对应rr的最大值)如图2。

在图中上任取一条垂直xx轴的竖线,
如果存在直线与这条竖线的交点纵坐标为正,那么最优值一定在当前竖线的右侧;
如果所有直线与这条竖线交点纵坐标为负,那么最优值一定在当前竖线的左侧;
如果所有直线与这条竖线交点纵坐标非正且存在直线与这条竖线交点纵坐标为0,那么当前竖线横坐标即为最优值r∗r∗。

按照这个思想,可以二分答案rr,那么二分时如何进行判断呢?
选择一个rr时需要判断所有f(r)f(r)的最大值是否为0,如果max{f(r)}>0max{f(r)}>0则r<r∗r<r∗;如果max{f(r)}<0max{f(r)}<0 则 r>r∗r>r∗。
怎样求max{f(r)}max{f(r)}?
f(r)=∑valuei⋅xi−r⋅∑costi⋅xi=∑(valuei−r⋅costi)⋅xi
f(r)=∑valuei⋅xi−r⋅∑costi⋅xi=∑(valuei−r⋅costi)⋅xi
二分一个rr时,每个二元组的valuei−r⋅costivaluei−r⋅costi 都可以求出,设其为weightiweighti,现在的目标就是找到一组{xi}{xi}使得∑wighti⋅xi∑wighti⋅xi最大(即求max{f(r)}max{f(r)})。怎么找到这一组{xi}{xi},或者直接求得max{f(r)}max{f(r)}呢?具体问题具体分析,经常借助最短路算法判断是否存在负环。下面会有几道例题。
01分数规划还会与其他问题结合,如网络流等。
DinkelbachDinkelbach算法
这个算法我是在写这篇文章时才知道的。
思考上述二分算法的思路,设二分过程中某一个二分值为rr,二分时的判断条件是max{f(r)}max{f(r)}的正负性,而这个rr除了让LL右移或者RR左移就没有用了。现在思考某一过程中rr与max{f(r)}max{f(r)}能否再被利用。
二分时,假如max{f(r)}>0max{f(r)}>0这说明最优解在当前rr的右侧,于是让L=rL=r,但是,如果将LL移动到max{f(r)}max{f(r)}对应直线的横截距呢?显然,算法会变得更快。这个思想就是DinkelbachDinkelbach算法的内涵。
DinkelbachDinkelbach实质上是一种迭代算法,基于这样的思想:不去二分答案,而是先随便给定一个答案,然后根据更优的解(max{f(r)}max{f(r)}对应直线的横截距)不断移动答案,逼近最优解。理论上它比二分快些。
在这个算法中,一般将rr初始化为00。
再说最小化
看上面的图,也很好理解,就是最左边的rr为r∗r∗,当前的rr确定时需要用到min{f(r)}min{f(r)}。
如果min{f(r)}>0min{f(r)}>0,那么r<r∗r<r∗;
如果min{f(r)}=0min{f(r)}=0,那么r=r∗r=r∗;
如果min{f(r)}<0min{f(r)}<0,那么r>r∗r>r∗。
做题时认清哪个是valueivaluei,哪个是costicosti,再记住上面几张图,基本不会出错了。
两种算法的比较
DinkelbachDinkelbach算法的弊端就是需要保存解。这两个算法解决统一问题实际上都有可能快些。
我觉着我一般还是用二分。。。。
例题
[POJ2976]Dropping tests
问题模型2
最优比率生成树
带权无向图GG, 对于图中每条边eiei, 都有valueivaluei和costicosti,现在求一棵生成树TT,最大(小)化∑valuei∑costi,ei∈T∑valuei∑costi,ei∈T
解决方法
套用01分数规划模型,如果ei∈Tei∈T则xi=1xi=1否则xi=0xi=0。
二分法
二分答案rr,边赋值weighti=valuei−r⋅costiweighti=valuei−r⋅costi,因为是生成树,边的数量确定,那么max{f(r)}max{f(r)}需要选取前|G|−1|G|−1大的weightiweighti,也就是求最大生成树,按最大生成树权值的正负性就可以二分了。最小化就求最小生成树。
DinkelbachDinkelbach算法
当前答案rr,边赋值weighti=valuei−r⋅costiweighti=valuei−r⋅costi,同样求最大生成树,找到max{f(r)}max{f(r)}对应的边集{xi}{xi},也就是最大生成树的边集。对这个边集找横截距当做下一次答案。横截距是啥呢?
f(r)=B−A⋅rrr=0=B/A=∑valuei⋅xi∑costi⋅xi
f(r)=B−A⋅r=0r=B/Ar=∑valuei⋅xi∑costi⋅xi
最小化就求最小生成树。
例题
[POJ2728]Desert King
问题模型3
最优比率环
给定有点权和边权的图,求一个环,使得环的点权和与边权和的比值最大。
解决方法
套用01分数规划模型,点权为valueivaluei,边权为costicosti,一个环为CC
问题要求最大化∑valuei∑costi,(i∈C)∑valuei∑costi,(i∈C)
边数和点数是相同的,但上述式子表述不是很正确,意会即可。
若答案为r∗r∗,那么任意一个环
∑valuei∑costi∑valueir∗⋅∑costi−∑valuei≤r∗≤r∗⋅∑costi≥0
∑valuei∑costi≤r∗∑valuei≤r∗⋅∑costir∗⋅∑costi−∑valuei≥0
最小化时
∑valuei∑costi∑valuei∑valuei−r∗⋅∑costi≥r∗≥r∗⋅∑costi≥0
∑valuei∑costi≥r∗∑valuei≥r∗⋅∑costi∑valuei−r∗⋅∑costi≥0
二分法
设当前答案rr,
r<r∗r<r∗,至少存在一个环,r⋅∑costi−∑valuei<0r⋅∑costi−∑valuei<0,即存在负权回路(将边权设为r⋅costi−valueir⋅costi−valuei,不是提前算出,而是在更新路径的时候从哪个点访问到这条边的就将这条边设为相应点权与边权的对应值);
r≥r∗r≥r∗,则不存在负环。
求负环可以用Bellman-Ford,但是比较慢,一般用spfa算法求负环
具体判断方法为,一个点不能入队nn次,否则有负环;一条最短路径长度不能到nn,否则有负环。两个判断方法可以同时使用。
最小化时边权设为 ∑valuei−r⋅∑costi∑valuei−r⋅∑costi即可,同样也是更新时算出此值。
以上具体实现看例题。
DinkelbachDinkelbach算法
如果用这个算法需要记录下来一个负环,实现还是能实现的,但是没有二分+spfa好写。
例题
[POJ3621]Sightseeing Cows
---------------------
作者:tianxiang971016
来源:CSDN
原文:https://blog.csdn.net/hzoi_ztx/article/details/54898323
版权声明:本文为博主原创文章,转载请附上博文链接!
[转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环的更多相关文章
- 【poj 2976】Dropping tests(算法效率--01分数规划 模版题+二分){附【转】01分数规划问题}
P.S.又是一个抽时间学了2个小时的新东西......讲解在上半部分,题解在下半部分. 先说一下转的原文:http://www.cnblogs.com/perseawe/archive/2012/05 ...
- 2018年东北农业大学春季校赛 I wyh的物品【01分数规划/二分】
链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...
- 【题解】 [HNOI2009] 最小圈 (01分数规划,二分答案,负环)
题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除 ...
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
- 【learning】01分数规划
问题描述 首先分数规划是一类决策性问题 一般形式是: \[ \lambda=\frac{f(x)}{g(x)} \] 其中\(f(x)\)和\(g(x)\)都是连续的实值函数,然后要求\(\lambd ...
- POJ 2728 Desert King (01分数规划)
Desert King Time Limit: 3000MS Memory Limit: 65536K Total Submissions:29775 Accepted: 8192 Descr ...
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
- [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)
题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...
- 01分数规划问题(二分法与Dinkelbach算法)
链接 前置技能 二分思想 最短路算法 一些数学脑细胞? 问题模型1基本01分数规划问题给定n个二元组(valuei,costi),valuei是选择此二元组获得的价值(非负),costi是选择此二元组 ...
随机推荐
- Activiti学习之 多实例实现会签功
转: Activiti学习之 多实例实现会签功能 2014年11月26日 11:27:11 程诺 阅读数:26185 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- C/C++ exception类
#include <iostream> #include <iomanip> #include <string> #include <sstream> ...
- Scala进阶之路-为什么要学习Scala以及开发环境搭建
Scala进阶之路-为什么要学习Scala以及开发环境搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近人工智能和大数据那是相当的火呀,人工智能带动了Python的流行,区块 ...
- CSS currentColor研究
刚刚写了篇<CSS变量试玩儿>,我们了解到可以使用原生的CSS来定义使用变量,简化CSS书写.优化代码的组织与维护,但可怕的兼容性问题,又让我们望而却步.一笑了之. 但是有这么一个CSS变 ...
- python 基础知识 列表的 增删改查 以及迭代取值
""" python 列表 通用方法 元组.数组.字典 取值方法 [] 列表中可以存储不同类型的数据 函数 封装了独立的功能可以直接调用 函数名(参数) 方法 和函数类似 ...
- 20155328 2016-2017-2 《Java程序设计》第六周 学习总结
20155328 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 根据不同的分类标准,IO可分为:输入/输出流:字节/字符流:节点/处理流. 在不使用Inpu ...
- 第9月第26天 pairs和ipairs cocos2dx 动画
1. a={ ip = "127.0.0.1", port = 6789 } for i,v in pairs(a) do print(i,v) end a={1} for i,v ...
- Markdown基础教程
标题 Markdown支持6种级别的标题,对应html标签 h1 ~ h6
- aliyun EC2配置利用filezilla配置ftp服务
项目需要在阿里云EC2虚拟主机上配置ftp服务器,看了阿里云的教程可以使用filezilla配置,但一直遇到了一些问题.现记录一些步骤,避免以后出现类似问题. 1安装filezilla server ...
- 用《舌尖2》去理解C#中的多态和开闭原则
昨天晚上看了<舌尖上的中国2>第一集,特别的感人,尤其是看到帮别人割麦子的麦客,一亩地开价200,雇主只肯给100,脸上的那种纠结和无可奈何.还有长着大眼睛的跳跳鱼,很可爱,不过最终还是被 ...