使用过程作为模型参数

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-selectedsetup 处设置为 1:

function-selectedsetup 处设置为 2:

function-selectedsetup 处设置为 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