Netlogo 让一只乌龟停下来,然后去追赶一个特殊的事件——机器人割草机模拟项目

Netlogo 让一只乌龟停下来,然后去追赶一个特殊的事件——机器人割草机模拟项目,netlogo,Netlogo,我试图在Netlogo上模拟机器人割草机。我的第一个目标是在电池电量不足时找到回家的路给自己充电 现在已经完成了(谢谢卢克!),但我不知道如何让割草机在到达房子时停止(它一直在移动两块补丁)。因此,我的能量滑块会无限地低于零。 我首先想到添加一个事件“充电”,并将其放在“checkdeath”之后,以配合if实例。但是: 我怎么说,若汽车在特定的补丁:停止并获得能源?我是否应该为房子使用一种特殊的补丁颜色,然后在汽车使用蓝色补丁时进行编码 在to go元素末尾添加充电事件是否可能会产生冲突,因

我试图在Netlogo上模拟机器人割草机。我的第一个目标是在电池电量不足时找到回家的路给自己充电

现在已经完成了(谢谢卢克!),但我不知道如何让割草机在到达房子时停止(它一直在移动两块补丁)。因此,我的能量滑块会无限地低于零。 我首先想到添加一个事件“充电”,并将其放在“checkdeath”之后,以配合if实例。但是:

  • 我怎么说,若汽车在特定的补丁:停止并获得能源?我是否应该为房子使用一种特殊的补丁颜色,然后在汽车使用蓝色补丁时进行编码
  • 在to go元素末尾添加充电事件是否可能会产生冲突,因为充电仅在电池电量不足时进行?控制死亡是一个解决办法吗
然后,我想让它在即时充电后恢复工作

有什么想法吗

代码如下:

breed [cars car]
cars-own [target]

breed [houses house]
to setup
  clear-all
  setup-patches
  setup-cars ;;represent lawn mower
  setup-house
  reset-ticks
end

to setup-patches
  ask patches [set pcolor green] ;; Setup grass patches
  ask patches with [
    pxcor = max-pxcor or
    pxcor = min-pxcor or
    pycor = max-pycor or
    pycor = min-pycor ] [
    set pcolor red ;; Setup the borders of the garden
  ]
end

to setup-cars
create-cars 1 [
    setxy 8 8
    set target one-of houses
  ]

end

to setup-house
  set-default-shape houses "house"
  ask patch 7 8 [sprout-houses 1]
end

to place-walls
  if mouse-down? [
    ask patch mouse-xcor mouse-ycor [ set pcolor red ]
    display
  ]
end


to go
  move-cars
  cut-grass
  check-death ;; Check % battery.
  tick
end

to move-cars
  ask cars
  [
    ifelse [pcolor] of patch-ahead 1 = red
      [ lt random-float 360 ]   ;; see red patch ahead turn left.
      [ fd 1 ]                  ;; otherwise it is ok to go.
    set energy energy - 1
]
  tick
end

to cut-grass
  ask cars [
    if pcolor = green [
      set pcolor gray
    ]
  ]
end

to check-death ;; when low energy lawn mower will go back to house
  ask cars [
    ifelse energy >= 150
    [ set label "Energy ok" ]
    [ set label "Low Energy, returning to base"
      set target min-one-of houses [distance myself]
      face target
      ifelse distance target < 1
      [ move-to target ]
      [ fd 1 ]
    ]
  ]
