Netlogo 根据turtle'创建链接;s属性

Netlogo 根据turtle'创建链接;s属性,netlogo,agent-based-modeling,Netlogo,Agent Based Modeling,我有两个海龟品种(产品和消费者),每个品种都有一个三维列表,定义它们的需求(消费者)和属性(产品) 我想要的是让每个消费者(我)寻找满足他们所有需求的产品,并与他们建立联系。如果该产品不存在,我希望他们(ii)放弃价值最低的一种需求,寻找满足其他两种需求的产品。如果该产品不存在,那么我希望他们(iii)寻找另一种只满足最高价值需求的产品 因此,假设消费者20有需求[0.20.50.3]。如果他们发现一个产品与属性列表[0.2 0.5 0.3]完全相同我希望链接发生。如果没有这样的产品,那么我希望

我有两个海龟品种(
产品
消费者
),每个品种都有一个三维列表,定义它们的
需求
(消费者)和
属性
(产品)

我想要的是让每个消费者(我)寻找满足他们所有需求的产品,并与他们建立联系。如果该产品不存在,我希望他们(ii)放弃价值最低的一种需求,寻找满足其他两种需求的产品。如果该产品不存在,那么我希望他们(iii)寻找另一种只满足最高价值需求的产品

因此,假设
消费者20
需求[0.20.50.3]
。如果他们发现一个
产品
属性列表[0.2 0.5 0.3]完全相同
我希望链接发生。如果没有这样的产品,那么我希望消费者忽略最低值(
0.2
,在示例中)并查找具有
属性[xx 0.5 0.3]
,其中
xx
代表“任意”的产品

使用SO中其他地方的示例,我拼凑了以下代码(几乎!)完成了技巧的第一部分(I),但尽管付出了多次努力,仍然无法完成(ii)和(iii)。有人知道怎么做吗

breed [consumers consumer]
breed [products product]

consumers-own [
 needs
]

products-own [
 attributes
 number-buyers
]

to setup
 ca
 create-consumers 100 [ setxy random-xcor random-ycor]
 create-products 100 [ setxy random-xcor random-ycor]
 set-default-shape consumers "person"
 set-default-shape products "box"
 ask consumers [
   set needs n-values 3 [ precision (random-float 1) 1 ]
 ]
 ask products [
   set attributes n-values 3 [ precision (random-float 1) 1 ]
 ]
 reset-ticks
end

to go
 buy
 tick
end

to buy
 ask links [ die ]
 ask consumers [
   carefully [ create-link-with one-of products with [reduce and (map = attributes [ needs ] of myself)] ] [ show "how do I find a sub-optimal product by ignoring my need with the lowest value ?" ]
 ]
 ask products [
   set number-buyers count link-neighbors 
 ]
end

你想得太多了——只需检查两个列表是否相同即可。然而,几乎完全匹配的情况要复杂一些。下面是一个完整的示例模型,它在最低的项目列表中找到位置,然后检查其他项目是否相同

breed [consumers consumer]
breed [products product]

consumers-own [
 needs
]

products-own [
 attributes
 number-buyers
]

to setup
  clear-all
  ask patches [set pcolor white]
  create-consumers 10
  [ setxy random-xcor random-ycor
    set shape "person"
    set color blue
    set needs n-values 3 [ one-of [1 2 3] ] 
  ]
  create-products 10
  [ setxy random-xcor random-ycor
    set shape "box"
    set color red
    set attributes n-values 3 [ one-of [1 2 3] ]
  ]
  reset-ticks
end

to go
  ask consumers [buy]
  tick
end

to buy    ; set up as turtle procedure for testing purposes
  ask my-links [ die ]
  let candidates products with [attributes = [needs] of myself]
  ifelse any? candidates
  [ create-link-with one-of candidates ]
  [ type self type " attributes: " type needs print " no matches"
    let lowpoint position (min needs) needs ; note will take first if two equal min
    set candidates products with
    [ ((item 0 attributes = item 0 [needs] of myself) or lowpoint = 0) and
      ((item 1 attributes = item 1 [needs] of myself) or lowpoint = 1) and
      ((item 2 attributes = item 2 [needs] of myself) or lowpoint = 2)
    ]
    ifelse any? candidates
    [ create-link-with one-of candidates ]
    [ print "no almost-match available" ]
  ]
end
我创建了要链接的潜在产品的代理集(称为候选者),然后创建了链接。这使得代码更具可读性。如果没有找到匹配项,它还允许
如果有?
构造。它还使调试变得更容易,因为您可以将报告匹配数和类似数据的打印语句放入其中。我建议,如果你正在应用某种限制选择的条件,你总是这样做


此外,您还有一个三项列表,每个项目有10个可能的值。这意味着将有1000个组合。您只有100个消费者和100种产品,因此匹配将非常罕见。

如何确定值?例如,需求是按值排序的(对消费者),还是存储在3D列表中的值,或者项目是否具有外部设置的值?另外,请显示示例消费者列表和示例产品属性,以便我们可以查看数据结构。您的代码还包括特性、购买意图,但您的问题中没有对它们进行描述。您好@JenB,谢谢!我已经添加了代码的所有相关部分(应该是自定义的),并确保它在我给变量命名方面是一致的。希望现在更清楚了!对不起,我还是不明白。每个消费者都有一个列表,其中包含集合{0.0、0.1、…0.9}中的3个值,每个产品都有一个类似的属性列表。您希望消费者与满足其需求的产品建立链接,但您没有解释或给出示例。您的意思是产品的项目0的值至少等于列表中其他项目的需求的项目0的值,依此类推?如果找不到,请删除最小的数字,只匹配列表中的其他两个值?是的,这听起来很像我所追求的,只是我希望
项0
(和其他项)的值完全相同。。。仔细想想,我意识到,
使用[reduce and(map=attributes[needs]of my)]创建与其中一款产品的链接
并不能完全做到这一点,因为
reduce
位可以给出不同的组合,从而得到相同的结果数。。。我为这个问题添加了一个例子,希望它能让问题更清楚,但请不要犹豫,询问更多细节:)太好了,非常感谢。我曾尝试在没有
map
reduce
的情况下执行此操作,但始终无法获得正确的语法。尽管同意代码更直观,更易于调试。对可能的组合采取的观点!