华为软件精英挑战赛总结

赛题连接: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,负责返回费用。

下面给出程序架构框图:



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值