2017-10-29 4 views
0

エージェントが最初のターゲットに到達したら次のパッチターゲットを計算しようとしています。ターゲットは、(パッチの影響度の最も高い値/エージェントまでの距離)として定義されます。次のターゲットは、この同じ手順を使用して計算する必要がありますが、方程式から以前のターゲットを割り引く必要があります。Netlogo:次のターゲットを見つけて以前のターゲットを割ります

すべてのターゲットを含めるようにパッチセットを作成しようとしましたが、動作しているかわかりません。

私の問題は、次に影響度の高い値を計算するto-report関数を作成する方法です。私は完全に私の手続きのこの最後の部分に立ち往生してきた。

私の最初のレポーター機能は次のとおりです。

to-report highest-influence 
    let available-target patches with [influence > 0] ;and not any? patches with [pcolor = green] 
    report max-one-of available-target [influence/distance myself] 
end 

しかし、また、以前のターゲット

to-report next-highest-influence 
    ; patches with [influence > 0] and not part of patch set 
end 

を割り引くながら、私は任意の助け同じパラメータを使用して、次レポーター機能を持っているかどうかはわかりませんでしょう大変感謝します。私は完全なコードを提供しました。

breed [walkers walker] 

walkers-own [traveled? ;; parameter to keep track of if a walker has traveled to a target yet or not 
      target ] 

patches-own [influence influence-set] ;highest-influence 

to setup 
    clear-all 
    reset-ticks 
    define-patches 
    create-walkers num-walkers 
    ask walkers [ 
    setxy 0 0 
    set heading 90 
    let streets neighbors with [pcolor = black] 
    ifelse any? streets in-cone 1 25 
     [fd 1] 
     [move-to one-of streets in-radius 1] 
    set traveled? false ;; so that walkers know they have not yet moved to a target 
    ] 
    ask walkers [ 
    define-target ] 
end 

to define-patches 
    ask n-of 100 patches [ 
    set pcolor white 
    ] 
    ask n-of 40 patches with [pcolor = white] [set influence random 5 set pcolor blue set plabel influence] 
    ask patches [set influence-set patches with [pcolor = green] ] 
end 

to define-target  ;; this defines the initial destination of walkers 
    if traveled? = false [ 
    set target highest-influence 
    ask target [set pcolor green] 
    face target ] 
end 

to new-target   ;; this defines subsequent desinations after walkers have reached inital target 
    if traveled? = true [ 
    set target next-highest-influence 
    ask target [set pcolor green + 2] 
     face target ] 
end 

;;;;;;;;;;;;run-time procedure;;;;;;;;;; 

to go 
    ask walkers [ 
    if distance target > 1 
     [ travel-walkers 
     leave-a-trail 
     set traveled? true ] 
    if distance target = 1 
     [ stop 
     new-target 
     travel-walkers 
     leave-a-trail 
     ] 
    ] 
    tick 
end 

to travel-walkers 
    ask walkers [ 
     move-towards-target 
    ] 
end 

to move-towards-target 
ask walkers [ 
    ifelse [pcolor] of patch-ahead 1 != white or any? other turtles-here 
    [ Move-Function ] 
    [ Avoid-Function ] 
    ] 
end 

to Move-Function 
    let t target 
    face min-one-of all-possible-moves [distance t] 
    fd 1 
end 

to Avoid-Function 
    let t target 
    face min-one-of all-possible-moves [distance t] 
end 

to leave-a-trail 
    ask patch-here [set pcolor grey] 
end 

;;;;;; reporter calculations ;;;;;; 
to-report highest-influence 
    let available-target patches with [influence > 0] ;and not any? patches with [pcolor = green] 
    report max-one-of available-target [influence/distance myself] 
end 

to-report next-highest-influence 
    ; patches with [influence > 0] and not part of patch set 
end 

to-report all-possible-moves 
    report patches in-radius 1 with [pcolor != white and distance myself <= 1 and distance myself > 0 and plabel = "" ] 
end 

答えて

1

これを行うには、member?プリミティブを使用できます。下記の簡略化されたおもちゃモデルをチェックしてください(私はあなたのコードをどのように実装したいのか分かりませんし、実行するために設定する必要があるインターフェースもあります)。MCVE guidelinesをチェックしてください。

turtles-own [ visited-list ] 
patches-own [ influence ] 

to setup-member? 
    ca 
    crt 1 [ set visited-list [] ] 
    ask patches [ set influence 0 ] 
    ask n-of 5 patches [ set influence 5 + random 50 ] 
    reset-ticks 
end 

to go-member? 
    ask turtles [ 
    let target highest-influence 
    ifelse target != nobody [ 
     face target 
     ifelse distance target > 1 [ 
     fd 1 
     ] [ 
     move-to target 
     ask target [ set pcolor red] 
     set visited-list lput target visited-list 
     ] 
    ] [ print "No targets remaining." ] 
    ] 
    tick 
end 

to-report highest-influence 
    let to-visit patches with [ 
    influence > 0 and 
    not member? self [visited-list] of myself ] 
    report max-one-of to-visit [ influence/(distance myself)] 
end 

ザ・は亀のvisited-listのメンバーない最高の影響力/距離値とリターンのパッチを報告しました。最初は、リストに含まれているパッチはありませんが、タートルが各ターゲットを訪問すると、パッチはもはや考慮されないようにターゲットをvisited-listに追加します。

関連する問題