Routes Netlogo:如何使用route变量沿路径实际移动

Routes Netlogo:如何使用route变量沿路径实际移动,routes,netlogo,Routes,Netlogo,我用两种海龟,汽车和房子。两者都是随机定位的。 我的目标是从一个组合的路线向量开始为每辆车找到一条路线,让每辆车移动并访问分配给它的每一个家庭。 首先,我根据组合路线向量为每辆车创建一条路线。 我在下面展示我的代码。 但现在,我试着让汽车沿着各自的路线行驶 globals [ route-vector ] breed [carr car] breed [hous housess] carr-own [ route ] to setup clear-all create-carros creat

我用两种海龟,汽车和房子。两者都是随机定位的。 我的目标是从一个组合的路线向量开始为每辆车找到一条路线,让每辆车移动并访问分配给它的每一个家庭。 首先,我根据组合路线向量为每辆车创建一条路线。 我在下面展示我的代码。 但现在,我试着让汽车沿着各自的路线行驶

globals [ route-vector ]
breed [carr car]
breed [hous housess]
carr-own [ route ]

to setup
clear-all
create-carros
create-casas
make-routes
end

to create-carros
create-carr cars [ set color green ]
ask carr  [
set shape "car"
set size 1.5
setxy random-xcor random-ycor
 ]
end

to create-casas
create-hous house [ set color red ]
ask hous  [
set shape "house"
set size 1.5
setxy random-xcor random-ycor
]
end


to make-routes
set route-vector [ 3 4 5 6 7 0 1 2 0 1 ] ;5 10 15 20 25
let houses sublist route-vector 0 (length route-vector / 2 )
let carlist sublist route-vector (length route-vector / 2 ) (length route-
vector)
ask carr [ set route [] ]
(foreach carlist houses
 [ [the-car the-house] ->
  ask carr with [who = the-car] [ set route lput the-house route ]
 ]
  )
 end

 to go
  ask carr  [
    ;; if at target, choose a new random target
    ;        if distance route = 0
     ;          [ set route one-of route-vector
     ;            face route ]
    ;        ;; move towards target.  once the distance is less than 1,
     ;        ;; use move-to to land exactly on the target.
    ;        ifelse distance route < 1

    ;let mylist [1 2 3]
     ;foreach route
     face route
     fd 1
;print map last filter first route
    ;    face housess 3
     ;    fd 1

     ;    move-to one-of route
     ;    fd 1

      ]
     ; move-to housess 3
       ;fd 1

      ;tick
      end
globals[路由向量]
品种[卡尔汽车]
繁殖[豪斯豪斯斯斯]
卡尔自己的[路线]
设置
清除所有
创造卡洛斯
创建casas
定路线
结束
创造卡洛斯
创建卡尔汽车[设置绿色]
问问卡尔[
设定形状“汽车”
套装尺寸1.5
setxy随机xcor随机ycor
]
结束
创建casas
创建hous house[设置红色]
问好[
定形“房子”
套装尺寸1.5
setxy随机xcor随机ycor
]
结束
定路线
设置路由向量[3 4 5 6 7 0 1 2 0 1];5 10 15 20 25
let houses子列表路径向量0(长度路径向量/2)
设carlist子列表路径向量(长度路径向量/2)(长度路径-
矢量)
询问卡尔[设置路线[]]
(foreach carlist houses)
[car the house]->
向卡尔询问[谁=汽车][设定路线L而不是房屋路线]
]
)
结束
外带
问问卡尔[
;如果在目标位置,则选择一个新的随机目标
;如果距离路线=0
[将路线设置为路线向量之一
;正面路线]
向目标移动。一旦距离小于1,
使用“移动”精确地落在目标上。
;ifelse距离路线<1
;让我列出[1 2 3]
每条路线
工作面路线
fd 1
;打印地图最后一个过滤器第一条路线
;面屋3号
;fd 1
;移动到其中一条路线
;fd 1
]
; 搬到3号楼
;fd 1
;打上钩
结束
我想使用route变量沿路径实际移动。 但我不知道如何通知每辆车各自的路线,并让他们搬回家

我试着只在一辆车上使用go按钮

做: 问车1 [ 工作面路线 fd 1 但总是得到错误(“FACE”期望输入是代理,但得到 改为列出[4 7]。) ] 结束

在这种情况下,我想让1号车先移动到4号楼,然后再移动到7号楼,然后再回到原来的位置。。。 我试过几种方法,但找不到解决办法。我试着分开做,我从每辆车的“路线”列表中选择了第一个项目,但我仍然无法


如果有人能帮助我,我真的很感激。谢谢

使用
who
数字为海龟编制索引可能会导致问题-在这种情况下,您将遇到无法真正动态更新列表的问题,因为
hous
carr
数字完全基于它们的创建顺序。如果可能的话,将海龟直接存储在列表中要好得多。使用您的安装程序的修改版本查看此示例:

globals [ route-vector ]
breed [carr car]
breed [hous housess]
breed [spawns spawn]
carr-own [ route route-counter spawn-target target]

to setup
  clear-all
  create-carros
  create-casas
  make-routes
  reset-ticks
end

to create-carros
  create-carr 3 [ set color green ]
  ask carr  [
    set size 1.5
    setxy random-xcor random-ycor

    ; set up a 'route-counter' to act as an index for a car's route
    set route-counter 0
    set target nobody
    set route []    
    pd
  ]

  ; hatch a 'spawn-target' turtle that can be used to return
  ; the carr back to their starting position
  ask carr [    
    hatch 1 [
      set breed spawns
      ht
    ]
    set spawn-target one-of other turtles-here with [ 
      xcor = [xcor] of myself
    ]
  ]
