【发布时间】:2020-12-15 15:59:58
【问题描述】:
在this paper 中,描述了一个非常简单的模型来说明蚁群算法的工作原理。简而言之,它假设两个节点通过两条链路连接,其中一条链路较短。然后,给定信息素增量和信息素蒸发动力学,人们预计所有蚂蚁最终都会选择较短的路径。
现在,我正在尝试复制与上述场景相对应的本文的模拟,其结果应该(或多或少)如下所示。
这是我的一个实现(采用与上面测试相同的规范)。
import random
import matplotlib.pyplot as plt
N = 10
l1 = 1
l2 = 2
ru = 0.5
Q = 1
tau1 = 0.5
tau2 = 0.5
epochs = 150
success = [0 for x in range(epochs)]
def compute_probability(tau1, tau2):
return tau1/(tau1 + tau2), tau2/(tau1 + tau2)
def select_path(prob1, prob2):
if prob1 > prob2:
return 1
if prob1 < prob2:
return 2
if prob1 == prob2:
return random.choice([1,2])
def update_accumulation(link_id):
global tau1
global tau2
if link_id == 1:
tau1 += Q / l1
return tau1
if link_id == 2:
tau2 += Q / l2
return tau2
def update_evapuration():
global tau1
global tau2
tau1 *= (1-ru)
tau2 *= (1-ru)
return tau1, tau2
def report_results(success):
plt.plot(success)
plt.show()
for epoch in range(epochs-1):
temp = 0
for ant in range(N-1):
prob1, prob2 = compute_probability(tau1, tau2)
selected_path = select_path(prob1,prob2)
if selected_path == 1:
temp += 1
update_accumulation(selected_path)
update_evapuration()
success[epoch] = temp
report_results(success)
但是,我得到的结果很奇怪,如下所示。
看来我对信息素应该如何更新的理解是有缺陷的。
那么,可以解决我在这个实现中缺少的东西吗?
【问题讨论】:
-
一个大问题是您没有根据概率选择路径 1 或 2。例如,如果 prob1 是 .50001 而 prob2 是 0.49999,那么您将总是选择 p1,而实际上这些概率应该非常接近随机。你可以考虑
random.choices([1, 2], weights=[prob1, prob2])[0] -
@MarkMeyer:感谢您抓住这一点,尽管结果没有改变。我觉得问题的主要来源是我的主循环中的某个地方。
-
下面我的答案的旁注:论文的链接似乎已死,可能需要刷新或指向 DOI 链接或添加论文的名称,如果更容易的话。
-
@Andrei:我更新了链接,该链接现在指向其发布者网站中的网页。
-
在已发布的图中我发现不清楚的是,在某些情况下,最高观察值高于 1 (100 %),这意味着超过所有蚂蚁报告使用最短路径。我不知道这会是什么解释,或者情节是否有错误。
标签: python ant-colony