NetLogo: Как создать ссылки с определенным количеством других черепах - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу создать (не масштабируемую) сеть, в которой каждая черепаха подключена к определенному числу, скажем, четырех других черепах. Чтобы у некоторых черепах было много связей, в то время как у других их было немного (но не меньше четырех), я думал, что каждая черепаха должна иметь четыре исходящих соединения, и пусть входные ссылки обязательно изменятся. Использование кода для построения безмасштабной сети Барабаси-Альберта доступно на стр. В качестве отправной точки 131 в Скотте и Келере «Полевое руководство по NetLogo» мой код приведен ниже.

У меня вопрос, как заставить каждую черепаху соединяться с четырьмя другими черепахами.

breed [liberals liberal]
breed [conservatives conservative]

to setup
    clear-all
    set-default-shape turtles "circle"
    create-liberals 5 [
    set adopt? false
    let n count turtles
    set color blue
    ]
create-conservatives 20 [
    set adopt? false
    let n count turtles
    set color red
    ]
    let m 4
    let p .05
    set my-threshold my-threshold
ask turtles[
    let me self
    let degrees max-n-of m turtles [count link-neighbors]
    foreach (sort degrees) [ [?] ->
    let chance random-float 1.0
    if ( ? != self) and (chance < p ) [
    ask self [ create-link-to ? ]
    ]
    ]
]
ask turtles with [(count out-link-neighbors) = 0 ] [
let degrees max-n-of m turtles [ count link-neighbors ]
let t one-of degrees
foreach (sort degrees) [ 
ask self [ if ( t != self) [ create-link-to t] ]
]
]
reset-ticks
end

Код выше является частью моей попытки воссоздать модель Пола Ормерода, доступную по адресу https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1468-0270.2006.00611.x

1 Ответ

0 голосов
/ 04 сентября 2018

Поскольку вы работаете с направленной сетью, у вас не возникнет никаких проблем, если просто попросить каждую черепаху выбрать 4 других черепахи и подключиться к ним. Код для этого будет:

ask turtles
[ create-links-to n-of 4 other turtles
]

Обратите внимание, что это гораздо сложнее в ненаправленных сетях, потому что ссылки, которые они "получают", приводят к слишком большому количеству ссылок в целом. Тогда вам нужно сделать что-то вроде NetLogo Эффективный способ создания фиксированного количества ссылок

Однако это не приведет к достижению вами заявленной цели распределения степени по преференциальной привязанности (без масштаба, по Барабаси-Альберту или как вы хотите это называть). Механизм, который приводит к такому результату, состоит в том, что черепахи отбирают черепах, чтобы сделать связи с использованием взвешенного случайного отбора, с весом нормализованной степени. Вам нужно расширение rnd, и вы получите примитив weighted-n-of.

Я также отметил некоторые общие проблемы с вашим кодом, которые связаны с (как мне кажется) путаницей в том, как работает алгоритм преференциального вложения и / или как работает NetLogo. Примитив weighted-n-of избавит вас от необходимости искать случайные числа и значительно упростит ваш код. Тем не менее, мне неясно, что должен делать let degrees max-n-of m turtles [count link-neighbors], но, похоже, создается список из четырех черепах высшей степени. Но алгоритм преимущественного присоединения позволяет создавать ссылки даже с узлами низкой степени, просто с меньшей вероятностью.

...