Netlogo 如何让海龟在海龟从三个方向到达的地块的交点转弯
我已经创建了道路(灰色斑块),人们(海龟)在上面随机移动。在交叉点(白色斑块),我让它们(海龟)转向可能转向,也可能不转向。按照我的编码方式,如果它们的标题是90和270,就可以了。但如果航向为0,则几乎95%的时间他们会返回(180),而不是向左(270)或向右(90)。代码中没有错误。我只是想知道,我们是否可以用其他方式编码,这样0头乌龟也可以像其他两头乌龟一样,在所有三个回合中有50%的机会 以下是我的代码:Netlogo 如何让海龟在海龟从三个方向到达的地块的交点转弯,netlogo,Netlogo,我已经创建了道路(灰色斑块),人们(海龟)在上面随机移动。在交叉点(白色斑块),我让它们(海龟)转向可能转向,也可能不转向。按照我的编码方式,如果它们的标题是90和270,就可以了。但如果航向为0,则几乎95%的时间他们会返回(180),而不是向左(270)或向右(90)。代码中没有错误。我只是想知道,我们是否可以用其他方式编码,这样0头乌龟也可以像其他两头乌龟一样,在所有三个回合中有50%的机会 以下是我的代码: breed [people person] globals [ streets
breed [people person]
globals [ streets intersections head]
people-own [ speed direction]
patches-own [ intersection? ]
to setup
clear-all
ask patches [set pcolor green
set intersection? false]
setup-street
setup-people
end
to setup-street
;set streets patches with [ (( pxcor < max-pxcor and pxcor > min-pxcor ) ;and (pycor = 4) or (pxcor = 0 and ( pycor > min-pycor and pycor < 4))]
set streets patches with [ (( pxcor < max-pxcor and pxcor > min-pxcor ) and (pycor = 4 or pycor = 5)) or ((pxcor = 0 or pxcor = 1) and ( pycor > min-pycor and pycor < 4))]
set intersections patches with [ (pxcor = 0 or pxcor = 1) and (pycor = 4 or pycor = 5)]
ask streets [set pcolor gray]
ask intersections [ set pcolor white]
setup-intersection
end
to setup-intersection
ask intersections [ set intersection? true]
end
to setup-people
ask n-of No-of-person patches with [ pcolor = gray or pcolor = white] [
sprout-people 1 [
set color brown
set size 1
set shape "person"
set speed 0.01 + random-float 0.9
set direction random 2
set-default-headings direction
]
]
end
to set-default-headings [ direct]
if direct = 0 [
;ask people with [ ( pxcor < max-pxcor and pxcor > min-pxcor ) and pycor = 4 ]
ask people with [ (pxcor < max-pxcor and pxcor > min-pxcor ) and (pycor = 4 or pycor = 5)]
[ set head random 2
if head = 0 [ set heading 90]
if head = 1 [ set heading 270]
]
]
if direct = 1 [
;ask people with [ pxcor = 0 and ( pycor > min-pycor and pycor < 4) ]
ask people with [(pxcor = 0 or pxcor = 1) and ( pycor > min-pycor and pycor < 4)]
[ set head random 2
if head = 0 [ set heading 0]
if head = 1 [ set heading 180]
]
]
end
to go
ask people [ fd speed
check-intersection
check-end]
end
to check-intersection
if intersection? [
if heading = 90 [if random 20 < 10 [ set heading 180] ]
if heading = 270 [if random 20 < 10 [ set heading 180] ]
if heading = 0 [ let new-heading random 2
if (new-heading = 0) [rt 90 ]
if (new-heading = 1) [lt 90 ] ]
]
end
to check-end
ask people [ if [pcolor] of patch-ahead 1 = green [set heading [heading] of self - 180 ] ]
end
繁殖[人]
全球[街道交叉路口]
人们拥有[速度方向]
自己的[交叉点?]
设置
清除所有
询问修补程序[设置P颜色为绿色]
设置交叉点?错误]
设置街
设置人员
结束
设置街道
;使用[((pxcormin pxcor)和(pxcor=4)或(pxcor=0和(pycor>min pycor和pycor<4))设置街道面片]
使用[((pxcormin pxcor)和(pycor=4或pycor=5))或((pxcor=0或pxcor=1)和(pycor>min pycor和pycor<4))设置街道面片
使用[(pxcor=0或pxcor=1)和(pycor=4或pycor=5)]设置交点面片
ask streets[设置颜色为灰色]
询问交叉点[设置pcolor白色]
设置交叉口
结束
设置交叉口
询问交叉点[设置交叉点?为真]
结束
设置人员
询问n-使用[pcolor=灰色或pcolor=白色]贴片的人数[
发芽人1[
设置颜色为棕色
1号套餐
设置形状“人”
设定速度0.01+随机浮动0.9
设置方向随机2
设置默认标题方向
]
]
结束
设置默认标题[直接]
如果直接=0[
;询问有[(pxcormin pxcor)和pycor=4]的人
询问[(pxcormin pxcor)和(pycor=4或pycor=5)]
[随机设置头2
如果水头=0[设置航向90]
如果水头=1[设置航向270]
]
]
如果直接=1[
;询问具有[pxcor=0和(pycor>min pycor和pycor<4)]
询问[(pxcor=0或pxcor=1)和(pycor>min pycor和pycor<4)]
[随机设置头2
如果head=0[设置标题0]
如果水头=1[设置航向180]
]
]
结束
外带
询问人们[fd速度]
检查交叉口
检查[结束]
结束
检查交叉口
如果是交叉口[
如果航向=90[如果随机20<10[设置航向180]]
如果航向=270[如果随机20<10[设置航向180]]
如果航向=0[让新航向随机2
如果(新航向=0)[rt 90]
如果(新航向=1)[lt 90]]
]
结束
检查结束
询问人们[如果前面补丁的[pcolor]为1=绿色[设置self-180的标题[标题]]
结束
我运行你的代码时,速度变慢了,只创建了一个人。我认为问题不在于你的随机方向创建-速度意味着该人在交叉口上花费多个记号,只有在生成的随机方向再次向下移动时才离开。例如,代理进入交叉口n的航向为0,随机航向为90,因此向右移动一段距离<1(从速度),并且仍然在交叉路口,因此获得一个新的随机航向,例如90,仍然在交叉路口,然后获得270,仍然在交叉路口,然后获得180,因此离开
解决这一问题的一种方法是创建一个计数器/标志。它在到达交叉口时设置,如果标志仍然设置,则不会检查交叉口
to go
ask people [ fd speed
set just-turned max (list 0 just-turned - 1)
check-intersection
check-end]
end
to check-intersection
if intersection? and just-turned = 0 [
set just-turned 1 / speed + 1
if heading = 90 [if random 20 < 10 [ set heading 180] ]
if heading = 270 [if random 20 < 10 [ set heading 180] ]
if heading = 0 [ let new-heading random 2
if (new-heading = 0) [rt 90 ]
if (new-heading = 1) [lt 90 ] ]
]
end
1/您可以使用(因此它不会检查每个if语句)
2/或(因此不必为随机数创建局部变量)
3/或(因此您可以针对不同的情况使用不同的命令)
4/或(因为在这种情况下存在数学关系)
在这种情况下,数字4最好,但数字3也适用于具有不同命令的部分(如[lt 90][rt 90])请提出一些想法。我会很感激的。嗨,JenB,我明白你的意思,谢谢你的代码建议,但是他们的解决方案能解决我的问题吗?如果请帮助我的话。当然,这是一个逻辑问题,但不是编码问题。你可以通过让代理移动一个完整的补丁距离来解决,当它离开交叉点时n但我认为这可能与您希望对速度所做的相反。我将修改我的答案,以获得更好的解决方案。很抱歉,我没有得到逻辑。刚转向的变量是否需要初始化?在刚转向和0的值中,最大值始终为刚转向,因此在交叉点处条件永远不可能为真。Tho呃,我在没有任何初始化的情况下尝试过,它运行得很好,但我真的不知道它是如何工作的。你能让我理解吗。谢谢。是的,它应该被初始化(到0,当海龟被创建时)但我很懒。这无论如何都会起作用,因为NetLogo会自动初始化为0,但好的做法是,即使您希望值为0,也会对初始化进行显式编码。
max
用于处理1/speed不是整数的情况-当您减少1时,非整数永远不会变为0(例如,它将是0.5,然后是-0.5,然后是-1.5等等)。假设速度是0.2,那么1/speed+1将是6。对于那只乌龟,它需要5个滴答声才能完全穿过交叉点(因为交叉点的宽度是1,它每滴答声移动0.2)。但是,由于计数器,一旦它进入交叉点(并且设置了计数器),它不会检查它是否在交叉路口6个滴答声
set head random 2
if head = 0 [ set heading 0]
if head = 1 [ set heading 180]
set head random 2
ifelse head = 0 [ set heading 0] [ set heading 180]
set heading ifelse-value (random 2 = 0) [0] [180]
ifelse random 2 = 0 [ set heading 0] [ set heading 180]
set heading random 2 * 180