2018华为软件精英挑战赛-模拟退火算法

2018年的华为软件精英挑战赛题目简介:给出华为云虚拟机过去的租借数量历史数据,用以训练模型并预测下一个时间段里的虚拟机租借数量,然后把这些预测得到的虚拟机装填进一定规格的物理机中,即分为预测和装填两个部分。

 

总结一下装填部分使用的模拟退火算法:

算法原理

装填的基础算法是FF(首次适应算法),而虚拟机的序列会影响FF算法的装填效果。比较明显的是FFD把序列降序之后再使用FF算法往往效果更好。而模拟退火算法目的就是获得一个较好的序列。

模拟退火的基本原理就是设置一个初始温度、一个最低温度,一个降温速率。例如初始温度取100,最低温度取1,降温速率取0.9 。则温度迭代从100开始,每次迭代都使当前温度变为0.9T,直至到达1为止。

每次迭代都随机交换虚拟机序列中的任意两个元素,然后用这个序列进行FF装填,得到一个评判分数J_cur,而设当前记录的最优分数为J_min(评判分数=目前使用物理机数-1+最后一个物理机的资源占有率,因此分数越低越好)。设dE=J_cur-J_min,

如果dE<=0,即当前分数更小,装填效果更好,则接受这个序列

如果dE>0,即当前分数更大,装填效果更差,则按一定几率接受这个序列

这个几率的公式为:

是一个负数,随着T的降低,减小,则exp()也减小。

就是说温度越低,接受这个不合格的序列的可能性越低。这样的目的是让迭代前期接受更多不合格序列以期脱离局部最优,而迭代后期接受更少不合格序列以得到最优方案。

每次迭代都设一个0到1之间的随机数rand,用以跟P对比,如果P>rand,则接受这个方案。

迭代初期,由于T比较大,P趋近于1,因此很大概率会接收这个不合格方案,而迭代后期T比较小,P趋近于0,因此很大概率不接受这个方案。

如下图,蓝线为P、橙线为rand、灰线为P-rand。

 

可见随着迭代次数的增加,灰线会慢慢的变得小于0

而上图其实并不严格遵循公式,如果严格遵循,则效果如下:

 

可见P一直都很大,这样无论迭代多少次,都会一律接受这些不合格的方案,也就相当于随机序列了。原因是dE这个数值太小了,无论T怎么变化都没有用,所以我加了一个参数进去:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值