无线回传拓扑规划(优化算法+并查集+贪心)

背景描述:

为参加2018年9月的研究生数学建模竞赛,组队参加由学校组织的数学建模小组模拟赛。赛题据说是深圳2018年的数学建模比赛。经过讨论,我们最终选择了B题-无线回传拓扑规划。

一开始,我们以为这是一个优化算法+多源多汇的网络流问题,设定虚拟起点和虚拟终点后,就把问题转换为单源单汇问题。虚拟起点连接所有宿主站点,虚拟终点连接所有子站点,并且流量为1。但是在实际处理中,我们遇到了一个难题,最终导致我们放弃使用这种方法:宿主站点最多容纳6个子站点,但最多只能与4个子站点直连,而网络流却没有办法控制连接的节点数。如果最大流量设置为6,那么他就会出现与6个子站点直连的情况,而如果设置为4,那么他就最多只能容纳4个子站点,显然,这是不符合题目设定的。一级子站点到二级子站点所遇到的问题跟宿主站点到一级子站点的问题一样。

尝试考虑最小费用最大流,失败。

与其纠结于如何改变网络流使得其适应题目,不如换个思路。

题目很明显,并不是求一个最优解,只要求一个满足约束的近似最优解就好。第一步的优化算法,已经使得其只能得到一个近似最优解,那我们为何不用贪心算法,找到一个满足约束的近似最优解?可能在某条具体染色体下,确实存在一个可行的拓扑连线,但可能需要消耗更多的时间,包括思考算法的时间、编写算法的时间、运行算法的时间。而使用贪心算法对宿主站点周边进行局部搜索,可能得不到最优的,但无非是多几个宿主站点。贪心局部搜索可以保证得到的解一定是满足约束的可行解。

所以,题目思路:

1.使用遗传算法或类似的优化算法得到一个方案。题目较简单,只需要一个长度为1000的一维数组即可,并且每一维只有0或1两个值,用以表示是否为宿主站点。

2.用局部贪心的思想对方案中的宿主站点周边进行搜索。最近的点最优先于其连接,直到满足一级子站点个数为4或者不存在可行一级子站点;然后搜索二级子站点,方案为以一级子站点为基础,搜索最近的几个子站点,直到满足最多包含6个子站点,每个子站点最多连接一个子站点,没有子站点能与其相连。三级子站点于二级子站点的策略相同。另外,对已经有归属的子站点进行标记,防止其属于多个站点的非法情况出现。

3.因为题目中说:一个卫星最多可以负责8个成片的宿主站点,所以我们对宿主站点进行并查集操作,使得其能连成一片。那么卫星的数量就是 sum((x+7)/8)。

4.因为要输出最后的拓扑结构,所以需要对节点的路径进行标记。对于这块,由于不是问题的主要部分,写的有点随意,宿主站点的标记还需要一个辅助数组,懒得改了。

5.为了保证一定能有一个解,我们可以在初始化GA的时候,手动加入所有站点都是宿主点的方案。

综上,问题被解决了。虽然我们得到的不一定是最优解,但却是一个可行解。在这一题中,我们主要用到了:遗传算法、并查集、贪心。

这个数学建模的题目,有点像本科时参加的ACM。也是很久没有写这样的代码了。

下面是代码和题目描述

问题求解代码

问题描述

你可能感兴趣的:(杂七杂八,模拟题)