NetLogo 中的代理垃圾收集
Agent garbage collection in NetLogo
我正在使用 TSP 来说明 class 中的遗传算法。学生应该编写 GA。有一个永远 运行 GA 的永久按钮。每当找到新的最佳路径时,都会将其保存并显示。
为了说明这是如何工作的,我写了一个 greedy-path
程序。从一个随机节点开始,它通过采用最短的 link 连接到一个未使用的节点来构建一条路径。
这是调用 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
。没有新的 nodes
或 edges
。
谢谢。
更新:一些实验表明存在垃圾收集。也许它只是跟不上新路径生成的速度。但是为什么系统没有变慢而不是 运行 内存不足?
看起来 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
我正在使用 TSP 来说明 class 中的遗传算法。学生应该编写 GA。有一个永远 运行 GA 的永久按钮。每当找到新的最佳路径时,都会将其保存并显示。
为了说明这是如何工作的,我写了一个 greedy-path
程序。从一个随机节点开始,它通过采用最短的 link 连接到一个未使用的节点来构建一条路径。
这是调用 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
。没有新的 nodes
或 edges
。
谢谢。
更新:一些实验表明存在垃圾收集。也许它只是跟不上新路径生成的速度。但是为什么系统没有变慢而不是 运行 内存不足?
看起来 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