Netlogo:从变量值中选择一个代理 运行 一个过程

Netlogo: Choosing an agent to run a procedure from variable values

我正在创建一个类似于出租车的模拟,车辆可以在其中搜索客户。当车辆在客户的 1 个单位距离内时,它会接走客户并将其带到目的地(并再次开始搜索客户等)。

我的问题:如果 2 辆车在同一时间步长内进入同一客户的 1 个单位距离内,我需要具有最高 [rating](车辆自有变量)的车辆才能始终吸引客户。这是我的代码(从之前的 post 更新而来):

    to find-customers
         if (distance closest-customer <= 1)
         [ask closest-customer [check-for-vehicles]]
    end  

    to check-for-vehicles
         set competitors vehicles in-radius 1
         determine-highest-rated
    end  

    to determine-highest-rated
         set highest-rated max-one-of competitors [rating]
         ask highest-rated [set color red] 
    end

[竞争对手] 和 [最高评价] 是等待客户自己的变量。 closest-customer 是 min-one waiting-customers(距离我自己)。通常 [set color red] 会 运行 车辆获取客户运输信息的过程。当将两辆车强加给同一个客户时,正确的车辆总是将其颜色设置为红色。有时错误的车辆也会将其颜色设置为红色。当我检查等待顾客的变量值时,正确的车辆被识别为最高评级,但有时另一辆车仍然变成红色。我设置程序的方式显然有误。如果有人对如何解决此问题(或如何以不同的方式处理此任务)提出建议,我们将不胜感激。

我认为你的 ifelse 总是 return false 的原因是因为 ifelse 被放置在与每个出租车的 identification 初始化相同的时间步.

当 运行将某些功能连接到代理集时,netlogo 的工作方式是,每个代理一个接一个地 运行 以随机顺序单独执行功能,而不是在同一时间。

所以,如果 ifelse 刚好放在 identification 设置之后,并且在同一个函数中,它总是 return false,因为其他车辆还没有他们的标识集呢。然后它会直接 运行 make-deal 甚至在与其他车辆进行比较之前。

例如:

ask vehicle [
   set identification ...
   ifelse ... [..]
   [..]
]

不同于

ask vehicle [set identification ...]
ask vehicle [ifelse .... [...][...] ]

第一个会让每个代理设置他们的身份并在让其他代理做之前做ifelse语句。 第二个将使每个代理首先设置他们的身份,然后让每个代理执行 ifelse 语句。

结论是,我建议你把find-costumer功能和make-deal功能分开。

希望对您有所帮助