在 netlogo 中为海龟分配排名数字

Assigning turtles a ranked number in netlogo

我正在尝试为海龟分配一个数字,我可以告诉它们按顺序移动。使用以前的帖子和一些一般的玩耍,我已经成功地创建了海龟的排名顺序列表,但现在我想根据海龟在该列表中的相对位置为海龟分配一个数字。

示例: 当前列表:[(turtle 8) (turtle 1) (turtle 9) (turtle 0)] 所需的乌龟名称:乌龟 8 = 1,乌龟 1 = 2,乌龟 9 = 3,等等

到目前为止我已经达到:

globals [rank_list]
turtles-own [var.
            rank]
set rank_list sort-on [var.] turtles

create-turtles (50)
 [setxy (random-float max-pxcor) (random-float max-pycor)
 set var. random-normal 0.5 0.175
  if var. > 1 [set sociability 0.99999999]
  if var. < 0 [set sociability 0.00000001]
foreach rank_list ask ? [set rank ...     ;this is where I get stumped 

to go 
ask turtles [foreach rank [ask ? [move]]]
end

非常感谢任何有关根据列表中的排名顺序分配值的提示!

您可以使用 n-values 生成排名和 foreach 的可变版本同时循环遍历 rank-list 和排名:

turtles-own [ var rank ]

to setup
  clear-all
  create-turtles 50 [
    setxy random-pxcor random-pycor
    set var random-normal 0.5 0.175
  ]
  let rank-list sort-on [ var ] turtles
  let ranks n-values length rank-list [ ? ]
  (foreach rank-list ranks [ ask ?1 [ set rank ?2 ] ])
end

但问题是:你真的需要一个rank变量吗?为什么不直接使用rank-list

foreach rank-lisk [ ask ? [ move ] ]

或者甚至每次都在 var 上对海龟进行分类:

foreach (sort-on [ var ] turtles) [ ask ? [ move ] ]

后者不是最有效的,但如果你只有 50 只海龟并且每个 tick 只这样做一次,你永远不会注意到差异。

使用上面 Nicolas 的回答,我已经实现了目标或排名移动。对于我正在使用的 2000 只海龟来说,它仍然有点耗费处理能力,但至少它可以运行!

turtles-own [var]

to ranking
let rank-list sort-on [var] turtles
let ranks n-values length rank-list [ ? ]
    (foreach rank-list ranks [ask ?1 [set var ?2] ] )
end

to make_turtles
    create-turtles (5)
    [set var random-normal 0.5 0.2
      set color scale-color blue var 0 1
      set size 3]
     ranking
     ask turtles [set label var]

     end

to move
 let rank-list sort-on [var] turtles
ask turtles [foreach rank-list [ask ? [ forward random 9]]]
end

to setup
  clear-all
  make_turtles

end
to go
  move
end