比较列表中的值

Comparing values within lists

我是 Whosebug 的新手,但对我的模型有疑问。

我的模型由两类主体(渔民和加工商)组成。目前我有两个渔民和两个加工商。这两个品种都有一个特定的价格感知变量,称为:价格感知渔民和价格感知处理器。渔民外出捕鱼,一旦船满了(渔获量 = 750),他们 return 就交给其中一个处理商。这是通过这个函数完成的:

to return-from-fishing ;; makes fishers return once they have a certain amount of fish 
  if epi-catch >= 1000 or exp-meso-catch >= 750                          
    [move-to one-of processors     
     set arrived-at-processor? true
     ]
end

我想做的是将渔民的价格感知与渔民访问的加工商的价格感知进行比较。

目前我尝试通过创建两个列表来做到这一点;一种是加工商的价格感知,另一种是渔民的价格感知。我使用 list-transactions (map > list-of-fishers-price-perceptions list-of-processors-price-perceptions)

来比较它们

这样做是遍历两个列表并比较列表中的值。然而,问题是这些值是随机比较的,我希望渔民将他自己的价格与他访问的加工商的价格进行比较。如果 price-perception-fisher 高于 price-perception-processors fisher 移动到另一个处理器,否则他们将执行交易

我的模型示例如下:

海龟的变量初始化如下:

   set fisher 0 price-perception-fisher 12.5 
   set fisher 1 price-perception-fisher 15
   set processor 2 price-perception-processor 10 
   set processor 3 price-perception-processor 15

当渔民随机移动到其中一个处理器时,两个渔民都可以移动到处理器 2。预期输出将是:

fisher 0 (12.5) 移动到处理器 2 (10) 并且 12.5 >= 10,该值应该为真

fisher 1 (15) 移动到处理器 2 (15) 并且 15 >= 15,该值应该为真

但是我得到了这个输出,因为列表不明白渔民已经转移到处理器 2,因此他们将 price-perception-fisher 0 与 price-perception-processor 3 进行比较,而我想要在这种情况下,price-perception-fisher 0 与 price-perception-processor 3 之间的比较。

[15 12.5] ; fishers price perceptions
[10 15] ; processors price perceptions
[true false]

有办法吗?

你把它复杂化了:让每只乌龟直接查看处理器的价格感知。不需要考虑所有海龟和所有处理器的值。

有几种方法可以做到这一点。

如果绝对和结构上确定每个补丁永远不会超过一个处理器,您可以这样做:

to check-perceptions
  ask fishers with [arrived-at-processor?] [
    ifelse (price-perception-fisher < [price-perception-processor] of one-of processors-here)
      [perform-transaction]
      [find-another-processor]
  ]
end

processors-here 报告者(参见 here)报告一个代理集。如果您确定每个补丁不能有超过一个处理器,这意味着 one-of processors-here 将不可避免地报告渔民正在访问的处理器,因为它将是唯一填充 processors-here 代理集的处理器。

如果您希望避免这种方法,因为您不喜欢在知道只想引用特定代理时使用代理集,则可以采用另一种方法添加 fishers-own 变量:

fishers-own [
  ; ...
  ; Here there are the other fishers-own variables
  ; ...
  current-processor
]

to return-from-fishing
  if epi-catch >= 1000 or exp-meso-catch >= 750 [
    set current-processor one-of processors
    move-to current-processor
    set arrived-at-processor? TRUE
  ]
end


to check-perceptions
  ask fishers with [arrived-at-processor?] [
    ifelse (price-perception-fisher < [price-perception-processor] of current-processor)
      [perform-transaction]
      [find-another-processor]
  ]
end

这样,current-processor 将避免任何歧义,如果每个补丁有一个以上的处理器,即使从逻辑的角度来看,它也将是一个专门用于识别代理的变量(而不是代理集)。

当然,万一find-another-processor被执行了,需要记得将新的处理器分配给current-processor