List NetLogo按特定值对代理列表进行排序

List NetLogo按特定值对代理列表进行排序,list,netlogo,List,Netlogo,我有一个有5000多名农民和几家工厂的模型。有时会建造一个新工厂,在这一点上,我希望工厂执行以下操作: 创建一个包含所有农民的列表,然后根据农民到工厂的距离(从低到高)对该列表进行排序 我试过用桌子做这个 ask factory 1 [ask farmers [set distance-to-factory distance myself]] ask factory 1 [set a table:group-agents farmers [distance-to-factory]] 但是,生成

我有一个有5000多名农民和几家工厂的模型。有时会建造一个新工厂,在这一点上,我希望工厂执行以下操作:

创建一个包含所有农民的列表,然后根据农民到工厂的距离(从低到高)对该列表进行排序

我试过用桌子做这个

ask factory 1 [ask farmers [set distance-to-factory distance myself]]
ask factory 1 [set a table:group-agents farmers [distance-to-factory]]
但是,生成的代理集不是从低到高排序的,反之亦然。此外,我希望工厂能够在事后要求订购表(或列表)中的单个代理执行以下操作:

在根据农民到工厂的距离对他们进行排序后,我希望工厂能够要求该列表中的农民交付他们的货物(即,首先询问最接近的农民,但如果没有货物,则询问第二接近的农民,依此类推)


非常感谢你的帮助

您需要为工厂创建一个代理变量,该变量按距离顺序存储农民列表。这是一个完整的例子,运行它并检查一个工厂,让自己相信它是有效的

breed [factories factory]
breed [farmers farmer]

factories-own [my-farmers]

to setup
  clear-all
  create-farmers 100
  [ setxy random-xcor random-ycor
    set color yellow
    set shape "circle"
    set size 0.5
  ]
  create-factories 3
  [ setxy random-xcor random-ycor
    set color red
    set shape "house"
    set size 2
    initialise-factory
  ]
  reset-ticks
end

to initialise-factory
  set my-farmers sort-on [distance myself] farmers
end
查看初始化工厂程序。在
代理集上操作的
排序
原语
返回一个
列表
。而…的
[距离我自己]正在计算回工厂的距离(因为工厂正在做询问,因此
我自己
)。因此,列表按距离工厂的距离排序


创建列表后,使用列表过程(例如
原语)来询问特定的农民。

您需要为工厂创建一个代理变量,该变量按距离顺序存储农民列表。这是一个完整的例子,运行它并检查一个工厂,让自己相信它是有效的

breed [factories factory]
breed [farmers farmer]

factories-own [my-farmers]

to setup
  clear-all
  create-farmers 100
  [ setxy random-xcor random-ycor
    set color yellow
    set shape "circle"
    set size 0.5
  ]
  create-factories 3
  [ setxy random-xcor random-ycor
    set color red
    set shape "house"
    set size 2
    initialise-factory
  ]
  reset-ticks
end

to initialise-factory
  set my-farmers sort-on [distance myself] farmers
end
查看初始化工厂程序。在
代理集上操作的
排序
原语
返回一个
列表
。而…
[距离我自己]正在计算回工厂的距离(因为工厂正在做询问,因此
我自己
)。因此,列表按距离工厂的距离排序


创建列表后,您可以使用列表过程(例如
原语)执行询问特定农民的操作。

@JenB,谢谢您的帮助!我还发现可以按如下方式进行:

hatch factory 1 [
  ask farmers [set distance-to-factory distance myself]
  set my-farmers (sort-on [distance-to-factory] farmers)
]
然后,我设计了以下代码,用于从我的农民列表中询问:

let i 0
loop [
  if goods-delivered > capacity [stop]
  let closest-farmer-with-goods (item i my-farmers)
  ifelse [status] of closest-farmer-with-goods = 0 [ (; aka goods are not delivered yet to another factory) 
    set goods-delivered + [goods] of closest-farmer-with-goods
  ]
  [set i i + 1] ; *else*
]

但这使得模型相当缓慢。你知道如何使这更简单吗?

@JenB,谢谢你的帮助!我还发现可以按如下方式进行:

hatch factory 1 [
  ask farmers [set distance-to-factory distance myself]
  set my-farmers (sort-on [distance-to-factory] farmers)
]
然后,我设计了以下代码,用于从我的农民列表中询问:

let i 0
loop [
  if goods-delivered > capacity [stop]
  let closest-farmer-with-goods (item i my-farmers)
  ifelse [status] of closest-farmer-with-goods = 0 [ (; aka goods are not delivered yet to another factory) 
    set goods-delivered + [goods] of closest-farmer-with-goods
  ]
  [set i i + 1] ; *else*
]

但这使得模型相当缓慢。你知道如何使这变得更简单吗?

确实有多个工厂,到工厂的距离是到最近创建的工厂,但每个工厂的“我的农民”列表没有改变

我已经在以前版本的模型上使用了profiler扩展,但该扩展非常慢,因为每个工厂每次(每年一次)都会询问每个农民是否有商品:

let closest-farmer (min-one-of farmers with [status = 0] [distance myself])
这就是为什么我想到每家工厂都要从最近的到最远的创建一个农民名单,这样工厂就可以浏览这个名单。下面是一段更详细的代码,我希望这能帮助您获得更好的图像

breed [factories factory]
breed [farmers farmer]

