Netlogo上的寻路——机器人割草机模拟项目

Netlogo上的寻路——机器人割草机模拟项目,netlogo,path-finding,Netlogo,Path Finding,我试图在Netlogo上模拟机器人割草机。我的目标是: 它随机地在绿色斑块(草)上进行切割(绿色变为灰色) 当电池电量不足时,它会找到回家的路给自己充电 它不会离开由红色斑块缩小的定义周界(花园),并绕过用户通过鼠标单击放置的障碍物 现在,我已经为我的两个首要目标准备了一个工作代码(感谢Luke!) 然而,在进入检查死亡步骤后,让割草机尊重我不使用红色补丁的愿望变得越来越复杂。 事实上,它似乎没有考虑到我以前在移动汽车步骤中的命令 有人告诉我,如果我想让它在墙壁周围导航,它实际上会非常复杂,

我试图在Netlogo上模拟机器人割草机。我的目标是:

  • 它随机地在绿色斑块(草)上进行切割(绿色变为灰色)
  • 当电池电量不足时,它会找到回家的路给自己充电
  • 它不会离开由红色斑块缩小的定义周界(花园),并绕过用户通过鼠标单击放置的障碍物
现在,我已经为我的两个首要目标准备了一个工作代码(感谢Luke!)

然而,在进入
检查死亡
步骤后,让割草机尊重我不使用红色补丁的愿望变得越来越复杂。 事实上,它似乎没有考虑到我以前在
移动汽车步骤中的命令

有人告诉我,如果我想让它在墙壁周围导航,它实际上会非常复杂,需要某种寻路

通过我的研究,我发现了一些关于所谓A*的文档。 我很理解算法的概念,但是在Netlogo上翻译它对我来说非常困难。到目前为止,我在没有课程的情况下所做的是相当基本的,基于现有的规范,并遵循我得到的建议。但从现在起,为我的代码修改A*会让我头发掉光。我希望通过理解如何在代码中实现寻路,最终能够理解Netlogo的复杂性。 我知道有些人不想详细解释它是如何工作的。我只是希望找到一个足够有耐心的人,一步一步地向我解释A*是如何工作的

非常感谢

这是我的密码:

breed [cars car]
cars-own [target charging? charge-time car-energy]

breed [houses house]
to setup
  clear-all
  setup-patches
  setup-cars
  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 garden perimeter
  ]
end

to setup-cars

  set-default-shape cars "car"
create-cars 1 [
    setxy 8 8 ;; Place the lawn mower near the house
    set target one-of houses
    set charging? false
    set car-energy energy
  ]
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 ;; Permits the user to place red patches as new obstacles in garden.
  ]
end


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

to move-cars
  ask cars [
    ifelse charging? [
      set charge-time charge-time + 1 ;; Counts the time spent to charge
      if charge-time > 15 [ ;; Defined charge time here
        set car-energy 1000
        set charging? false
        set charge-time 0
      ]
    ] [
      ifelse [pcolor] of patch-ahead 1 = red
      [ lt random-float 360 ]   ;; See a red patch ahead : turn left randomly
      [ fd 1 ]                  ;; Otherwise, its safe to go foward.
      set car-energy car-energy - 1
    ]
  ]
end

to cut-grass
  ask cars [
    if pcolor = green [ ;; cut grass (green patches go grey)
      set pcolor gray
    ]
  ]
end

to check-death ;; checking battery level
  ask cars [
    ifelse car-energy >= 300
    [ 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
        set label "Charging"
      ]
      [ fd 1 ]
    ]
  ]
end
品种[汽车]
汽车自有[目标充电?充电时间汽车能量]
繁殖[房屋]
设置
清除所有
安装补丁
设置车辆
安置所
重置滴答声
结束
设置修补程序
询问补丁[设置颜色为绿色];;设置草地补丁
问补丁[
pxcor=最大pxcor或
pxcor=最小pxcor或
pycor=最大pycor或
pycor=最小pycor][
设置P颜色红色;;设置花园周长
]
结束
安装汽车
将默认形状汽车设置为“汽车”
创造汽车1[
把割草机放在房子附近
把目标定在一栋房子上
设置充电?错误
设置汽车能量
]
结束
安家
将默认形状房屋设置为“房屋”
询问补丁7 8[发芽屋1]
结束
砌墙
如果鼠标落下?[
询问补丁鼠标xcor鼠标ycor[设置颜色为红色]
显示;;允许用户在花园中放置红色斑块作为新障碍物。
]
结束
外带
搬家
割草
制止死亡;;验证电池电量的百分比。
打上钩
结束
搬家
问车[
还有别的收费吗[
设置充电时间充电时间+1;;统计充电所用的时间
如果充电时间>15[;;此处定义充电时间
将汽车能量设置为1000
设置充电?错误
设置充电时间为0
]
] [
前方补丁的ifelse[pcolor]1=红色
[lt random float 360];;看到前面的红色补丁:随机左转
[fd 1];;否则,向前走是安全的。
设置汽车能源汽车能源-1
]
]
结束
割草
问车[
如果pcolor=绿色[;;割草(绿色斑块变为灰色)
设置颜色为灰色
]
]
结束
制止死亡;;检查电池电量
问车[
ifelse汽车能量>=300
[设置标签“能量正常”]
[设置标签“低能量,返回基地”
设定目标最小一间房子[距离我自己]
面对目标
ifelse距离目标<1
[移动到目标
设置充电?正确
设置标签“充电”
]
[fd 1]
]
]
结束

相关:相关: