是否有可能有一个带有两个条件(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
我是 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