BR-MTC问题的多项式时间近似解算法框架发展过程

BR-MTC(Budgeted rooted maximum tree cover) 问题是带权值有根的最大树覆盖问题。输入为一个无向图,一个权值B,一个根节点R,输出为一棵包含根节点R,边的权值之和不超过权值B的覆盖最多顶点的树。

首先我们可以考虑到,权值B的大小应该是有限的,一般不会超过这张图最小生成树的耗费,否则,可以直接输出最小生成树。

在经过了之前几篇论文的学习之后,我们意识到进度有些缓慢,而且时间有限,因此开始了我们这个问题算法的研究。

首先,因为这个问题是个NP难问题,我们是采用了暴力搜索的方式获取最优解用于比较。

然后在讨论的时候,在思考局部搜索和prim的时候,想到了一个基础的算法框架。
算法过程如下
以每个点i为根节点,使用prim算法,将得到边加入E_i,当边的权值之和大于B的时候停止。这个时候,可以获得对于每个节点的簇。
以i为源点,根节点r为目的点,获取一条从i到r的最短路径。保存到E_ir中。现在就有两个集合E_i和E_ir,比较集合E_i和E_ir,首先保留重复的边,对于出现在E_ir中但是没有出现在E_i中的边,用E_i中的去掉了重复边之后权值最大的边来代替。将E_ir中的非重复边的权值求和,然后用E_i中的权值较大的边来代替。

1.需要代替的边的权值>E_i中可以被代替的边的权值,那么,这个时候说明在预算B的限制下,点i和根节点r无法形成通路,设i‘为i和r的连通路径的上一个节点,那么,从点i开始删边,也就是删掉边ii’,看是否能够加入通路的边。一直往上删。

2.需要代替的边的权值<=E_i中可以被代替的边的权值。这样,首先是可以形成i到r的联通路径。同时可能会还包含了一些联通路径之外的点。

这样就形成了一条包含节点r的树,这棵树未必包含源点i,但是是在源点i的附近进行了局部搜索的。i和i附近的点形成的搜索重合的可能性很大。
形成的解不是最优解。
在这里插入图片描述
绿色边是最短路径,红色边是缺失边,蓝色边是簇的边。

在这里插入图片描述
这是当天晚上的算法框架。因为是凌晨想出来的,讨论到了两点。

第二天,我们重新捋了一遍之后,发现,先prim再找最短路径再补边的方式很累赘。可以直接先采取求根节点r到任意一个点的i的最短路径,然后权值不足以找最短路径的话,就舍弃这个点,如果足够,就在点i的附近以剩余的权值使用prim算法。

后面我们发现,这其实是斯坦纳树的一种特殊情况。以r为根的prim相当于require节点(也就是必须经过的节点)为1个点的情况。而我们后来提出的算法,是斯坦纳树中require节点为2的情况,也就是根节点r和节点i是必经的节点。斯坦纳树问题也是一个np难问题,但是在这种特殊情况下,是可以用kruskal+prim算法在多项式时间内解决的。

算法的进一步优化。在计算根节点r到顶点i的最短路径的时候,可以保留中间经过的节点,当得到最短路径的时候,我们也得到了一部分的联通路径的点,以这部分的点来做prim,会比以点i来做prim更优一点。

代码目前还有一些问题,内部的逻辑在出现一些特殊情况的时候会出现bug,不过也得到了一些图。还在继续修改中。
这是目前可以得到的结果。
在这里插入图片描述

下面这个链接是我们组最终的解决方案,供参考。
创新实训团队记录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值