2

NetLogo で一種の「ソーシャル ネットワーク」を構築しようとしています。リンクでつながっている異年齢層の集まり。

NetLogo の構文のいくつかの部分にまだ完全に慣れていないため、組み立て方に問題があります。私は先週、自分のコードで品種を使い始めたばかりで、まだ完全に解決していません。それとも私がそれらを複雑にしすぎているのか、よくわかりません。

関連するコードを以下に示します。問題の機能は「ネットワークの作成」です。各エージェント (合計で約 800 になります) に、一定量の他のエージェントの各タイプに接続するように依頼する必要があります (他のエージェントが満杯にならない限り)。たとえば、カメが幼児種の場合、合計 10 個のリンクがあり、そのうち 5 個が他の幼児、2 個が子供、2 個が大人、1 個が 45 歳以上です。最初のノードが幼児で、大人に接続する場合、それが理にかなっていれば、大人のノードが到達したときに接続しようとする幼児の数を減らす必要があります。

現在のタートルに品種を尋ねる方法がわかりません。これにより、適切な数の適切な品種にリンクできます。誰かが私を助けてくれたら、私はめちゃくちゃ感謝します. これはコードのほんの一部ですが、ここ数日私を夢中にさせています

何かを試みるたびにエラーが発生し、アイデアも生きる意欲もなくなってしまいます。お時間をいただきありがとうございます。コードではなく、より良いアルゴリズムについて考えがある場合でも、それは大歓迎です

breed [toddlers toddler]
breed [children child]
breed [adults adult]
breed [over45s over45]

globals
[
  num-nodes
]

toddlers-own
[
  tod-total-connections
  tod-tods
  tod-children
  tod-adults
  tod-over45s
]

children-own
[
  child-total-connections
  child-tods
  child-children
  child-adults
  child-over45s
]

adults-own
[
  adult-total-connections
  adult-tods
  adult-children
  adult-adults
  adult-over45s
]

over45s-own
[
  over45-total-connections
  over45-tods
  over45-children
  over45-adults
  over45-over45s
]


to generate
  clear-all
  create-toddlers num-toddlers
  create-children num-children
  create-adults num-adults
  create-over45s num-over45
  create-network
  setup
  reset-ticks
end

to setup 
  ask turtles
    [reset-node]
  ask links
    [set color gray + 1.5]
  ask adults
    [set shape "circle"
      set size 4]
  ask toddlers
    [set shape "face happy"
      set size 4]
  ask over45s
    [set shape "triangle"
      set size 4]


  ;;INITIALISE BREEDS

  ;;Initialise Toddlers
  ask toddlers [set total-connections 10]
  ask toddlers [set tod-tods 5]
  ask toddlers [set tod-children 2]
  ask toddlers [set tod-adults 2]
  ask toddlers [set tod-over45s 1]

  ;;Initialise Children
  ask children [set total-connections 17]
  ask children [set child-tods 3]
  ask children [set child-children 8]
  ask children [set child-adults 5]
  ask children [set child-over45s 1]

  ;;Initialise Adults
  ask adults [set total-connections 13]
  ask adults [set adult-tods 1]
  ask adults [set adult-children 3]
  ask adults [set adult-adults 6]
  ask adults [set adult-over45s 3]

  ;;Initialise Over45s
  ask over45s [set total-connections 12]
  ask over45s [set over45-tods 1]
  ask over45s [set over45-children 1]
  ask over45s [set over45-adults 5]
  ask over45s [set over45-over45s 5]



  ;; Layout turtles:
  layout-circle (sort turtles) max-pxcor - 8
  ask turtles
  [
    facexy 0 0
    if who mod 2 = 0 [fd 4]
  ]
  display
end


;; THIS IS THE PROBLEM FUNCTION
to create-network
  let q 0
  let n 0
   while [q < count turtles]
  [
    let m 1
    while [m < count turtles]
        [
           make-link-between turtle n
                  turtle ((n + m) mod count turtles)
           set m m + 1 
;;results in a fully connected network which I don't want
         ]  
     set n n + 1
     set q q + 1
  ]

