Близость на основе агента R

Я пытаюсь использовать R для моделирования сетей агентов, которые меняют свои решения на основе решений других агентов, находящихся в непосредственной близости от них. По сути, каждый агент смотрит на других агентов вокруг него в сетке и может изменять свое поведение в зависимости от действий вокруг него. Я включил пример кода игрушечной игрушки, как показано ниже, чтобы показать (одну итерацию) такой динамики.

Мне интересно, есть ли

  1. существует элегантный способ обращения к границам сетки (в настоящее время код t + 1, i + 1 не работает на краях),

  2. или существуют ли другие подходы, которые используют «пространственное» измерение матрицы / используют подходы на основе графов для моделирования такого рода моделей?


NCols=10 
NRows=10
df=round(matrix(runif(NCols*NRows), ncol=NCols),0); df

t=1;i=1

for(i in 1:(nrow(df)-1)){
  for(t in 1:(ncol(df)-1)){
     prox=sum(df[t+1,i]+df[t+1,i-1]+df[t+1,i+1]+df[t,i]+df[t,i-1]+df[t,i+1]+df[t-1,i]+df[t-1,i-1]+df[t-1,i+1])
    if(prox<=3) {df[t,i]=0} else {df[t,i]=1}
  }
}
df

person user1885116    schedule 20.12.2013    source источник
comment
Граничные условия - обычная проблема для методов конечных разностей. Предлагаю изучить литературу.   -  person Roland    schedule 20.12.2013


Ответы (1)


Одно относительно простое решение проблемы края - заставить агентов на противоположных краях быть рядом с агентами в соответствующем месте на противоположном крае. Это превращает сетку в своего рода тор. Поскольку ваша нумерация идет от 0 до n, один простой способ реализовать это - использовать по модулю. Например, вместо i+1 используйте (i+1) %% (NRows+1). Например, когда NRows=10, %% (NRows+1) отображает 11 в 0, а -1 в 10.

Есть много разных способов установить правила, определяющие, какие агенты влияют друг на друга, и эти правила могут привести к радикально отличному от идентичных правил поведению, определяющих, что делать после того, как будет решено, кто с кем взаимодействует. Похоже, вы используете 8-элементную окрестность фон Неймана. Другой распространенной альтернативой на основе сетки является четырехэлементное соседство Мура. Я много узнал о том, как сетевая структура и структура соседства влияют на результаты, из книги Дж. Маккензи Александера Структурная эволюция морали. Есть и другие источники такого рода озарений, но Александр действительно разъясняет суть.

R может быть не лучшим языком для экспериментов с простыми правилами взаимодействия в различных сетевых структурах. Конечно, вы можете это сделать, и, вероятно, есть пакеты R, которые упрощают это, но приятно иметь простые инструменты для таких экспериментов. Я лично считаю, что NetLogo отлично подходит для такого рода экспериментов. Это немного необычно, но легко освоить, и его легко сказать, чтобы настроить различные сетевые структуры или использовать встроенную сетку с районами фон Неймана или Мура. Также есть надстройка, позволяющая взаимодействовать между NetLogo и R, но я никогда ее не пробовал. Однако у вас могут быть веские причины создавать свои модели с нуля в R.

person Mars    schedule 08.07.2014