2017华为软件精英挑战赛解分析

后经在复赛赛题上测试,效果并不好,只适合部分数据集,并且没有理论支持,放出来只为启发——


以下方法初中级样例1s以内,高级样例10s内出最优解——

不随机,无启发式,走优化的方法。采用反馈-迭代的方法逼近最优解


贴上在各算例上的运行时间以及结果【基本上迭代个10几次就收敛了】
2017华为软件精英挑战赛解分析_第1张图片
**一开始是为吸引下注意其实不是最优解是近似最优解

程序运行过程中截图
2017华为软件精英挑战赛解分析_第2张图片


思路

改图——

设置超级源超级汇。源点和所有节点相连,带宽无穷大,cost待定;汇点和所有消费节点相连,带宽为消费需求,cost为0。则问题变成单一源到单一汇点的最小费用流问题。

至于在哪设服务器,在不想做服务器的地方,其实只要把源点到该点的连接cost改成特别大,在求最小费用流时算法自然不会考虑该条路径,即,不会把该节点当成服务器。这样离散问题就变成了连续问题

问题是服务器要摆哪。

*我们把服务器架设费用换成连接的cost。假设 P点设一服务器,服务器架设费用 c,在求得的最小费用流实际方案中,源到P点流量 f【以下”流量”都是说的超级源到某一点的流量】,那么按道理源到 P的那条连接的cost一开始该设成 c/f ,就可以不用单独考虑服务器架设费用。就按这个思路,对于任意一个节点,先预测假如把他作为服务器的可能流量,计算源点到该点连接的cost=c/f ,然后求最小费用流,然后根据实际流量调整一开始预测的流量,然后再求最小费用流,,,*

梨子——

假如一网络拓扑如下、节点 1和 节点3是消费节点,则改图加上超级源s 超级汇t之后的网络如下图
2017华为软件精英挑战赛解分析_第3张图片

假设节点 1需求为 7,节点 3需求 1
不考虑带宽,把cost当成距离,各点的流量假设就让他只满足离他最近的那个消费节点的须要,则各点预测流量如下
2017华为软件精英挑战赛解分析_第4张图片

再假设服务器架设费用280
计算一开始 s到各点的连接 cost如下
cost[s-1]=280/7=40, cost[s-2]=40, cost[s-3]=280, cost[s-4]=280, cost[s-5]=280

然后就是计算最小费用流以及根据实际求得的流量调整预测值以及相应的 cost了,,


*来自我吹一波^0^,这样的求法可以保证每一次出来都是可行解【没有删路径只是改了源到某个点的cost】,不像概率变异的方法在不是解的地方浪费大量时间,服务器个数以及位置会在迭代过程中动态调整,将一个离散问题换成一个连续性问题,使迭代优化的方法成为可能,,
至于迭代为啥会收敛,,,嘿嘿,,你猜,,


算法步骤

do{

一、预测各点流量

暂抛开带宽限制,把cost看成是距离,简单起见,就假设一个点就只给离自己最近的消费节点提供流量,且是提供满足其所需的流量,够简单把?
按照预测的流量计算源到各个点的cost

二、求给定方案下的最小费用流

【一大波现成的算法正在赶来】

三、调整预测值

比如你算出来最终是从源到点 T上有流量1【点 T被设为服务器】,流量为 f1,设一开始预测的流量为 f0, 只要令 f0=f1, 同时记得调整相应的连接的cost。

注意:只修改被当成服务器的那些点,其他点的连接上的预测值保持不变。

}while();


代码块

哪天开心了会放在这的

以下是废话

你问我们队现在在哪呢,还能在哪,淘汰了呗【可惜了这么牛B的方法】
4月初才开始参赛,u盘坏了、网络断了、输出格式不对程序提交一直result error,烦,

注意:【我就喜欢有耐心看到最后的】为了使服务器趋于集中【而不是每个消费节点一个】,在最小费用流的计算过程中,如果实际的流已经大于预测值了,则源到该点的cost置为0,【这样算法就更倾向于继续选则流量从这个点走】。
迭代渐进的方法其实有个缺点,就是容易陷到沟里【局部极小值】。想办法扰动他一下,叫他跳出来


  1. 你看不到我你看不到我. ↩

你可能感兴趣的:(2017华为软件精英挑战赛解分析)