【概述】

分数规划的一般形式为:

特别的,当  时,称为 01 分数规划

简单来说,就是有一些二元组 (a[i],b[i]),现在从中选择某些二元组,使得  最大或最小

这一类题通用的解法是利用二分法来解决:

假设 x 为最优解,对应的最优函数值为 λ,那么有:

即:

于是可以构造函数 

当  时,此时 λ 即为最优解

也就是说,当某一个值 λ 满足上述式子的时候,就是要求的值,因此可以直接二分答案:当上述式子 >0,说明答案小了,更改左区间;当上述式子 <0,说明答案大了,更改右区间

double left=0,right=1;
while(left-right<=EPS) {double mid=(left+right)/2;double G=INF;for(int i=1;i<=n;i++) G=min(G, a[i]-mid*b[i]);if(judge(G))left=mid;elseright=mid;
}

【Dinkelbach 算法】

对于 01 规划问题,除了利用基本的二分答案来解决外,还有一个常用的算法:Dinkelbach 算法

Dinkelbach 算法是一种的迭代算法,其核心思想是:对于一个值 λ ,我们找到其最优解 x,然后再用解 x 来代替 λ ,即令 λ=f(x),然后继续迭代,直到 λ 的值不再变动,此时即得出最优解。

double init=0.5;//初始值可随意设置
while(fabs(init-res)>EPS) {res=left;//记录比率for(int i=1;i<=n;i++)//计算函数G G=min/max(G,a[i]-init*b[i]);double p=0,q=0;for(int i=1;i<=m;i++){//计算新比率p+=a[i];q+=b[i];}init=p/q;//更新比率
}

【常见模型】

01 规划问题,除了上述的基本模型外,还有以下三种常见的模型

1.最优比率生成树

1)问题:对于给定的带权无向图 G,对于图中的每条边 edge[i],都有 value[i] 与 cost[i],现在要求一棵生成树 T,使得 最大化或最小化,这个生成树 T,即为最优比率生成树

2)解决:如果一条边 edge[i]∈T,那么 x[i]=1,否则 x[i]=0,因此可以直接套用 01 规划分数模型

二分法:二分答案 mid,对边重赋值 weight[i]=value[i]-mid*cost[i],由于是生成树,因此边的数量固定为 n-1 条,因此如果要最大化,只要选取前 n-1 大的 weight[i],也即求最大生成树,如果要最小化,就求最小生成树,最后按最大生成树的权值正负性进行二分

Dinkelbach 算法:设置初始值 init,对边同样重赋值 weight[i]=value[i]-init*cost[i],对于最大化来说,求最大生成树,找到其边集,对其边集找横截距当作下一次的答案,进行迭代

2.最优比率环

1)问题:给定一个存在环的有向图 G,每个点都有一个权值 value[i],每条边也有一条权值 cost[i],现在要求一个环 C,使得环的 最大化或最小化(在一个环中,点数与边数是相同的),这个环,即为最优比率环

2)解决:

假设答案为 x,那么对于任意一个环

当要最大化时,有:,化简得:

即:

同理,当要最小化时,有:

因此可以直接套用 01 规划分数模型

二分法:设当前答案为 mid,当 mid<x 时,至少存在一个环,使得 ,即存在负权回路;当 mid>=x 时,不存在负环,因此可在利用 SPFA 求负环的过程中对边进行重赋值,从而进行二分,即如果存在负环,即增大下界,若一直不可行,则无解

Dinkelbach 算法:由于使用 Dinkelbach 算法需要在不断迭代的过程中记录负环,实现较为复杂,因此一般在该模型中不采用该方法

3.最大密度子图

