模拟退火:
https://www.cnblogs.com/ranjiewen/p/6084052.html
https://www.cnblogs.com/rvalue/p/8678318.html
1. 随机交换序列中2个位置的元素;
2. 如果新序列比老序列更优(E(new)-E(old)<0), 则完全接受新序列; (E是越小越好)
如果新序列比老序列更差(E(new)-E(old)>0), 则以概率p=exp( - (E(new)-E(old)) / kT )的概率接受新序列;
3. 略微减少T
T是温度,从高到低期间,接受更差解的概率越来越小,趋于稳定;
1中的随机交换2个元素,也可以换成整个序列彻底随机等。。。
A*: https://wenku.baidu.com/view/774588e3524de518964b7da4.html
对每一个状态s来说:F(s) = G(s) + h(s);F是总估值函数,每次在open-list里扩展F最小的节点;G是ground-truth,已经走过的路径长度;h是预估值,TSP里用该点到其他未遍历节点的最小边(min)*剩余边数
为了防止状态爆炸,每次扩展完1个s,可以只保留最优的前N(本程序里N=100)个s,后面的删掉;
步骤:1. 从open-list中取best 2.对best扩展(依次扩展序列末尾节点周围未遍历的节点们),每个扩展加入到open-list; 3. 还没有到终点的解或者不满意,则跳到1继续循环;