#oop #gis #netlogo
#ооп #гис #netlogo
Вопрос:
Я пытался вычислить количество черепашьих кластеров в моем мире, но я постоянно сталкивался с «Вы не можете использовать GROUPE в контексте исправления, потому что GROUPE доступен только для черепах». Я использую биты из модели сегрегации Шеллинга и адаптирую пример кластеров исправлений из библиотеки моделей, но мне не удалось получить количество кластеров с помощью команды show max [amas] of personnes
после запуска модели.
Строка, вызывающая проблемы, находится в нижней части блока и:
(группа = [группа] самого себя)]
Вот полный код:
extensions
[
GIS ; Extension GIS
]
globals
[
v
;vc
routes.data ; shapefile routes
Usol.data ; shapefile utilisation sol
average-happy ; pourcentage heureux
amas
]
patches-own
[
routes ; routes
routes? ; booléenne routes
Usol
Usol?
state ; état d'une patch
val ; valeur
cluster
]
turtles-own
[
groupe
unhappy?
counter
similar-nearby
other-nearby
total-nearby
happy
]
breed ; Création d'une classe
[
personnes
personne
]
to setup ; Déclaration de la procédure setup
ca ; Clear-all
reset-ticks ; Remet le compteur de ticks à zéro
set v 2
initialiserGIS ; Initialisation de la procédure initialiserGIS
creerHumains
do-plots
end ; Fin de la procédure setup
to initialiserGIS ; Déclaration de la procédure initialiserGIS
set Usol.data gis:load-dataset "utilisationDuSol.shp"
gis:apply-coverage Usol.data "LANDUSE" Usol
ask patches
[
set Usol? FALSE
]
ask patches gis:intersecting Usol.data
[
set Usol? TRUE
ifelse Usol = "residential"
[
set state 1
set pcolor green
]
[
set state 0
set pcolor grey
]
]
set routes.data gis:load-dataset "routesMtl.shp"
ask patches
[
set routes? FALSE
]
ask patches gis:intersecting routes.data
[
set routes? TRUE
set state 0 ; Empêche aux agents d'habiter sur les routes
set pcolor red ; Assigne la couleur rouge aux routes
]
end ; Fin de la procédure initialiser GIS
to creerHumains ; Déclaration de la procédure creerHumains
ask patches with [state = 1] ; Demande aux cellules résidentielles
[
set val random-float 1 ; Accorde une valeur aléatoire décimale entre 0 et 1 à la variable val
]
let vide 0.1 ; Initialisation de la variable locale vide avec la valeur 0.1
let limite1 (1 - vide) / v ; Initialisation de la variable locale limite
let residents patches with [state = 1 and val > vide] ; Initialisation de la variable locale residents
ask residents ; Demande aux residents
[
sprout-personnes 1 ; Primitive permettant à une patch de créer un agent sur toutes les patches résidentielles
] ; Permet de créer un nombre identique de personne de chaque groupe
let limiteList (list (pmin * (1 - vide )) ((1 - pmin) * (1 - vide)))
let i 0
let minVal vide
let maxVal 0
while [i <= v - 1]
[
set maxVal minVal item i limiteList
ask personnes with [val <= maxVal and val > minVal]
[
set groupe i 1
]
set minVal maxVal
set i i 1
]
ask personnes ;ceci sert uniquement à attribuer une couleur différente à chaque groupe
[ ; Assigne la couleur et la forme appropriée en fonction du groupe
ifelse groupe = 1
[
set color red
set shape "house"
]
[
ifelse groupe = 2
[
set color blue
set shape "house"
]
[
ifelse groupe = 3
[
set color green
set shape "house"
]
[
ifelse groupe = 4
[
set color orange
set shape "house"
]
[
ifelse groupe = 5
[
set color black
set shape "house"
]
[
ifelse groupe = 6
[
set color brown
set shape "house"
]
[
ifelse groupe = 7
[
set color pink
set shape "house"
]
[
ifelse groupe = 8
[
set color white
set shape "house"
]
[
set color magenta
set shape "house"
]
]
]
]
]
]
]
]
]
end ; Fin de la procédure creerHumains
to move ; Déclaration de la procédure move
move-to one-of patches with [Usol = "residential"]
if any? other turtles-here
[
move ;; Continue jusqu'à tant qu'une patch soit trouvée
]
end
to update-variables ; Déclaration de la procédure update-variables ; permet de mettre à jour les valeurs
update-turtles
update-globals
end ; Fin de la procédure update-variables
to update-turtles ; Déclaration de la procédure update-turtles
ask turtles ; demande turtles
[ ; Test des patches voisines
set counter 0 ; réinitialise counter
set similar-nearby count (turtles-on neighbors) with [groupe = [groupe] of myself]
set other-nearby count (turtles-on neighbors) with [groupe != [groupe] of myself]
set total-nearby similar-nearby other-nearby
ifelse groupe = 1
[
ifelse (Tmin >= similar-nearby) ; vérification si vc est supérieur ou égale aux voisins similaires
[ ; personne unhappy move
set unhappy? TRUE
set happy 0
move
]
[ ; personne happy
set unhappy? FALSE
set happy 1
]
]
[
ifelse (Tmaj <= similar-nearby) ; vérification si vc est supérieur ou égale aux voisins similaires
[ ; personne unhappy move
set unhappy? TRUE
set happy 0
move
]
[ ; personne happy
set unhappy? FALSE
set happy 1
]
]
]
end ; Fin de la procédure update-turtles
to update-globals ; Déclaration de la procédure update-globals
set average-happy mean [happy] of turtles ; Average-happy = moyenne des turtles happy
end ; Fin de la procédure update-globals
to go ; Déclaration de la procédure go
update-variables ; Vérifie l'état de chacunes des personnes et fait bouger celles nécessitant de l'être
tick ; Incrémente la valeur de la variable tick
if ticks >= 100 ; Si le nombre de ticks est supérieur ou égal à 100
[
stop ; Arrête le modèle
]
if c-unhappy = 0
[
stop ; Arrête le modèle si personne est unhappy
]
end ; Fin de la procédure go
to do-plots ; Déclaration de la procédure do-plots
plot average-happy * 100 ; Plot la moyenne des habitants étant happy
end ; Fin de la procédure do-plots
to-report c-happy ; Déclaration de la procédure de rapportage c-happy
report sum [happy] of turtles ; Rapporte le nombre de turtles étant happy
end ; Fin de la procédure de rapportage c-happy
to-report c-unhappy ; Déclaration de la procédure de rapportage c-unhappy
report ((count turtles) - (sum [happy] of turtles)) ; Rapporte le nombre de turtles étant unhappy
end ; Fin de la procédure de rapportage c-unhappy
;;; Q6
to find-clusters
loop
[
;; pick a random patch that isn't in a cluster yet
let seed one-of personnes with [cluster = nobody]
;; if we can't find one, then we're done!
if seed = nobody
[
show-clusters
stop
]
;; otherwise, make the patch the "leader" of a new cluster
;; by assigning itself to its own cluster, then call
;; grow-cluster to find the rest of the cluster
ask seed
[
set cluster self
grow-cluster
]
]
display
end
to grow-cluster ;; patch procedure
ask neighbors4 with [(cluster = nobody) and
(groupe = [groupe] of myself)]
[
set cluster [cluster] of myself
grow-cluster
]
end
;; once all the clusters have been found, this is called
;; to put numeric labels on them so the user can see
;; that the clusters were identified correctly
to show-clusters
let counter2 0
loop
[ ;; pick a random patch we haven't labeled yet
let p one-of patches with [plabel = ""]
if p = nobody
[
stop
]
;; give all patches in the chosen patch's cluster
;; the same label
ask p
[
ask personnes with [cluster = [cluster] of myself]
[
set amas counter2
]
]
set counter2 counter2 1
]
end
Комментарии:
1. Какая строка генерирует ошибку? Вы должны предоставить только соответствующие фрагменты кода — процедуру, которая генерирует ошибку, и, возможно, процедуру, которая использует проблемную процедуру.