globals [
  count-down 
  total-capacity-factories 
  price-goods
]

farmers-own [
  area 
  goods-per-area 
  goods 
  distance-to-factory 
  status
]

factories-own [
  my-farmers 
  goods-delivered 
  capacity
  revenues-this-year
  total-revenues
]

to setup
  clear-all
  create-farmers 1000 [
    setxy random-xcor random-ycor
    set area one-of [10 50 100]
    set goods-per-area one-of [5 10 15]
    set color yellow
    set shape "circle"
    set size 0.5
  ]
  create-factories 20 [
    setxy random-xcor random-ycor
    set color red
    set shape "house"
    set size 2
    initialise-factory
  ]
  set market-demand-goods 250000
  set total-capacity-factories sum [capacity] of factories
  set count-down 11
  reset-ticks
end

to go
  if count-down = 11 [
    change-market-demand
    ask farmers [
      set status 0
      set goods 0
    ]
  ]
  if count-down = 10 [
    ask farmers [
      sow-seeds
    ]
  ]
  if count-down = 5 [
    if market-demand-goods - [capacity] of one-of factories > total-capacity-factories [
      build-factory
    ]
  ]
  if count-down = 2 [
    ask farmers [ 
      harvest-goods
    ]
    ask factories [
      receive-harvested-goods
      sell-goods
    ]
  ]
  set count-down count-down - 1
  if count-down = 0 [
    set count-down 11
  ]
end

to initialise-factory
  set capacity 10000
  ask farmers [
    set distance-to-factory distance myself
  ]
  set my-farmers (sort-on [distance-to-factory] farmers)
end

to change-market-demand
  let chance random 100
  if chance < 33 [
    set market-demand-goods market-demand-goods - 50000
  ]
  if chance >= 33 and chance < 66 [
    set market-demand-goods market-demand-goods + 10000
  ]
  if chance >= 66 [
    set market-demand-goods market-demand-goods + 50000
  ]
  let chance2 random 100
  if chance2 < 50 [
    set price-goods price-goods + 1
  ]
  if chance2 >= 50 [
    set price-goods price-goods - 1
  ]
end

to sow-seeds
  set color brown
end

to build-factory
  loop [
    if total-capacity-factories >= market-demand-goods [stop]
    create-factory 1 [
      setxy random-xcor random-ycor
      set color red
      set shape "house"
      set size 2
      initialise-factory
      set total-capacity-factories (total-capacity-factories + [capacity] of myself
    ]
end

to harvest-goods
  set goods area * goods-per-area
end

to receive-harvested-goods
  let i 0
  loop [
    if goods-delivered >= capacity [stop]
    let closest-farmer-with-goods (item i my-farmers)
    ifelse [status] of closest-farmer-with-goods = 0 [
      set goods-delivered + [goods] of closest-farmer-with-goods
      ask closest-farmer-with-goods [
        set status "goods-delivered"
      ]
    ]
    [set i i + 1]
  ]
end

to sell-goods
  set revenues-this-year goods-delivered * price-goods
  set total-revenues total-revenues + revenues-this-year
end
品种[工厂]
养殖[农民]
全球的[
倒计时
工厂总产能
价格商品
]
农民拥有[
地区
每区货品
货物
到工厂的距离
地位
]
工厂拥有[
我的农民
交货
容量
今年的收入
总收入
]
设置
清除所有
创造农民1000人[
setxy随机xcor随机ycor
设置[10 50 100]中的一个区域
按[5 10 15]中的一个区域设置货物
设置颜色为黄色
设置形状“圆”
设置大小为0.5
]
创建工厂20[
setxy随机xcor随机ycor
设置颜色为红色
定形“房子”
2号套餐
初始化工厂
]
市场需求量为25万件
设置工厂总产能工厂总和[产能]
倒数11下
重置滴答声
结束
外带
如果倒计时=11[
改变市场需求
问农民[
设置状态0
集货0
]
]
如果倒计时=10[
问农民[
播种
]
]
如果倒计时=5[
如果市场需求货物-[产能]其中一家工厂>总产能工厂[
建厂
]
]
如果倒计时=2[
询问农民[
收获物
]
问工厂[
收成
卖货
]
]
设置倒计时-1
如果倒计时=0[
倒数11下
]
结束
初始化工厂
设置容量10000
问农民[
将距离设置为工厂距离
]
设置我的农民(按[到工厂的距离]农民排序)
结束
改变市场需求
让机会随机100
如果机会<33[
设置市场需求商品市场需求商品-50000
]
如果几率>=33且几率<66[
设置市场需求商品市场需求商品+10000
]
如果机会>=66[
设置市场需求商品市场需求商品+50000
]
让机会2随机100
如果机会2<50[
设置商品价格商品价格+1
]
如果机会2>=50[
商品定价商品价格商品-1
]
结束
播种
设置颜色为棕色
结束
建厂
环路[
如果工厂总产能>=市场需求货物[停止]
创建工厂1[
setxy随机xcor随机ycor
设置颜色为红色
定形“房子”
2号套餐
初始化工厂
设置总产能工厂(总产能工厂+我自己的【产能】
]
结束
收获货物
设置货物区域*每个区域的货物
结束
收成
让我0
环路[
如果交付的货物>=容量[停止]
让最近的农民带上货物(项目i我的农民)
ifelse[状态]