2016-05-29 7 views
1

Netlogoで空間パターンをシミュレートしようとしています。私は、ノー・オブ・ロウとユーザーが設定したノー・オブ・コラムに応じて、風景を等分に分割するコードを書いています。たとえば、この場合は3 X 3風景は9「キャンプ」からなる:Netlogoの番号パッチにループする

3 X 3 landscape; each smaller square is a camp

私がするために、この例では0から8まで番号付け、各陣営に異なるplabelを設定しようとしていますこれがどのキャンプかを特定する。私はこれを設定するためにループを使用しようとしましたが、予期しない問題が発生しています。

to set-camp-number 

    let startcol max-pxcor/no-of-cols 
    let startrow max-pycor/no-of-rows 
    let t 1 
    set camp-number 0 
    while [ t <= no-of-cols ] [ 
    set a startcol * t 
    ask patches with [ pxcor <= a and pxcor >= a - startcol ] [ 
     let k 1 
     loop [ 
     if k > no-of-rows [ stop ] 
     set b startrow * k 
     ask patches with [ pxcor <= a and pxcor >= a - startcol and pycor <= b and pycor >= b - startrow ] [ 
      set plabel camp-number ] 
      set camp-number camp-number + 1 
      set k k + 1 ]] 
    set t t + 1 ] 

end 

代わりに(これは、このシナリオでは、0から8に身を標識し、各陣営のパッチである)私が欲しいものを得るための、キャンプ-数はplabelのそれに非常に大きな値を結果として、それ自体でループ内で実行するように思えます。

My current output

私は他の方法を試してみましたが、これは理解する最も簡単なことのようですが、私はループが時々Netlogoに困難なことがわかっています。私は、ループはパッチをラベル付けするための厄介な方法のように思えるので、foreachコマンドを実装しようとしましたが、別の方法が必要ですか?私は本当にあなたの助けに感謝します。ありがとうございました!

答えて

2
globals [n-rows n-cols] ; to be set by user in your code 

to setup 
    ca 
    set n-rows 3 
    set n-cols 3 
    ask patches [set plabel category self] 
end 

to-report category [#patch] 
    let _colstep world-width/n-cols 
    let _rowstep int (world-height/n-rows) 
    let _x [pxcor] of #patch - min-pxcor 
    let _y [pycor] of #patch - min-pycor 
    let _rownum int (_y/_rowstep) 
    let _colnum int (_x/_colstep) 
    report _rownum * n-cols + _colnum 
end 
+0

なぜ、let _x pxcor-min-pxcorとは言わないのですか? yと同じです。私は自分自身への参照を渡す必要はないと思う。 – mattsap

+0

これははるかに効率的なコードです!私は最終行の背後にあるロジックに少しずつ取り組んだが、これは今よりずっと意味をなさない!ありがとうアラン! – lyh198

+1

@mattsapはい、ここでそれを行うことができます。 NetLogoでも副作用のない手続きを書いています。 – Alan

関連する問題