很遗憾这次比赛止步于区域64,这里放上我们使用的算法源码。
思路:遗传算法+最小费用最大流
遗传算法用的是最简单的单点交叉,多次变异(测试过程中我们发现多次变异会提高更优解出现的速度)。最小费用最大流最初用的是构造剩余图的方法, 具体代码见SDK-gcc\cdn\MinimumCostMaximumFlow.h,这里我们参考了《网络流优化高效只能算法及其应用》(谢凡荣 著),但是由于该方法使用二维数组 保存图,完成一次路径搜索需要n^3,所以针对几十个节点的图效果尚可,但对几百个点的图,运行很慢,不得已我们换了算法。新的费用流算法是参考的是《用 对偶原理求解最小费用流的一种新算法》这篇论文,并对其做了些许改进,进一步加快了算法运行的速度,在配置为4G内存,4核,3.2GHz的主机上部署一个虚拟机, 系统为Ubuntu,800个节点的网络每分钟可以运行28次费用流,相对来说运行速度还是可以的,代码见SDK-gcc\cdn\couplemcmf.h。
我们的代码主要还是针对华为的比赛来写,包括构建虚拟源点、虚拟汇点等,比赛的题目描述也上传了,如果有需要,可以根据题目描述,对应的修改代码。
最终版本是hw_competition_final