Как исправить ошибку «переполнение стека (слишком глубокая рекурсия)» в коде NetLogo - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь устранить ошибку «переполнение стека (слишком глубокая рекурсия)», которая возникает в моем коде в NetLogo.Этот код генерирует кластеры участков для обозначения классов земного покрова в нейтральной ландшафтной модели.Однако процедура set-cover приводит к ошибке «переполнение стека (слишком глубокая рекурсия)».

Я попытался закомментировать вызов grow-cover_cluster в процедуре в grow-cover_cluster, но это не решило проблему

to generate-landscape
  set cluster-area-list []
  set_random_seeds ;; randomly distribute 
  cluster seeds (Step 1 in Saura & Martinez-Millan 2000 p.664)
  set-cover ;; identify and label clusters (Steps 2 & 3 in above)
  fill_landscape ;; fill remaining patches to dominant neighbour     
  ask patches [ set pcolor (cover * 10) + 5 ] ;; color patches by cover 
end

to set-cover
  loop
   [
    let seed one-of patches with [ ( cluster = nobody and pcolor = blue ) ]   
    ;; pick a random seed we haven't labelled yet
    if seed = nobody ;; if we have labelled all seeds stop
      [ stop ]
    ask seed
      [
        set cluster self ;; make the seed the "leader" of a new cluster
        set cover ( random Number-of-Types ) ;; assign as cover "leader" 
        grow-cover_cluster ;; generate rest of cluster
        set cluster-area-list fput count patches with [cluster = myself] 
        cluster-area-list
     ]
   ]
end

to grow-cover_cluster
  without-interruption 
  [
    let neighbours nobody
    ifelse(Neighbourhood = "Moore")
    [ 
    set neighbours neighbors with [ cluster = nobody and pcolor = [pcolor] of myself ] ]
[ 
   set neighbours neighbors4 with [ cluster = nobody and pcolor = [pcolor] of myself ] ]
    ask neighbours
    [
      set cluster [cluster] of myself ;;make neighboring patch to seed cluster
      set cover [cover] of myself ;;make neighboring patch to patch cover
      set cluster_ID [cluster_ID] of myself
      ;grow-cover_cluster ;;recursive call!
    ]
   ]
end

Код должен генерировать заполняемые случайным образом патчи, накапливающие другие окружающие патчи для формирования кластеров, чем в конечном итоге формировать классы покрытия в нейтральной ландшафтной модели.Однако код в его текущей форме выше генерирует ошибку «переполнение стека (слишком глубокая рекурсия)».

...