Debugging netlogo中的while循环调试

Debugging netlogo中的while循环调试,debugging,while-loop,netlogo,Debugging,While Loop,Netlogo,我在理解网络徽标项目中两个连续while循环出现的错误时遇到困难 ;;;;;;;;;;;;;;;;;;;;;;;; ;;; Global variables ;;; ;;;;;;;;;;;;;;;;;;;;;;;; globals [it] ;;;;;;;;;;;;;;;;;;;;;; ;;; Breedin agents ;;; ;;;;;;;;;;;;;;;;;;;;;; breed [houses house] breed [firms firm] ;

我在理解网络徽标项目中两个连续while循环出现的错误时遇到困难

;;;;;;;;;;;;;;;;;;;;;;;;
;;; Global variables ;;;
;;;;;;;;;;;;;;;;;;;;;;;;

globals [it]              

;;;;;;;;;;;;;;;;;;;;;;
;;; Breedin agents ;;; 
;;;;;;;;;;;;;;;;;;;;;;

breed [houses house]
breed [firms firm]

;;;;;;;;;;;;;
;;; Setup ;;;
;;;;;;;;;;;;;

to setup
  clear-all
  reset-ticks
  create-firms F
  create-houses H          

  ;; sets position of the firms in the space for better visualisation

     set it 0
  while [it < F ]
  [ask firm it [
      set color yellow
      set heading it * 360 / F
      fd 5 
      ]  
  set it it + 1
  ]

;; sets position of the households in the space for better visualisation  

  set it 0
  while [it < H ]
  [ask house it [
      set color yellow
      set heading it * 360 / H
      fd 15
      ]    
  set it it + 1
  ]  
指向
将其放置在代码中

请注意,当我只运行第一个while循环时,一切正常

我想在网络徽标中使用while循环时有一些我不理解的地方

    为什么第二个循环似乎认为我打电话给公司,虽然我要求打电话给房子?<李>
  • 有没有更好的方法来实现网络徽标中的while循环
非常感谢您的帮助

发生了什么事?
who
NetLogo中的数字是从所有海龟的相同序列中分配的,与它们的品种无关。如果您这样做:

create-firms 1
create-houses 1
然后你将拥有
公司0
一号房屋
,你也可以称之为海龟。例如,在命令中心:

observer> show turtle 0
observer: (firm 0)
observer> show turtle 1
observer: (house 1)
有这样的唯一标识符是有意义的,因为海龟的品种是非常短暂的。它可以更改为:

observer> ask firm 0 [ set breed houses ]
observer> show turtle 0
observer: (house 0)
尽管品种发生了变化,海龟仍然保持了它的
who
编号

为什么第二个循环似乎认为我打电话给公司,虽然我要求打电话给房子?

你所做的就相当于把海龟(一家公司)扔到房子里。这就是NetLogo抱怨
公司0
不是房子的原因

更好的方法 有没有更好的方法来实现网络徽标中的while循环

是:在
时不要使用
!更严重的是:在
时使用
,通常是不必要的。通常有更好的方法做事情

另外,一般来说,不要使用
who
数字来表示任何事情。如果你想一次对付很多海龟,就用海龟套装。如果要跟踪海龟,请直接存储对它的引用(例如,
将我的公司设置为公司之一
)。如果你发现自己想使用
who
号码,请后退一步,重新思考你的问题:几乎可以肯定还有另一种方法

你想对你所有的房子做点什么?问问他们

ask houses [
  set color yellow
  fd 15
] 
然而,上面的代码片段没有提到一件事:您对均匀分布的海龟的要求。但是您可以通过使用创建海龟来实现这一点。使用它,您的整个
设置
将变成:

clear-all
create-ordered-firms F [
  set color yellow
  fd 15
]
create-ordered-houses H [
  set color yellow
  fd 15
]
但是如果你真的需要索引呢? 但是如果
createordered-
不存在,或者如果您想做一些类似的事情,需要某种索引,该怎么办?您仍然不需要
,而
:和的组合将使您达到以下目标:

create-houses H
(foreach sort houses n-values H [ ? * 360 / H ] [
  ask ?1 [
    set color yellow
    set heading ?2
    fd 15
  ]
])
(我们通常将
房屋
海龟集转换为一个列表,但房屋
[self]如果您希望它们被洗牌,也可以使用。)


这段代码一开始可能看起来很奇怪,但实际上它是NetLogo中非常常见和有用的模式。它用你想分配给它的索引“拉链”你想做的事情。与while循环相比,它还有一些很好的优点:没有“逐个关闭”的错误,没有额外的变量,也没有忘记递增计数器或意外改变计数器的风险。

非常感谢@Nicolas Payette。非常清楚和深刻的回答。
create-houses H
(foreach sort houses n-values H [ ? * 360 / H ] [
  ask ?1 [
    set color yellow
    set heading ?2
    fd 15
  ]
])