华为软件精英挑战赛总结

赛题连接:http://codecraft.huawei.com/home/detail


总体来看,是一个NP-hard问题。我们队的解题思路是:


1)随机选取服务器的位置,用遗传算法寻优,那么遗传算法中的判断算子就是第二步

2)在服务器位置固定的情况下,利用最小费用最大流算法计算总费用。该算法思路详见http://blog.csdn.net/u011686226/article/details/17411067

     其中求带负权有向图最短路,用到了FPGA算法,其实就是Bellman-Ford算法的队列改进型


遗传算法:模范自然界的生物进化,不断迭代。第一代需要选择种子,然后每一代进行交叉,变异、选择。迭代停止的条件可以是迭代代数,花费的时间和解是否收敛。

其中选择算子就是求最小费用最大流函数。费用越高,存活机会越低。ps: 当时为了提高收敛速度,采用轮盘赌的方式增大优秀种子的存活数。导致快速收敛到局部最优。还不如按照高矮个排序。队友深恶痛绝的轮盘赌啊

求最小费用最大流:

       前提:1)假设服务器位置已经定了

                  2)假设所有消费节点都连接到一个超级源点,费用权重为0,即流量流过这些边不花钱。带宽为所连接消费节点的流量需求;   所有服务器都连到超级汇点,带宽无限大,费用也为0; 这样,本题就转化为求单源点到单汇点的最小费用最大流问题了。

有了上述前提,操作步骤是:

       1)读到赛题数据后,建立邻接表。由于是双向都可以通过流量,带宽相同。因此每一条无向边,在邻接表中建立两条边。

       2)利用EK(最小费用最大流)算法,求最小费用最大流,如果最大流小余所有消费节点流量需求之和,则返回-1,负责返回费用。

下面给出程序架构框图:



你可能感兴趣的:(华为软件精英挑战赛总结)