zoukankan      html  css  js  c++  java
  • 整数规划模型近似求解带权点覆盖问题

    详细内容参考:《算法导论 第二版-中文版》第644页内容

    一,基本介绍

    1,点覆盖问题属于NPC问题,目前还没有多项式时间算法精确地求解该问题。因而,下面介绍了一种近似解法,可以在多项式时间内找到点覆盖问题的一个近似解,该近似解有多么近似呢?最后证明该近似解不会超过精确解的两倍。

    2,点覆盖的定义:

    对于图G=(V,E),点覆盖是由G中的顶点组成的一个集合。该集合中的点关联了图G中所有的边(即,从图G中任取一条边(u,v),该边关联点两个顶点:顶点u 和 顶点v 。则,u、v 中至少有一个在点覆盖集合中)。

    注意:1)点覆盖中的点是可以邻接的。2)点覆盖必须要覆盖图中所有的边。3)最小点覆盖即寻找一个具有顶点数目最少的点覆盖集合

    二,利用线性规划来建模最小带权点覆盖问题

    1,对于图G=(V,E),对图中每一个顶点v belongs to V,定义函数 x(v) belongs to [0,1],且 x(v) = 0表示顶点v不在点覆盖中; x(v) = 1 表示顶点v在点覆盖中。

    2,对图中任一条边(u,v) belongs to E,由点覆盖定义,顶点u、顶点v 至少有一个必须在点覆盖中 ,因此:x(u) + x(v) >=1

    因而得到最小权值点覆盖的规划模型:其中w(v) 表示顶点v的权值。

    而在实际的问题中,x(v)只能取0或者1,这里用 0<=x(v)<=1 替代它,这是可以的。因为:前者是后者的一个特例。前者称为0-1整数规划,后者为普通的线性规划。因此,线性规划中的最优解是0-1整数规划最优解的一个下界(因为线性规划最优解包含了0-1整数规划最优解)。

    而求最小权值点覆盖问题的最优解即为求0-1整数规划问题的最优解,因此,线性规划中的最优解是最小权值点覆盖问题的最优解的一个下界。

    三,用线性规划的解来构造最小权值点覆盖问题的近似解算法

    伪代码参考:《算法导论 第二版-中文版》第645页内容

    对于每一个顶点v,都会求得一个x(v)的值。若,x(v)>=1/2 ,则将该顶点加入到点覆盖集合中,否则舍去顶点v,直至图G中所有的顶点都处理完毕。此时得到的顶点集合C即为最小权值点覆盖问题的近似解的点覆盖集合。

    四,证明第三步中求得的顶点集合C是最小权值点覆盖问题的二倍近似解

    设 C* 是最小权值点覆盖问题的一个最优解,Z 是线性规划的一个最优解, C是最小权值点覆盖问题的近似解

    1)由于最小权值点覆盖问题的一个最优解是线性规划的一个可行解,故:Z<=W(C*)(W为求权值的函数)

    2) 为什么第三步中求得的集合C就是一个点覆盖呢?因为对任意边(u,v) belongs to E,有x(u)+x(v)>=1,即在x(u)和x(v)中至少有一个的值大于1/2。因此,顶点u、v 至少有一个会被加入到集合C中,从而使得图G中的每一条边都会被覆盖。

    3)由:


    及Z<=W(C*)

    知:W(C)<= 2Z <=2W(C*) 即近似解C的权值W(C) 小于等于 二倍最优解C*的权值.

  • 相关阅读:
    Flutter 中那么多组件,难道要都学一遍?
    【Flutter实战】自定义滚动条
    Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
    一篇文章掌握 Python 内置 zip() 的全部内容
    Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
    Python 3.10 版本采纳了首个 PEP,中文翻译即将推出
    Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
    Python 为什么推荐蛇形命名法?
    Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
    Python 为什么不用分号作终止符?
  • 原文地址:https://www.cnblogs.com/hapjin/p/4533016.html
Copyright © 2011-2022 走看看