01分数规划——Dinkelbach算法

这个算法说难,理解难,说简单,方法简单。

这个算法核心思想是用一个解去推出更优的解,用迭代来实现。

1. 我们对于一个解 r ,可以求出这个解对应的最优的所有 xi 。

2. 用这个 xi 来求出所有 xi 对应的最优解。

3. 判断是否为全局最优解(如果这个解是最优,那么他与上一个求出来的解相等),是则退出循环,否则回到1。

下面我们用一个样例说明一下:

原题:poj2976

我们要从下面4组数中取出3组数,使取出的 r=(∑ai)/(∑bi) 最大

a:3, 2, 4, 1

b:5, 3, 4, 2

先随意取 r=0.5 。

得 c:0.5, 0.5, 2, 0 ( ci=ai-bir ,至于原因看开头提到的那个博客)

排序得 c:2[3], 0.5[1], 0.5[2], 0[4] (方括号内的是在没排序前的下标,也就是各自的 i )

我们取 c 的前3个的 p=∑ai=9, q=∑bi=12 。

那么就得到新的解 r'=9/12=0.75 。

因为和上一个不相等,所以继续。

r=r'=0.75

c:-0.75, -0.25, 1, -0.5

c:1[3], -0.25[2], -0.5[4], -0.75[1]

p=7, q=9, r'=0.77...78

不等于,再重复一次。

r=r'=0.77...78

c:-0.88...89, -0.33...3, 0.88...89, -0.55...56

c:0.88...89[3], -0.33...33[2], -0.55...56[4], -0.88...89[1]

p=7, q=9, r'=0.77...78

现在我们发现等于了!那么终止循环,而0.77...78就是最后的结果。

参考博客

算法学习:分数规划_lvzelong2014的博客-CSDN博客_dinkelbach算法

C语言中qsort排序(数字、字符串、结构体多级排序详解及举例子)_徐不可说的博客-CSDN博客_qsort多级排序

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值