end

to create-casas
  create-hous 5 [ set color red ]
  ask hous  [
    set shape "house"
    set size 1.5
    setxy random-xcor random-ycor
  ]
end
现在,不要依赖
who
数字来索引房屋,而是直接在
carr
路线中使用房屋列表:

to make-routes
  ; Just use the car-order 
  let car-order [ 0 1 2 0 1 ] 

  ; Create a list of hous directly by sorting them
  let houses sort hous

  ; Your same foreach procedure, but in this case the carr
  ; are storing the house in the list directly to avoid
  ; indexing problems
  ask carr [  ]
  (foreach car-order houses
    [ [the-car the-house] ->
      ask carr with [who = the-car] [ set route lput the-house route ]
    ]
  )
end
然后,
carr
可以根据
route counter
的索引值在其路线上迭代选择一个新目标(其
繁殖目标有一个小的中断)

这仍然不是超级程序化的,因为你依赖于你的汽车订单与你的房屋数量一样长,但我不确定你到底想做什么,也许它会起作用

编辑

根据-如果你必须使用
who
编号,你仍然可以使用“繁殖目标”示例让海龟返回其起始位置-只要在
carr
hous
产卵后发生即可。同样,这绝对不是理想的,因为如果你不注意产卵顺序、卡尔的数量等,你的模型可能会“破裂”

因此,基本的
设置
创建casas
过程如上所述,并将其作为新的
创建CAROS
过程:

to create-carros
  create-carr 3 [ set color green ]
  ask carr  [
    set size 1.5
    setxy random-xcor random-ycor

    ; set up a 'route-counter' to act as an index for a car's route
    set route-counter 0
    set target nobody
    set route []
    pd
  ]
end
现在,您的
make routes
可以包含
spawn
目标海龟(此示例中有您评论中的无序房屋):

然后,上面的
go
过程应该可以正常工作,没有任何更改

编辑2

让您的carr停止的一个简单方法是设置一个逻辑标志,以便只有满足特定条件的carr才会移动。考虑修改后的<代码>汽车自身<代码> >代码>创建CARROS安装:< /P>
carr-own [ route route-counter spawn-target target route-complete? ]

to create-carros
  create-carr 3 [ set color green ]
  ask carr  [
    set size 1.5
    setxy random-xcor random-ycor

    ; set up a 'route-counter' to act as an index for a car's route
    set route-counter 0
    set target nobody
    set route []
    set route-complete? false
    pd
  ]
end
这里,我们现在有一个名为
route complete?
的布尔(逻辑)变量,对于所有新的carr,该变量设置为
false
。现在,您可以在
go
过程中添加一行,该行表示“只有
路线完成的车辆?
设置为false时,才执行这些操作。”

您会注意到,在
移动到
块中有一个修改的位,如果
carr
移动回其起始位置,它还会将其
路由完成?
设置为
真,以便下次调用
go
时,
carr`不会移动


请注意,如果您希望
carr
在他们的路线上运行一定次数,您可以将
route complete?
更改为计数器,而不是真/假。

提前感谢您的帮助。你的代码在汽车的祈祷声中完美运行。但是我得到了网络日志之外的路径向量,即我需要使用完整的向量路径向量[3 4 5 6 7 0 1 2 0 1]。我使用上面的代码,将每辆车的路线向量分开,也就是说,车0的路线=[3 6]车1的路线=[4 7]车2的路线=[5],然后所有的车都应该回到它们的起始位置。我不能做的是让这些车回到它们各自的房子,回到起始位置。
to make-routes
  set route-vector [4 7 6 3 5 0 1 2 0 1]
  let houses sublist route-vector 0 (length route-vector / 2 )
  let carlist sublist route-vector (length route-vector / 2 ) (length route-vector)

  (foreach carlist houses
    [ [the-car the-house] ->
      ask car the-car [ 
        set route lput ( housess the-house ) route 
      ]
    ]
  )

  ; hatch a 'spawn-target' turtle that can be used to return
  ; the carr back to their starting position
  ask carr [
    hatch 1 [
      set breed spawns
      ht
    ]
    set spawn-target one-of other turtles-here with [
      xcor = [xcor] of myself
    ]
  ]
end
carr-own [ route route-counter spawn-target target route-complete? ]

to create-carros
  create-carr 3 [ set color green ]
  ask carr  [
    set size 1.5
    setxy random-xcor random-ycor

    ; set up a 'route-counter' to act as an index for a car's route
    set route-counter 0
    set target nobody
    set route []
    set route-complete? false
    pd
  ]
end
to go
  ; ask carr with route-complete set to false
  ask carr with [ not route-complete? ] [

    ; If a car has no target, set the target to the
    ; item indexed by 'route-counter'
    if target = nobody [
      set target item route-counter route
    ]

    face target
    ifelse distance target > 1 [
      fd 1
    ] [
      move-to target

      ; Only advance the route counter if the current target
      ; was not the original spawn point. ADDITIONALLY,
      ; if the target is the starting target, set route-complete?
      ; to true for that carr
      ifelse target != spawn-target [
        set route-counter route-counter + 1
      ] [
        set route-complete? true
      ]
      set target nobody
    ]

    ; If the route counter would index outside of the
    ; list boundaries, reset it to 0
    if route-counter > length route - 1 [
      set route-counter 0
      set target spawn-target
    ]
  ]
  tick
end