NetLogo

时间:2018-02-18 23:19:25

标签: netlogo

我使用TSP来说明一个类中的遗传算法。学生应该写GA。有一个永远的按钮,将持续运行GA。每当找到新的最佳路径时,都会保存并显示。

为了说明这是如何工作的,我写了一个greedy-path程序。从随机节点开始,它通过获取附加到未使用节点的最短链接来构建路径。

以下是调用greedy-path.

的(略微简化的)永久按钮程序
to continual-greedy-path
  let new-path greedy-path ;; Creates a new path agent
  if [path-length] of new-path < [path-length] of best-path [
    set-new-best-path new-path
    display-best-path
    ]
end 

每次调用greedy-path都会创建一个新的path代理来存储路径。问题是我的内存不足。在continual-greedy-path按钮打开的情况下,count paths会不断增加并且内存会迅速被剔除,即使找到的路径很少。 (从任何起始点只有一条贪婪路径。所以新路径的最大数量是节点数。即使只有两个节点并且找不到更好的路径,也会出现问题!)

未使用的path代理是否在continual-greedy-path?结束时没有收集垃圾?我还缺少其他东西吗?

正在生成的唯一新代理是paths。没有新的nodesedges

感谢。

更新:一些实验表明存在垃圾收集。也许它无法跟上新路径生成的速度。但为什么系统没有减速而不是耗尽内存?

1 个答案:

答案 0 :(得分:1)

看起来continual-greedy-path创建的海龟不会被移除,只有变量new-path。因此,您的路径仍然存在且count正在增加,正如此处的new-turtles

globals [ max-x ]

to setup
  ca
  set max-x min-pxcor 
  reset-ticks  
end

to new-max-x
  let new-t new-turtle
  if [xcor] of new-t > max-x [
    set max-x [xcor] of new-t
  ]
end

to-report new-turtle
  let x nobody
  crt 1 [
    set x self
    set xcor random-pxcor
  ]
  report x
end

我认为快速解决方法是手动删除那些不符合您标准的路径代理,例如:

globals [ max-x max-x-turt]

to setup
  ca
  set max-x min-pxcor 
  set max-x-turt nobody
  reset-ticks  
end

to new-max-x
  let new-t new-turtle
  ifelse [xcor] of new-t > max-x [
    set max-x [xcor] of new-t
    if max-x-turt != nobody [
      ask max-x-turt [
        die
      ]
    ]
    set max-x-turt new-t
  ] [
    ask new-t [
      die
    ]
  ]
end

to-report new-turtle
  let x nobody
  crt 1 [
    set x self
    set xcor random-pxcor
  ]
  report x
end