是否有可能有一个带有两个条件(ticks mod 和概率)的 ifelse 语句?

Is there a possibility to have an ifelse statement with two conditions (ticks mod and probability)?

我是 Netlogo 的新手,但我想构建一个 model,代理(汽车 driver)将在特定时间以特定概率离开他的家。假设他星期一早上 1 点离开(如果 link 将滴答调整为时间,那么一个滴答就是一个小时)。

我尝试将 ifelse-statements 与第二个陈述结合使用,该陈述必须经过验证才能使整个陈述成真。在下面的例子中,汽车/智能体应该以 7.7% 的概率离开它的房子并开到一个名为 underway-patches 的补丁。由于一周有 168 小时,我尝试通过 mod 滴答来 link 小时(因此,mod 滴答 = 1 等于星期一早上 1 点)。

仅此一项就有效:

ifelse ticks mod 168 = 1 and random-float 100.0 < 7.7
  [ ask turtles [ move-to one-of underway-patches ] ]
  [ ask turtles [ move-to one-of home-patches] ]

这很好用。所以我总是 100 个乌龟中大约有 7 个移动到 underway-patch。

但是如果我现在加上第二个小时,那么凌晨 2 点,第一个功能就不再起作用了(凌晨 1 点根本没有海龟移动——只有凌晨 2 点)。我预计 100 只海龟中大约有 7 只在凌晨 1 点移动到 underway-patch,然后我预计 100 只海龟中大约有 5 只在凌晨 2 点移动到 underway-patch(以及第一个中的其他 7 只小时应该回到 home-patches).

这不再有效:

; Monday, 1 am
ifelse ticks mod 168 = 1 and random-float 100.0 < 7.7
  [ ask turtles [ move-to one-of underway-patches ] ]
  [ ask turtles [ move-to one-of home-patches] ]

; Monday, 2 am
ifelse ticks mod 168 = 2 and random-float 100.0 < 5.1
  [ ask turtles [ move-to one-of underway-patches] ]
  [ ask turtles [move-to one-of home-patches] ]

感谢您的帮助!提前致谢。

首先,祝贺您提出了一个非常明确的问题,尽管您是该网站的新手。

问题不在于您有多个 ifelse 语句,这很好。问题是您的 ifelse 语句正在对所有海龟应用单一测试。只看第一个例子,有一条语句:

ifelse ticks mod 168 = 1 and random-float 100.0 < 7.7
  [ ask turtles [ move-to one-of underway-patches ] ]
  [ ask turtles [ move-to one-of home-patches] ]

假设它是刻度数 1。计算机 运行 使用随机数生成器并得到 2。很好,条件为真,所以第一个块得到 运行。这将使所有海龟移动到 underway-patches。同样,如果随机数生成器 returns 10,则条件为假,所有海龟移动到 home-patches.

你可能想要更像的东西(你不必在多行上做括号,我这样做是为了让你可以看到结构的逻辑块):

ifelse ticks mod 168 = 1
  [ ask turtles-on home-patches
    [ if random-float 100.0 < 7.7
      [ move-to one-of underway-patches
      ]
    ]
  ]
  [ ask turtles-on underway-patches [ move-to one-of home-patches] ]

或者如果您想要正确比例的海龟移动:

ifelse ticks mod 168 = 1
  [ let num-to-move 0.077 * count turtles-on home-patches
    ask n-of num-to-move turtles-on home-patches
    [ move-to one-of underway-patches
    ]
  ]
  [ ask turtles-on underway-patches [ move-to one-of home-patches] ]

只是一般性的观察,如果您要为每个可能的开始时间编写代码,您将会有很多相同的代码,除了刻度和比例。你说你是 NetLogo 的新手,所以我不想太快跳到更高级的概念,但是当你进一步思考你的模型时再回来,我们可能会帮助你创建一个过程这减少了重复代码的需要。

更新:重用代码的一种方法

这不太正确,因为我不太清楚你想要什么样的运动,但这是一个完整的模型,其中比例存储在一个列表中,ticks 用于识别列表中的正确项目。然后将该比例传递给一段移动海龟的代码。

globals
[ home-patches
  underway-patches
  proportions
]

to setup
  clear-all
  set proportions [0 0.077 0.05 0.15]
  set home-patches patches with [abs pxcor <= 3 and abs pycor <= 3]
  ask home-patches [ set pcolor white ]
  set underway-patches patches with [not member? self home-patches]
  ask underway-patches [ set pcolor yellow ]
  create-turtles 100
  [ set color red
  ]
  reset-ticks
end

to go
  move-turtles item (1 + ticks mod 3) proportions
  tick
end

to move-turtles [#prop]
  print #prop
  ask turtles
  [ ifelse member? patch-here home-patches
    [ if random-float 1 < #prop
      [ move-to one-of underway-patches
      ]
    ]
    [ move-to one-of home-patches
    ]
  ]
end