end
品种[汽车]
汽车自有[目标]
繁殖[房屋]
设置
清除所有
安装补丁
设置车辆;;代表割草机
安置所
重置滴答声
结束
设置修补程序
询问补丁[设置颜色为绿色];;设置草地补丁
问补丁[
pxcor=最大pxcor或
pxcor=最小pxcor或
pycor=最大pycor或
pycor=最小pycor][
设置P颜色为红色;;设置花园的边界
]
结束
安装汽车
创造汽车1[
setxy 8
把目标定在一栋房子上
]
结束
安家
将默认形状房屋设置为“房屋”
询问补丁7 8[发芽屋1]
结束
砌墙
如果鼠标落下?[
询问补丁鼠标xcor鼠标ycor[设置颜色为红色]
显示
]
结束
外带
搬家
割草
制止死亡;;检查电池电量百分比。
打上钩
结束
搬家
问车
[
前方补丁的ifelse[pcolor]1=红色
[lt random float 360];;看到前面的红色补丁向左拐。
[fd 1];;否则就可以走了。
设置能量-1
]
打上钩
结束
割草
问车[
如果pcolor=绿色[
设置颜色为灰色
]
]
结束
制止死亡;;当低能量的割草机回到家里
问车[
ifelse能量>=150
[设置标签“能量正常”]
[设置标签“低能量,返回基地”
设定目标最小一间房子[距离我自己]
面对目标
ifelse距离目标<1
[移动到目标]
[fd 1]
]
]
结束

您可以将逻辑标志(如
充电?
)与计数器(如
充电时间
)结合使用来执行此操作。尝试修改您的
汽车自己的定义,如下所示:

cars-own [target charging? charge-time]
设置车辆
如下:

to setup-cars
  create-cars 1 [
    setxy 8 8
    set target one-of houses
    set charging? false
  ]  
end
然后,您可以让割草机根据
充电?
是否正确来执行不同的操作。尝试修改您的
移动车辆
检查死亡
以适应这些更改(旁注-您在
go
移动车辆
中都有一个勾号):

移动车辆
询问汽车[
还有别的收费吗[
设置充电时间充电时间+1
如果充电时间>14[
设置能量200
设置充电?错误
设置充电时间为0
]
] [
前方补丁的ifelse[pcolor]1=红色
[lt random float 360];;看到前面的红色补丁向左拐。
[fd 1];;否则就可以走了。
设置能量-1
]
]
结束
制止死亡;;当低能量的割草机回到家里
问车[
ifelse能量>=150
[设置标签“能量正常”]
[设置标签“低能量,返回基地”
设定目标最小一间房子[距离我自己]
面对目标
ifelse距离目标<1
[移动到目标
设置充电?正确
]
[fd 1]
]
]
结束
我建议您更改
energy
海龟变量,如
car energy
,以便海龟值独立于滑块。这意味着你可以有多台割草机,它们可以在充电后将能量水平重置为滑块设置!您只需要包含一行,如

设置汽车能量


在您的
设置中,汽车
(然后进行修改,使汽车程序中的
能量
变为
汽车能量
)。

非常感谢!我很高兴你的帮助!每件事都很有魅力。但是,对于你最后的建议,我不断得到一个“未定义任何命名能量”的错误,在设置汽车能量的行中,即使在更改了所有内容之后。你知道怎么回事吗?听起来你把界面上的
energy
滑块改成了
carenergy
-对不起,我应该澄清一下。您可以保持滑块不变,然后还包括一个名为
carenergy
cars own
变量。有道理吗?我明白了!工作起来很有魅力。我试图制作一个显示器,计算汽车的能量来读取它,但是我不知道在记者的案例中应该写什么<代码>计算汽车能量
显示汽车能量
不起作用。可能尝试其中一辆汽车的
[汽车能量]
to move-cars
  ask cars [ 
    ifelse charging? [
      set charge-time charge-time + 1
      if charge-time > 14 [
        set energy 200
        set charging? false
        set charge-time 0
      ]
    ] [
      ifelse [pcolor] of patch-ahead 1 = red
      [ lt random-float 360 ]   ;; see red patch ahead turn left.
      [ fd 1 ]                  ;; otherwise it is ok to go.
      set energy energy - 1
    ]
  ]
end

to check-death ;; when low energy lawn mower will go back to house
  ask cars [
    ifelse energy >= 150
    [ set label "Energy ok" ]
    [ set label "Low Energy, returning to base"
      set target min-one-of houses [distance myself]
      face target
      ifelse distance target < 1
      [ move-to target 
        set charging? true
      ]
      [ fd 1 ]
    ]
  ]
end