`1)问题:给出一个 n 个点 m 条边的无向图,现在要选择一个子图,使得这个子图中边数与点数的比例最大化,这个子图,即为最大密度子图

2)解决:

设 g 为最大比率,若要找一个最大密度子图,那么可以参考 01分数规划的基本模型来构造一个函数 h(g)=|E'|-g*|V'|,当 h(g)=0 时,g 即为最优值

关于两种解法的详细证明参见 胡伯涛的《最小割模型在信息学竞赛中的应用》:点击这里

二分+最大权闭合图:

可以发现,边与点具有依赖关系,即边存在的必要条件是点的存在,那么我们可以将边看作点,根据 g 的值来构建一个新图,即:将原图中所有代表边的点向他的两个端点连接一条有向边

那么可以直观的看出,如果选择一条边,那么这条边的两个端点必然也被选择,也就是一个闭合子图的模型

因此,在二分 g 的过程中,不断的建图来判断 g 的正负从而调整边界即可

void makeMap(double g) {memset(head,-1,sizeof(head));  tot=0;for(int i=1;i<=n;i++)//原图中的点到汇点 addedge(i,T,g); for(int i=0;i<m;i++) {  //源点到原图中的每条边addedge(S,n+i+1,1.0);//原图中的每条边到之间建边addedge(n+i+1,pastEdge[i].first,INF);  addedge(n+i+1,pastEdge[i].second,INF);  }
}

二分+最小割:

设 g 为最大比率,在建图时从源点到各点连接一条容量为 m 的单向边,从各点到汇点连接一条容量为 m+2*g-degree[i] 的单向边,其中 degree[i] 代表第 i 个点的度数,这样以后对这个图求最小割,那么 h(g)=(n*m-maxFlow)/2

因此在二分时,通过 g 值求出的最小割来判断正负,于是根据这个结果的正负就可以修改左右边界,直到达到一个最优值

void makeMap(double g) {memset(head,-1,sizeof(head));  tot=0;for (int i = 1; i <= n; i++) {//原图中的点addedge(S, i, m * 1.0);addedge(i, T, m + 2 * g - degree[i]);}for (int i = 0; i < m; i++) {//原图中的边addedge(pastEdge[i].first, pastEdge[i].second, 1.0);addedge(pastEdge[i].second, pastEdge[i].first, 1.0);}
}

【例题】

  • Dropping tests(POJ-2976)(标准模型+二分解法):点击这里
  • Dropping tests(POJ-2976)(标准模型+Dinkelbach 算法):点击这里
  • Desert King(POJ-2728)(最优比率生成树+二分解法):点击这里
  • Desert King(POJ-2728)(最优比率生成树+Dinkelbach 算法):点击这里
  • Sightseeing Cows(POJ-3621)(最优比率环+二分解法):点击这里
  • Hard Life(POJ-3155)(最大密度子图+最大权闭合图):点击这里
  • Hard Life(POJ-3155)(最大密度子图+最小割):点击这里

分治 —— 01 分数规划相关推荐

  1. 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]

    题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈s​v(e)​ ...

  2. [COGS2652]秘术「天文密葬法」-长链剖分-01分数规划

    秘术「天文密葬法」 题目说明: 路径的长度是点数 所有整数都是正整数 已添加一句话题意 [题目描述] 永琳需要协助紫解决异变! 在某个满月的夜晚,幻想乡的结界出现了异常,虽然目前还没有找到原因,不过有 ...

  3. poj2976(0-1分数规划)

    0-1分数规划 设x[i]等于1或0. 则我们所求的比率 rate = ∑(cost[i] * x[i]) / ∑(cost[i] * x[i]), 0≤i<m . z( rate ) = ∑( ...

  4. 解题报告:AcWing 1165. 单词环(01分数规划、hash、经验优化)

    本题的关键在于: 建图 01分数规划 本题的数据过大,如果直接spfa判断会TLE,因此我们使用经验优化,就是如果所有的点入队的次数过多,比如大于100000,那么我们直接认为它是存在正环的.(免去T ...

  5. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

  6. 【图论专题】负环与01分数规划

    整理的算法模板合集: ACM模板 题目列表: 题目 算法 AcWing 904. 虫洞 spfa判负环 AcWing 361. 观光奶牛 最优比率环.01分数规划 AcWing 1165. 单词环 0 ...

  7. POJ2728 Desert King ——01分数规划Dinkelbach迭代法+最小生成树prim算法

    首先,纪念我用Linux系统AC的第一题-   安装这个万恶的NOI Linux系统费了6小时的时间,不过好在最后终于装上了,但是因为我安装的Linux系统比较烂,还遭到了小花儿和js的鄙视,唉,本人 ...

  8. POJ 2728 01分数规划

    题意: 最优比率生成树,要求生成树中的所有边的花费与所有边的长度的比值最小 题解: 01分数规划,详见http://www.cnblogs.com/proverbs/archive/2013/01/0 ...

  9. codevs1183 泥泞的道路(01分数规划)

    1183 泥泞的道路  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description CS有n个小区,并且任意小区之间都有两 ...

最新文章

  1. python与excel互通_【好消息】Python和Excel终于可以互通了!!
  2. 一图读懂58大数据平台架构演进
  3. “用手机就能访问卫星” 软件定义升级卫星智能
  4. spring aop搭建(2) :基于代码的实现
  5. matlab repmat函数_Matlab向量化编程在二级劝退学科中的一个应用例子
  6. Hostiko v54.0 – WordPress WHMCS-云服务器VPS主机销售模板源码
  7. Multiple methods named 'status' found with mismatched result, parameter type or attributes
  8. .net中的压力测试
  9. 2018年秋计算机应用基础本科,广东开放大学远程教育专科2018年秋计算机应用基础Word模块测试...
  10. python打印json_Python漂亮打印JSON
  11. 揭秘2017双11背后的网络-双11的网络产品和技术概览
  12. rslogix5000pide实例_用RSLogix5000梯形图实现一种高级PID运算
  13. SVN和Git的使用
  14. #Geek Talk# 董飞老师同大家一起聊聊斯坦福创业课程CS183C
  15. Websphere8.5.5安装教程
  16. 烟雨黑帽seo超级模板站群-可一键清除内页URL转换成单页-百度搜狗超级模板站群-多城市网站站群
  17. HTML5期末大作业:北京旅游网页设计制作(1页) 简单静态HTML网页作品 我的旅游网页作业成品 学生旅游网站模板
  18. 【安全知识分享】工程项目夏季、雨季、夜间、防汛施工安全培训教育(附下载)
  19. 国税局发票查验中英文验证码识别最新版,识别率99.9%
  20. 手机放哪里辐射危害最低?

热门文章

  1. 格密码教程(五):Babai‘s algorithm和求解apprCVP算法
  2. 知乎高赞:有哪些你看了以后大呼过瘾的数据分析书?
  3. 人口简史:我们曾经差一点就彻底没了
  4. 书还可以这样做?3分钟扒光这本变态级作品 | 文末有福利
  5. html5(mp4)无法播放,HTML5的Video标签有部分MP4无法播放的问题解析(多图)
  6. 锦官城思享会-成都创业与商业CXO闭门会圆满举办
  7. 【JEECG技术文档】JEECG部门管理员操作手册
  8. JeeWx捷微 2.4.1版本发布,开源JAVA微信管家平台(支持公众号、企业号)
  9. SpringBoot2 集成测试组件,七种测试手段对比
  10. Socket IO与NIO(三)