2016-12-14 4 views
1

Я пытаюсь создать модель песчаника в r. Это одномерное.Создание модели одномерной песчаной формы в r

правила заключаются в следующем:

  1. Есть 10 пространства.
  2. Выберите случайное пространство. Отбросьте песчинку.
  3. a. Если в пространстве есть 0 зерен песка, добавьте 1 песчинку, в общей сложности 1. b. Если у него есть 1 песчинка, у него теперь два, и сваи рушится. Распределите одно из этих зерен каждому соседу. Если сосед имеет 0 зерен песка, добавьте один. Если у него есть два зерна песка, раздайте их каждому соседу. Продолжайте до тех пор, пока больше не будет более 1 зернистости. Зерна падают с края на 0 и 11.

Теперь я написал код. Генерация начального состояния само по себе было легко, конечно:

sandpile <- c(0,0,0,0,0,0,0,0,0,0) 

После выясняя квадратные скобки, мне удалось случайно уронить песок и обновить соседние координаты:

drop <- sample (1:10, 1) 
sandpile[drop] <- sandpile[drop]+1 
if(sandpile[drop] > 1) { (sandpile[drop-1] <- sandpile[drop-1]+1) 
if(sandpile[drop] > 1) { (sandpile[drop+1] <- sandpile[drop+1]+1) 
if(sandpile[drop] > 1) {sandpile[drop] <- sandpile[drop]-2 

Но это не продолжается каскад, это означает, что песочная песня [drop-1]> 1, sandpile [drop-2] и sandpile [drop] не обновляются.

Итак ... Мой вопрос в основном заключается в том, как я могу реализовать оставшуюся часть модели, а затем записать размер лавин (т. Е. Количество зерен песка, которые перемещают каждое обновление) для ряда n обновлений?

+0

Спасибо! Обновлен, чтобы сделать его более понятным. – TheCurlyManLives

ответ

1
# 10 spaces 
sandpile <- c(1,1,1,1,1,1,1,0,1,1) 

# Pick a random space 
drop <- sample (1:10, 1) 

# If the space has 0 grains of sand, add 1 grain of sand. 
if(sandpile[drop]==0){ 
    sandpile[drop] <- 1 
    cat("done") 
# If it has 1, distribute one to each neighbor and so on 
} else if(sandpile[drop]==1){ 
    # Left neighbor(s) 
    i <- drop-1 
    while(sandpile[i] > 0 & i > 1){ 
     if(i > 1){i <- i -1 
     } else if (i == 1 & sandpile[i] > 0){ 
     break # it fell off 
     }else if (i == 1 & sandpile[i] == 0){ 
     sandpile[i] <- 1 
     break 
     } 
    } 
    if(sandpile[i]==0) sandpile[i] <- 1 

    # Right neighbor(s) 
    i <- drop+1 
    while(sandpile[i] > 0 & i < 10){ 
    if(i > 1){i <- i +1 
    } else if (i == 10 & sandpile[i] > 0){ 
     break # it fell off 
    }else if (i == 10 & sandpile[i] == 0){ 
     sandpile[i] <- 1 
     break 
    } 
    } 
    if(sandpile[i]==0) sandpile[i] <- 1 
    cat("done") 
    } 
+1

Спасибо, это работает! Еще один вопрос ... Знаете ли вы, как я мог записать количество песчинок, которые двигались за ход? – TheCurlyManLives

+0

@ TheCurlyManLives Рад, что он работает! Я поддержал ваш вопрос. Я начал с множества операторов 'if', но вкратце стало ясно, что это было сложно, поэтому я переключился на' while'. Что касается последующего вопроса - не без дела, но если вы откроете еще один вопрос по этому вопросу, я буду работать над ним утром. –

+0

Я отправил вопрос сейчас, если вы все еще заинтересованы в том, чтобы посмотреть на него. – TheCurlyManLives

Смежные вопросы