使用过程作为模型参数
Using procedures as model parameters
我正在构建一个比较搜索功能的模型。
我可以手动更改代码以引用不同的搜索过程,但我想使用行为 space 到 运行 我的试验,所以我最好有一个参数来指导模型调用过程作为参数的函数。
so 对于 4 个搜索函数:a、b、c、d
我可以像下面那样使用 "wrapper" 报告器,但只是想看看 netlogo 中是否有更好的方法来处理这个问题。
调用了n个搜索功能! - (0.5n)!次,其中 n 是海龟的数量,因此包装函数不是必须添加的好东西,因为它非常低效。
我不知道可以使用过程作为 netlogo 中的参数,有没有办法做到这一点?
to-report wrap [function-type]
ifelse function-type = 1
[
report a
]
[
ifelse function-type = 2
[
report b
]
[
ifelse function-type = 3
[
report c
]
[
ifelse function-type = 4
[
report d
]
[
report "not a valid function type"
; or some sort of error value
]
]
]
]
end
如果您想对行为进行实验 Space,我建议您在 Netlogo 的界面选项卡中创建一个选择器(查看下面的屏幕截图)。在那里输入搜索程序的名称(屏幕 2)。比起你可以 select 它们在 Behavior Space 和 运行 随后对其进行实验(屏幕 3)。
屏幕 1
屏幕 2
屏幕 3
您的代码中必须包含以下行,以告诉 Netlogo,给定选择器 proc
的值应该应用哪个过程。例如,如果您从选择器中选择 select "a"
,那么过程 test1
将被执行:
to go
if proc = "a" [ test1 ]
if proc = "b" [ test2 ]
if proc = "c" [ test3 ]
if proc = "d" [ test4 ]
end
希望这对你有用!
我同意 geruter 关于使用 BehaviorSpace 的观点。我不确定我是否完全理解为什么他们的回答不能完全满足您的需求,但也许这对您有用。
假设您的界面上有一个名为 function-selected
的选择器或滑块,您可以将所需的过程名称存储为一个字符串,然后使用 run
让海龟评估该字符串。这是一个简单的例子:
globals [ function ]
to setup
ca
crt 10 [ pd ]
choose-func
reset-ticks
end
to choose-func
if function-selected = 1 [
set function "move-1"
]
if function-selected = 2 [
set function "move-2"
]
if function-selected = 3 [
set function "move-3"
]
end
在那里,由function-selected
滑块确定的选择功能在setup
中用于存储三个过程之一的名称。现在你的海龟可以调用 run function
并且它们将评估存储在 function
中的字符串值以调用适当的过程:
to go
ask turtles [
run function
]
tick
end
to move-1
rt 5
fd 1
end
to move-2
rt 30
fd 1
end
to move-3
rt random 61 - 30
fd 1
end
function-selected
在 setup
处设置为 1:
function-selected
在 setup
处设置为 2:
function-selected
在 setup
处设置为 3:
如果你想让它更灵活一点(比如如果选择的搜索类型需要因海龟或时间而异,你可以使用 table 扩展:
extensions [ table ]
globals [ function-dict ]
to setup
ca
crt 10 [ pd ]
set function-dict table:make
table:put function-dict 1 "move-1"
table:put function-dict 2 "move-2"
table:put function-dict 3 "move-3"
reset-ticks
end
to go
ask turtles [
run table:get function-dict function-selected
]
tick
end
to move-1
rt 5
fd 1
end
to move-2
rt 30
fd 1
end
to move-3
rt random 61 - 30
fd 1
end
我正在构建一个比较搜索功能的模型。
我可以手动更改代码以引用不同的搜索过程,但我想使用行为 space 到 运行 我的试验,所以我最好有一个参数来指导模型调用过程作为参数的函数。
so 对于 4 个搜索函数:a、b、c、d
我可以像下面那样使用 "wrapper" 报告器,但只是想看看 netlogo 中是否有更好的方法来处理这个问题。
调用了n个搜索功能! - (0.5n)!次,其中 n 是海龟的数量,因此包装函数不是必须添加的好东西,因为它非常低效。
我不知道可以使用过程作为 netlogo 中的参数,有没有办法做到这一点?
to-report wrap [function-type]
ifelse function-type = 1
[
report a
]
[
ifelse function-type = 2
[
report b
]
[
ifelse function-type = 3
[
report c
]
[
ifelse function-type = 4
[
report d
]
[
report "not a valid function type"
; or some sort of error value
]
]
]
]
end
如果您想对行为进行实验 Space,我建议您在 Netlogo 的界面选项卡中创建一个选择器(查看下面的屏幕截图)。在那里输入搜索程序的名称(屏幕 2)。比起你可以 select 它们在 Behavior Space 和 运行 随后对其进行实验(屏幕 3)。
屏幕 1
屏幕 2
屏幕 3
您的代码中必须包含以下行,以告诉 Netlogo,给定选择器 proc
的值应该应用哪个过程。例如,如果您从选择器中选择 select "a"
,那么过程 test1
将被执行:
to go
if proc = "a" [ test1 ]
if proc = "b" [ test2 ]
if proc = "c" [ test3 ]
if proc = "d" [ test4 ]
end
希望这对你有用!
我同意 geruter 关于使用 BehaviorSpace 的观点。我不确定我是否完全理解为什么他们的回答不能完全满足您的需求,但也许这对您有用。
假设您的界面上有一个名为 function-selected
的选择器或滑块,您可以将所需的过程名称存储为一个字符串,然后使用 run
让海龟评估该字符串。这是一个简单的例子:
globals [ function ]
to setup
ca
crt 10 [ pd ]
choose-func
reset-ticks
end
to choose-func
if function-selected = 1 [
set function "move-1"
]
if function-selected = 2 [
set function "move-2"
]
if function-selected = 3 [
set function "move-3"
]
end
在那里,由function-selected
滑块确定的选择功能在setup
中用于存储三个过程之一的名称。现在你的海龟可以调用 run function
并且它们将评估存储在 function
中的字符串值以调用适当的过程:
to go
ask turtles [
run function
]
tick
end
to move-1
rt 5
fd 1
end
to move-2
rt 30
fd 1
end
to move-3
rt random 61 - 30
fd 1
end
function-selected
在 setup
处设置为 1:
function-selected
在 setup
处设置为 2:
function-selected
在 setup
处设置为 3:
如果你想让它更灵活一点(比如如果选择的搜索类型需要因海龟或时间而异,你可以使用 table 扩展:
extensions [ table ]
globals [ function-dict ]
to setup
ca
crt 10 [ pd ]
set function-dict table:make
table:put function-dict 1 "move-1"
table:put function-dict 2 "move-2"
table:put function-dict 3 "move-3"
reset-ticks
end
to go
ask turtles [
run table:get function-dict function-selected
]
tick
end
to move-1
rt 5
fd 1
end
to move-2
rt 30
fd 1
end
to move-3
rt random 61 - 30
fd 1
end