Netlogo - 如何创建路径?
Netlogo - how to create paths?
我正在尝试在 NetLogo 中模拟特定的交集。这是代码(在开发的早期阶段):
breed [ trams tram ]
breed [ cars car ]
to setup
clear-all
set-default-shape trams "bug"
set-default-shape cars "car"
setup-patches
reset-ticks
end
to go
make-new-car frequency-SN-1 1 -20 0
make-new-car frequency-SN-2 2 -20 0
make-new-car frequency-NS-3 -3 20 180
setup-trams tram-frequency
move-trams
want-turn
move-cars
tick
end
to setup-trams [ freq ]
if (random-float 100 < freq) and not any? turtles-on patch 0 -20 [
create-trams 1 [
setxy 0 -20
set heading 0
set color black
]
]
end
to make-new-car [freq x y head ]
if (random-float 100 < freq) and not any? turtles-on patch x y [
create-cars 1 [
setxy x y
set heading head
set color one-of base-colors
]
]
end
to move-cars
ask cars [
ifelse not can-move? 1
[ die ]
[ fd 1 ]
]
end
to want-turn
ask cars-on patch 2 -7 [
ifelse (random-float 100 < 100) and not any? turtles-on patch 3 -7
[ rt 90 fd 1
lt 90 fd 4
rt 90 fd 2
lt 90 fd 2
rt 90 fd 1]
[ fd 1 ]
]
end
to move-trams
ask trams [
ifelse not can-move? 1
[ die ]
[ fd 1 ]
]
end
to setup-patches
ask patches [
ifelse abs pxcor <= 3 or abs pycor <= 3
[ set pcolor black ]
[ set pcolor green - 1 ]
ifelse abs pxcor <= 0.5
[ set pcolor red ]
[ ]
ask patch 3 -2 [ set pcolor red ]
ask patch -2 -1 [ set pcolor red ]
ask patch -1 -1 [ set pcolor red ]
if pycor = -3 and pxcor > 8
[ set pcolor green - 1 ]
if pycor <= 3 and pycor >= -1 and pxcor < -3
[ set pcolor green - 1 ]
if pxcor = 3 and pycor <= -8
[ set pcolor green - 1 ]
]
end
让我出问题的是want-turn程序。我想让一些汽车向右行驶并向东行驶。但是我不能,到现在为止(刚开始使用 NetLogo)以不同的方式做 - 但只是让汽车在特定补丁上消失并重新出现在另一个补丁上(这正是由 运行s 中的想要转弯程序引起的to-go 程序。它是 运行 每个 tick,但在 want-turn 中,我将汽车移动了很多补丁,所以它看起来像传送)。
我可以在那里修路吗?因此,我不会手动将汽车移动到另一个补丁,而是询问这辆车是否满足特定补丁的条件(在本例中:补丁 2 -7),如果是 - 它会移动替代道路。
我刚刚发现 NetLogo,欢迎提出任何想法
实现此目的的一种方法是使用基于转弯汽车前方色块颜色的规则。对于一种严格适用于我认为您要重现的模式的方法,如果前面有绿色补丁,您可以让汽车向左转,如果前面有红色补丁,则可以让汽车向右转。这使您可以在他们移动时根据补丁控制他们的航向。
我还建议在他们的移动程序中加入,如果前面有汽车(如模型库中的交通模型),他们永远不会向前移动,就像您在转弯程序中所做的那样.这样,他们就永远不会进入已经被另一辆车占用的补丁。
您还应该查看 patch-set
以创建补丁代理集,这样您就不必重复 set pcolor red
等命令;你也可以用 or
来做到这一点。
查看我对您的代码所做的一些已实施示例的修改:
breed [ cars car ]
to setup
ca
resize-world -20 20 -20 20
set-default-shape cars "car"
setup-patches
reset-ticks
end
to go
make-new-car 10 2 -20 0 blue
make-new-car 10 1 -20 0 yellow
make-new-car 10 -3 20 180 white
make-new-car 10 -1 20 180 pink
make-new-car 10 -20 -3 90 orange
want-turn
move-cars
tick
end
to make-new-car [freq x y head col ]
if (random-float 100 < freq) and not any? turtles-on patch x y [
create-cars 1 [
setxy x y
set heading head
set color col
]
]
end
to move-cars
ask cars [
ifelse not can-move? 1
[
die
]
[
if patch-ahead 1 != nobody [
if [pcolor] of patch-ahead 1 = green - 1 [
rt -90
]
if [pcolor] of patch-ahead 1 = red [
rt 90
]
if ( [count turtles-here] of patch-ahead 1 = 0 ) and
([pcolor] of patch-ahead 1 = black) [
fd 1
]
]
]
]
end
to want-turn
ask cars-on patch 2 -7 [
if (random-float 100 < 50) [
rt 90
]
]
end
to setup-patches
ask patches [
ifelse abs pxcor <= 3 or abs pycor <= 3
[ set pcolor black ]
[ set pcolor green - 1 ]
if abs pxcor <= 0.5
[ set pcolor red ]
ask ( patch-set patch 3 -2 patch -2 -1 patch -1 -1 patch 8 -1 ) [
set pcolor red
]
if ( pycor = -3 and pxcor > 8 ) or (pycor <= 3 and pycor >= -1 and pxcor < -3) or (pxcor = 3 and pycor <= -8) [
set pcolor green - 1
]
]
end
我正在尝试在 NetLogo 中模拟特定的交集。这是代码(在开发的早期阶段):
breed [ trams tram ]
breed [ cars car ]
to setup
clear-all
set-default-shape trams "bug"
set-default-shape cars "car"
setup-patches
reset-ticks
end
to go
make-new-car frequency-SN-1 1 -20 0
make-new-car frequency-SN-2 2 -20 0
make-new-car frequency-NS-3 -3 20 180
setup-trams tram-frequency
move-trams
want-turn
move-cars
tick
end
to setup-trams [ freq ]
if (random-float 100 < freq) and not any? turtles-on patch 0 -20 [
create-trams 1 [
setxy 0 -20
set heading 0
set color black
]
]
end
to make-new-car [freq x y head ]
if (random-float 100 < freq) and not any? turtles-on patch x y [
create-cars 1 [
setxy x y
set heading head
set color one-of base-colors
]
]
end
to move-cars
ask cars [
ifelse not can-move? 1
[ die ]
[ fd 1 ]
]
end
to want-turn
ask cars-on patch 2 -7 [
ifelse (random-float 100 < 100) and not any? turtles-on patch 3 -7
[ rt 90 fd 1
lt 90 fd 4
rt 90 fd 2
lt 90 fd 2
rt 90 fd 1]
[ fd 1 ]
]
end
to move-trams
ask trams [
ifelse not can-move? 1
[ die ]
[ fd 1 ]
]
end
to setup-patches
ask patches [
ifelse abs pxcor <= 3 or abs pycor <= 3
[ set pcolor black ]
[ set pcolor green - 1 ]
ifelse abs pxcor <= 0.5
[ set pcolor red ]
[ ]
ask patch 3 -2 [ set pcolor red ]
ask patch -2 -1 [ set pcolor red ]
ask patch -1 -1 [ set pcolor red ]
if pycor = -3 and pxcor > 8
[ set pcolor green - 1 ]
if pycor <= 3 and pycor >= -1 and pxcor < -3
[ set pcolor green - 1 ]
if pxcor = 3 and pycor <= -8
[ set pcolor green - 1 ]
]
end
让我出问题的是want-turn程序。我想让一些汽车向右行驶并向东行驶。但是我不能,到现在为止(刚开始使用 NetLogo)以不同的方式做 - 但只是让汽车在特定补丁上消失并重新出现在另一个补丁上(这正是由 运行s 中的想要转弯程序引起的to-go 程序。它是 运行 每个 tick,但在 want-turn 中,我将汽车移动了很多补丁,所以它看起来像传送)。
我可以在那里修路吗?因此,我不会手动将汽车移动到另一个补丁,而是询问这辆车是否满足特定补丁的条件(在本例中:补丁 2 -7),如果是 - 它会移动替代道路。
我刚刚发现 NetLogo,欢迎提出任何想法
实现此目的的一种方法是使用基于转弯汽车前方色块颜色的规则。对于一种严格适用于我认为您要重现的模式的方法,如果前面有绿色补丁,您可以让汽车向左转,如果前面有红色补丁,则可以让汽车向右转。这使您可以在他们移动时根据补丁控制他们的航向。
我还建议在他们的移动程序中加入,如果前面有汽车(如模型库中的交通模型),他们永远不会向前移动,就像您在转弯程序中所做的那样.这样,他们就永远不会进入已经被另一辆车占用的补丁。
您还应该查看 patch-set
以创建补丁代理集,这样您就不必重复 set pcolor red
等命令;你也可以用 or
来做到这一点。
查看我对您的代码所做的一些已实施示例的修改:
breed [ cars car ]
to setup
ca
resize-world -20 20 -20 20
set-default-shape cars "car"
setup-patches
reset-ticks
end
to go
make-new-car 10 2 -20 0 blue
make-new-car 10 1 -20 0 yellow
make-new-car 10 -3 20 180 white
make-new-car 10 -1 20 180 pink
make-new-car 10 -20 -3 90 orange
want-turn
move-cars
tick
end
to make-new-car [freq x y head col ]
if (random-float 100 < freq) and not any? turtles-on patch x y [
create-cars 1 [
setxy x y
set heading head
set color col
]
]
end
to move-cars
ask cars [
ifelse not can-move? 1
[
die
]
[
if patch-ahead 1 != nobody [
if [pcolor] of patch-ahead 1 = green - 1 [
rt -90
]
if [pcolor] of patch-ahead 1 = red [
rt 90
]
if ( [count turtles-here] of patch-ahead 1 = 0 ) and
([pcolor] of patch-ahead 1 = black) [
fd 1
]
]
]
]
end
to want-turn
ask cars-on patch 2 -7 [
if (random-float 100 < 50) [
rt 90
]
]
end
to setup-patches
ask patches [
ifelse abs pxcor <= 3 or abs pycor <= 3
[ set pcolor black ]
[ set pcolor green - 1 ]
if abs pxcor <= 0.5
[ set pcolor red ]
ask ( patch-set patch 3 -2 patch -2 -1 patch -1 -1 patch 8 -1 ) [
set pcolor red
]
if ( pycor = -3 and pxcor > 8 ) or (pycor <= 3 and pycor >= -1 and pxcor < -3) or (pxcor = 3 and pycor <= -8) [
set pcolor green - 1
]
]
end