zoukankan      html  css  js  c++  java
  • 01分数规划学习

    真的是很差啊,这个东西弄了好久也没看懂。主要是数学比较差的原因吧。

    网上把一些不等式啊啥的略了,我就mengbi了。


    最普通的01分数规划是这样一个基本问题http://poj.org/problem?id=2976。就像这样吧。

    每个物品有一个价值${a}_{i}$,花费${b}_{i}$。要求的是选其中$k$个,使得

      $R=sum frac{{a}_{i}*{x}_{i}}{{b}_{i}*{x}_{i}}$

    最大。

    这里的${x}_{i}$非0即1,表示是否选取该物品。

    我们有一个函数$F(t)=sum ({a}_{i}*{x}_{i})-t imes sum ({b}_{i}*{x}_{i})$,假设我们能在可接受的复杂度内求出是否有一种${x}_{i}$的取值,能使得$F(t)geq 0$。

    由$F(t)$的定义式及$F(t)geq 0$的条件,经过简单的移项可得$sum frac{{a}_{i}*{x}_{i}}{{b}_{i}*{x}_{i}}geq t$

    又由$R$的定义式,上式左边不就是$R$吗?!所以只要存在$F(t)geq 0$,我们就能知道是存在一种${x}_{i}$的取值能让$R$大于等于$t$的。

    显然在满足存在${x}_{i}$使得$F(t)geq 0$的条件下,$t$的取值越大,我们就越逼近$R$的最大值。当我们找不到一种${x}_{i}$的取值能让$F(t)geq 0$时,就说明$R$是不能大于等于$t$的。

    所以得出:当我们找到这样一个$t$,它本身可行但再大一点就找不到${x}_{i}$取值集合能让$F(t)geq 0$,那么可以认为,$t$就是我们要求的$R$的最大值。显然这是可以二分解决的。

    那么问题只剩下了,如何判定是否存在${x}_{i}$取值集合能让$F(t)geq 0$??

    由$sum $的性质,我们求出每个物品的${a}_{i}-t*{b}_{i}$,想让$F(t)$尽量大且只能选$k$个,就选${a}_{i}-t*{b}_{i}$最大的前$k$个,自然就使得$F(t)$最大了!

    问题至此就解决了。二分$t$,每次判定$F(t)$是否可能大于等于0,可以的话提高下界,否则降低上界。结果即所求。

  • 相关阅读:
    对Item中定时器的理解
    ClassLoader类加载机制&&JVM内存管理
    基于Quartz实现简单的定时发送邮件
    基于NIO的Socket通信
    1、svn架设、基本命令
    sysbench基准测试(2)——oltp.lua测试
    sysbench基准测试工具使用
    1、linux软件包管理
    7、数据结构五:sorted sets
    6、数据类型四:sets
  • 原文地址:https://www.cnblogs.com/orzzz/p/7461871.html
Copyright © 2011-2022 走看看