zoukankan      html  css  js  c++  java
  • 0/1分数规划详解

    0/1分数规划学习笔记

    由于模拟赛出了这道题而本蒟蒻对分数规划一无所知,所以痛定思痛地学习分数规划,介绍0/1分数规划的相关知识以及分享本人心中对分数规划的浅薄理解,如有不妥或错误,敬请各路大佬在评论区指正。

    (这是我写的最认真的数学笔记)

    1、0/1分数规划模型

    0/1分数规划模型是指,给定一系列整数(a_1),(a_2)......(a_n)以及(b_1),(b_2)......(b_n),求一组解(x_i)(1leq 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_iin {0,1}),使得上面的式子成立。

    我们随便猜测一个值(A),使得下式成立:

    [sum_{i=1}^{n}({a_i}-Acdot{b_i})cdot{x_i}geq0 ]

    如果存在这样一组解

    那么我们把上式变形得到:

    [(sum_{i=1}^{n}{a_i}cdot{x_i})-Acdot(sum_{i=1}^{n}{b_i}cdot{x_i})geq0 ]

    即:

    [exists{{x_1},{x_2},cdots{x_n}}Rightarrowfrac{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}-Acdot{b_i})cdot{x_i}<0 ]

    那么我们同样可以把上式变形得到:

    [(sum_{i=1}^{n}{a_i}cdot{x_i})-Acdot(sum_{i=1}^{n}{b_i}cdot{x_i})<0 ]

    同理,我们得到:

    [forall{{x_1},{x_2},cdots{x_n}}Rightarrowfrac{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}-Acdot{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}-Acdot{b_i})cdot{x_i})最大化。

    通过刚才的推导,我们发现,针对于这个问题,我们只需要判断这个最大值是否非负即可,所以,我们得出了二分思路:

    实数域(解的可能区间)二分mid,我们取的每一个mid其实是刚刚问题中的(A),也就是说,我们需要计算这个式子的最大值,检查是否非负,如果非负,则右移区间,否则左移。

    求解完毕。

  • 相关阅读:
    Create data packages for the data import in Dynamics 365 Finance and Operations from Invoice PDFs
    Tutorial: Create an ASP.NET Core Blazor WebAssembly app using Microsoft Dataverse
    Tutorial: Register an app with Azure Active Directory
    WPS JSA 宏编程(JS):7.用户窗体
    OSCP Security Technology
    OSCP Security Technology
    select * 和select 1 以及 select count(*) 和select count(1)的区别
    你只会用 map.put?试试 Java 8 compute ,操作 Map 更轻松!
    SpringBoot+Vue实现第三方QQ登录(二)
    SpringBoot+Vue实现第三方QQ登录(一)
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11352092.html
Copyright © 2011-2022 走看看