end


;; connects the two nodes
to make-link-between [node1 node2]
  ask node1 [
    create-link-with node2
      [ set color gray + 1.5]
  ]
end

また、エージェント間のリンクを「一時停止」する機能ができないかどうかも考えています。たとえば、子の間のリンクの一部またはすべてをオフにします。リンクにタイモード属性があることは知っていますが、これができるかどうかはわかりません。私が読んだところによると、移動エージェントを一緒に保持することについてのように思えますか? リンクをオフにする方法として untie を使用できますが、リンクは引き続き存在しますか?

編集:リンクを非表示にする方が適切な場合があります。正しいリンクを非表示にする方法は次のことです

4

1 に答える 1

3

まず、これを邪魔にならないようにしましょう。

現在のカメに品種を尋ねる方法がわかりません

カメには品種変数があります。

しかし、より一般的に言えば、NetLogo のやり方をまだ理解していないと思います。あなたのコードは、while ループとインデックスを使用して非常に重要です。タートルを番号でアドレス指定することは避けるべきwhoです (ただし、独自のレイアウト コードはまれな例外かもしれません)。NetLogo は、リスト、エージェントセット、および (可能な場合) 機能変換に関するものです。

とにかく、これがあなたの問題に対するより良いアプローチだと私が思うものです。最も難しいのは のreverse-num-connexions計算方法ですが、それがどのように機能するかを理解しようとすることは、リストの扱い方を学ぶための優れた練習になるはずです。

また、すべてのターゲットが上限に達しているため、タートルが必要な接続数で終わらない可能性があることに注意してください。それはあなたの人口比率に依存します。

breed [ toddlers toddler ]
breed [ children child ]
breed [ adults adult ]
breed [ over45s over45 ]

to setup
  clear-all
  create-toddlers 200
  create-children 200
  create-adults 200
  create-over45s 200
  create-network
  reset-ticks
end

to create-network

  let connexions (list
    (list toddlers toddlers 5)
    (list toddlers children 2)
    (list toddlers adults 2)
    (list toddlers over45s 1)
    (list children toddlers 3)
    (list children children 8)
    (list children adults 5)
    (list children over45s 1)
    (list adults toddlers 1)
    (list adults children 3)
    (list adults adults 6)
    (list adults over45s 3)
    (list over45s toddlers 1)
    (list over45s children 1)
    (list over45s adults 5)
    (list over45s over45s 5)
  )

  foreach connexions [
    let source-breed item 0 ?
    let target-breed item 1 ?
    let num-connexions item 2 ?
    let reverse-num-connexions item 2 first filter [
      item 0 ? = target-breed and item 1 ? = source-breed
    ] connexions
    ask source-breed [
      repeat num-connexions [
        let possible-targets other target-breed with [
          (not member? myself link-neighbors) and
          (count link-neighbors with [ breed = source-breed ] < reverse-num-connexions)
        ]
        let target one-of possible-targets
        if target != nobody [ create-link-with target ]
      ]
    ]
  ]

end

reverse-num-connexions説明 (編集)

接続数のリストをトラバースしていて、 に到達したとしましょう[toddlers adults 2]。つまり、各幼児は 2 人の大人とつながりを持つ必要があります。しかし、リストのさらに下を見ると、大人は 1 人の幼児にしか接続されないことがわかります[adults toddlers 1]。この番号 ( 1) は、 として保存するために抽出しようとしているものreverse-num-connexionsです。

最初に行うことは、適切なサブリストを見つけることです。これは、「ソース」と「ターゲット」の品種が現在のものとは逆のものになります。この式filter [ item 0 ? = target-breed and item 1 ? = source-breed ] connexionsは、そのサブリストのみを含むリストを返します: [[adults toddlers 1]]. それを抽出するには、 を使用しますfirst。これにより、サブリストのみが得られます: [adults toddlers 1]。ここで、そのサブリストの最後の項目である が必要ですitem 2。これにより、私たちが求めていたものが得1られます。

于 2013-08-14T14:42:57.987 に答える