Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Netlogo 如何让海龟在海龟从三个方向到达的地块的交点转弯_Netlogo - Fatal编程技术网

Netlogo 如何让海龟在海龟从三个方向到达的地块的交点转弯

Netlogo 如何让海龟在海龟从三个方向到达的地块的交点转弯,netlogo,Netlogo,我已经创建了道路(灰色斑块),人们(海龟)在上面随机移动。在交叉点(白色斑块),我让它们(海龟)转向可能转向,也可能不转向。按照我的编码方式,如果它们的标题是90和270,就可以了。但如果航向为0,则几乎95%的时间他们会返回(180),而不是向左(270)或向右(90)。代码中没有错误。我只是想知道,我们是否可以用其他方式编码,这样0头乌龟也可以像其他两头乌龟一样,在所有三个回合中有50%的机会 以下是我的代码: breed [people person] globals [ streets

我已经创建了道路(灰色斑块),人们(海龟)在上面随机移动。在交叉点(白色斑块),我让它们(海龟)转向可能转向,也可能不转向。按照我的编码方式,如果它们的标题是90和270,就可以了。但如果航向为0,则几乎95%的时间他们会返回(180),而不是向左(270)或向右(90)。代码中没有错误。我只是想知道,我们是否可以用其他方式编码,这样0头乌龟也可以像其他两头乌龟一样,在所有三个回合中有50%的机会

以下是我的代码:

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