2016-06-26 4 views
3

私はエージェントセットでマップする方法は?

reduce patch-set (map [patch-set neighbors self] patches with [somecondition?]) 

ような何かをしかし、マップやREDUCEたい

...パッチの特定agentsetを反復処理し、それらのすべての隣人を取得し、それらに参加しないだろう必要がありますエージェントセットで作業してください!

答えて

4

mapの通常の考え方は、実際にはセットには意味がありませんが、ofでリストを作成し、それをパッチセットに変換することができます。

let _nbrs patch-set [neighbors] of mypatches 

あなたが望む任意の条件にwithmypatchesまたは_nbrsのいずれかをフィルタリングします。

+1

これはまさに正しいことです。一般に、 'map'と' of'は 'filter'と' with'、 'foreach'と' ask'と同様です。しかし、実際には「reduce」というエージェントセットのアナログはありません。 –

+0

これについてAlanや@BryanHeadがどういうふうに見えるのか分かりません。時には、ある種の機能をエージェントセットに適用した結果である新しいリストが必要な場合もあります。なぜあなたはそれを持つことができないのですか?エージェントセットはどのようにリストと異なるのですか? –

+1

Joanna、それはまさに 'of'のことです。あなたはあなたが念頭に置いていることの例を挙げることができますか?エージェントセットとリストの違いについて:エージェントセットにはエージェントだけが含まれているので、エージェントを関数の引数として渡すのではなく、エージェント自体が関数を実行できるようにすることができます(他の違いもありますが、 )。これは、エージェントセットがリストを超える大きな利点です。より詳細な回答が必要な場合は、新しいSO質問を自由に開いてください。私はここに十分な部屋がありません。 –

0

ここで私はこの種の問題に対処するために狂ったハックをしています。私が本当にやりたかったのは、エージェントセット内のすべてのエージェントに機能を適用した結果の数値のリストを作成することでしたが、それはできませんでした。私はそれらをすべて私のことについての機能を適用するようにしなければなりません、そして、その結果が私に渡されたことを知るために関数を1回余分に呼び出さなければなりません。私は関数を書き直して、引数として(もし私がそれを実行している場合)、引数に私が関心のあるエージェント(エージェントが私について実行している場合)を持つことができるようにしなければなりませんでした。 シース

to-report min-edge-distance [agentset maxsize] 
    report ifelse-value (any? agentset) 
    [edge-distance min-one-of agentset [edge-distance myself true] false] ; grr, what I want is min map edge-distance agentset, instead I have to do backflips 
    [maxsize] 
end 


to-report edge-distance [alex me?] 
    report ifelse-value (me?) ;because of netlogo's perverse syntax, I've been forced to ask someone else to figure out my edge distance – alex may be me! 
    [(distance alex) * (sqrt [energy] of alex/(sqrt [energy] of alex + sqrt energy))] ;alex is me! 
    [(distance alex) * (sqrt energy/(sqrt [energy] of alex + sqrt energy))] ; alex is not me 
end 
+0

このコードは元の質問に近いものではありませんが、どんなカスでも必ずこれらの体操は必要ありません。私があなたの質問に答えた答えは正しい。あなたの異論は、あなたがタスク(これはおそらく厄介ではあるが十分に文書化されている)を使うことができないということであれば、いつでもカメのリストを取得して、それをマップすることができます。 別に、それはあなたの質問とはまったく異なっていますが、「辺縁距離」をタートルレポーターではなく純粋な関数に変えてください。 – Alan

+0

こんにちは、私はそれが密接に一致していたと主張しなかった、私はあなたがマッピングしたい別のケースだと主張した。カメのリストを作成する方法についてのあなたの考えをありがとうが、それはまだそれを行う必要が愚かなようです。エージェントセットがリストよりも特別な場合でも、マップとオーバーロードをオーバーロードしないのはなぜですか?また、エッジの距離がどこにあるのかを知る必要があるカメによって実行されると仮定しないことの利点は何ですか? –

+0

私は、タイプチェックを減らすことで、エージェントセットの操作を迅速に行うことができると思います。 (エージェントは単一の型しか保持しません)いずれにせよ、あなたがタスクを必要としない限り、 'of'は' map'を置き換えます。タスクが必要な場合は、リストにキャストして 'map'を使うことができます。例えば。エッジ距離は体内に1行しかない純粋な関数に書き直されていると仮定すると、次のようになります。 'report sqrt [energy] of#a1 /(sqrt [エネルギー]は#a2 + sqrt [エネルギー]≒a1)である。 (純粋な機能が可能な場合、それは望ましいことですが、多少の趣味の問題です。) – Alan

関連する問題