挑战建立信号基站问题成功,下面说说具体的想法。
模拟退火法其实很简单,分如下几步:
1、首先确定评价函数。
2、选取初始点,并用评价函数计算初始值,把初始值作为当前值。
3、按步进规则获取新点
4、计算新点的值(也可能是附近的多个值)。
5、比较新值和当前值差距,如果小于预期,执行步骤6,否则按一定概率执行步骤6。
6、那么取把新值作为当前值,新点作为当前点,执行步骤3。
7、更新步进值,执行步骤3。
首先说评价函数,在这个问题中,即为选取点到所有基站的距离和。在这里说一下,网上不少人用欧式空间距离,即sqrt((x1-x0)*(x1-x0),(y1-y0)*(y1-y0)),增加了计算时间。其实没必要,完全可以用max(|x1-x0|,|y1-y0|)。因为作为空间长度的度量只要满足如下几个条件就可以了:
1、||A,A||=0;
2、||A,B||=||B,A||
3、||A,B||+||B,C||>=||A,C||
大家可以证明下,max(|x1-x0|,|y1-y0|)是可以作为空间距离度量的。
初始点选取,我就选择了第一点,没什么道理,随便选的一个,反正最后都会收敛的。
唯一修改的地方就是步进值得选择上,稍稍改进了一下,判断新值和原值的差距,如果相差大,就大幅调整步进,否则小幅调整步进。
贴上代码
package pango.bestdistanc