Algorithm 模拟退火与路径发现

Algorithm 模拟退火与路径发现,algorithm,optimization,artificial-intelligence,heuristics,simulated-annealing,Algorithm,Optimization,Artificial Intelligence,Heuristics,Simulated Annealing,我已经阅读了大量关于模拟退火(SA)及其在求解TSP中的有效性的文献。这让我想到SA是否可以用于优化从源到目标的路径查找 基本SA伪代码(来自wiki) s← s0;E← E(s)//初始状态,能量。 斯贝斯特← s埃伯斯特← e//初始“最佳”解决方案 K← 0//能量评估计数。 当kemax//当时间还剩&不够好时: T← 温度(k/kmax)//温度计算。 冷嘲热讽← 邻居///挑选一些邻居。 新能源← E(snew)//计算它的能量。 如果P(e,enew,T)>random(),那么/

我已经阅读了大量关于模拟退火(SA)及其在求解TSP中的有效性的文献。这让我想到SA是否可以用于优化从
目标
的路径查找

基本SA伪代码(来自wiki)

s← s0;E← E(s)//初始状态,能量。
斯贝斯特← s埃伯斯特← e//初始“最佳”解决方案
K← 0//能量评估计数。
当kemax//当时间还剩&不够好时:
T← 温度(k/kmax)//温度计算。
冷嘲热讽← 邻居///挑选一些邻居。
新能源← E(snew)//计算它的能量。
如果P(e,enew,T)>random(),那么//我们应该移动到它吗?
s← snew;E← enew//是,更改状态。
如果enew

这里,
s0
表示一个解决方案(因此在我的例子中,它已经意味着一个源-目标路径),我的问题是除了使用最大流算法或dijikstra算法之外,我如何生成这些“解决方案”。

取决于您所谈论的路径类型。你认为游戏或机器人的寻路算法还是更抽象的(例如一种图形结构)。@ MikEMB图形结构。@ MikEMB考虑4x4矩阵。让代理从0,0开始,需要转到3,3。一些指数产生正成本,一些指数产生负成本。我可以直接应用SA吗?或者我应该先使用一些路径查找算法,获得多条路径并使用SA优化路径列表吗?老实说,我可能根本不会使用SA。但是,如果您想使用SA,并假设矩阵中的相邻字段具有类似的成本,我将从一条比较直的路径开始,然后添加额外的“航路点”,您可以随机移动。能级越低,我使用的航路点越多,在创建新解决方案时对这些航路点所做的更改越小。如果我能想出一个实际的算法,我会给你一个正确的答案。你可以使用SA来找到基本上任何问题的近似解,但只有在没有更好的方法解决这个问题的情况下,才有意义应用它。TSP是一个NP完全问题,所以使用SA来解决它是有意义的,但是Dijstra的算法,特别是A*算法,速度很快,并且给出了可证明的最短路径,所以为什么不使用其中的一个呢?
s ← s0; e ← E(s)                                  // Initial state, energy.
sbest ← s; ebest ← e                              // Initial "best" solution
k ← 0                                             // Energy evaluation count.
while k < kmax and e > emax                       // While time left & not good enough:
  T ← temperature(k/kmax)                         // Temperature calculation.
  snew ← neighbour(s)                             // Pick some neighbour.
  enew ← E(snew)                                  // Compute its energy.
  if P(e, enew, T) > random() then                // Should we move to it?
    s ← snew; e ← enew                            // Yes, change state.
  if enew < ebest then                            // Is this a new best?
    sbest ← snew; ebest ← enew                    // Save 'new neighbour' to 'best found'.
  k ← k + 1                                       // One more evaluation done
return sbest                                      // Return the best solution found.