2017华为算法大赛总结

题目介绍

给定一个网络图,两个网络节点之间存在带宽限制和费用租赁信息。任一网路节点可以当做服务器或者消费节点。给定一部分网络节点为消费节点,消费节点有流量需求。消费节点的流量来自服务器,服务器可以位于任一网络节点。 部署服务器有成本,满足流量也需要成本。求在满足消费节点需求的前提下,成本最小的服务器部署方案。

算法基础

Dijstra算法

一种贪心算法,求一个节点到其他节点的最短路径问题。
使用两个数组进行分别维护前置节点,最短路径。
初始化时,把前置节点都置为-1,最短路径为该节点到其他节点距离。
再使用一个flag数组,标记节点是否已找到最短路径。
每一次寻找到一个flag为flase的数组,对其临近节点进行最短距离更改。
直至所有的节点都为true,则算法结束。

SPFA算法

使用一个优先队列,对节点进行入队。入队时,对节点标记为已访问,出队时,标记为未访问。然后依次对列队中的节点进行出队操作,对每个节点相连接的节点进行松弛操作,如果被松弛节点不在队列中,则进行入队。如果已经在队列中,则更改这个节点数值距离。

优势

SPFA比较适合与稀疏图,速度较快!稠密图使用Dijstra

多源多汇费用流

新建一个超级消费节点,一个超级服务器。每次寻找一条从超级消费节点到超级服务之间的最短路径,即单位流量费用最小的一条路,在这条路上分配流量。分配完成之后,更改各个线路上的流量限制,使用新的网络节点图再次进行最短路径计算,直至消费节点的流量需求全部满足。此时,则求出在满足消费节点需求的前提下的最小费用。

寻找服务器位置与个数

  1. 首先对服务器位置与个数进行初始化。根据题目计算最小成本可得,当某个消费节点需求量较大时,直接把服务器部署在该消费节点,可以省去大量的流量租赁费用。因此,使用贪心算法,对消费节点按流量需求进行从小到大排序。初始化时,把所有消费节点都部署服务器,然后依次减去服务器,当成本减小时,则去掉部署在该位置服务器,如果没有减小成本,则保留在该消费节点的服务器。
  2. 完成初始化后,设计遗传算法进行迭代寻找最佳部署方案,即最小成本。
    初始种群个数为10个,第一步初始化的部署方案作为一个个体放在初始种群中。其余个体进行随机初始化。交叉操作采用单点交叉,交叉概率设为0.8。变异时,随机选取一个部署有服务器的节点,向相邻节点移动。变异概率为0.2。 采用精英保留策略,每次保留2个最优子个体到下一代中。

你可能感兴趣的:(算法)