NetLogo中为买家分配动态记忆访问所有卖家的实现问题
解决方案:给每个买家维护独立的已访问卖家列表
你现在的问题根源在于用了全局共享的patch属性visited?——所有买家共用同一套访问标记,一个买家把卖家标成已访问,其他人自然就看不到了。解决办法很简单:给每个买家单独维护自己的已访问卖家列表,别依赖全局的patch属性。
步骤1:调整Agent定义与初始化
建议把卖家从patch改成独立的breed(更符合NetLogo的Agent设计逻辑,后续扩展功能也方便),同时给每个买家添加专属的已访问卖家列表:
breed [ buyers buyer ] breed [ sellers seller ] ;; 新增卖家breed,替代原来的patch作为卖家 buyers-own [ target visited-sellers ;; 每个买家自己的已访问卖家列表,初始为空 ] to setup clear-all ;; 创建4个卖家,随机放置在patch上 create-sellers 4 [ set shape "circle" set color red move-to one-of patches ] ;; 创建多个买家,初始化各自的已访问列表为空 create-buyers 3 [ set shape "person" move-to one-of patches set visited-sellers [] ;; 初始化为空列表 ] reset-ticks end
步骤2:修改单个前往最近卖家的逻辑
每个买家只寻找不在自己已访问列表中的卖家,完成交易后把该卖家加入自己的列表:
to go-to-nearest-seller ask buyers [ ;; 筛选出当前买家没访问过的卖家 let available-sellers sellers with [ not member? self [visited-sellers] of myself ] if any? available-sellers [ let nearest-seller min-one-of available-sellers [distance myself] move-to nearest-seller ;; 把这个卖家加入自己的已访问列表 set visited-sellers lput nearest-seller visited-sellers ] ] end
步骤3:修改遍历所有卖家的逻辑
每个买家独立遍历自己未访问的卖家,直到自己的已访问列表包含所有卖家:
to visit-all-sellers ask buyers [ ;; 只要还有没访问过的卖家,就继续找 while [ any? sellers with [ not member? self [visited-sellers] of myself ] ] [ let available-sellers sellers with [ not member? self [visited-sellers] of myself ] let nearest-seller min-one-of available-sellers [distance myself] move-to nearest-seller set visited-sellers lput nearest-seller visited-sellers ] ] end
关键说明
- 用
buyers-own [visited-sellers]替代全局的patches-own [visited?],每个买家有独立的访问记录,互相不干扰。 - 改用
sellers breed替代patch作为卖家,Agent职责更清晰,后续要加卖家的库存、价格这类属性时更方便。 - 用
member?检查卖家是否已被当前买家访问,lput把新访问的卖家追加到列表末尾。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

