Table des matières - Gilles Daniel
Table des matières - Gilles Daniel Table des matières - Gilles Daniel
394 Modélisation et simulation multi-agents pour Sciences de l'Homme et de la Société. Dim nc As Integer ' nbr de lignes du domaine Dim nl As Integer ' nbr de colonnes du domaine Dim nT As Integer ' nbr total de cellules du domaine Dim nIter As Integer ' n° d'itération Dim PopTot As Integer ' population totale occupant le domaine Dim NbGroupes As Integer ' Nbr de groupes sociaux Dim NbLibres As Integer ' Nbr de cases libres = Nt-PopTot Dim Seuil As Double ' Seuil de tolérance Dim EstInitialise As Boolean ' =TRUE si on a initialisé Dim CellsLibres() As Integer 'contient les n° de cellules libres Dim Rg() As Integer 'permet de définir un ordre aléatoire Public Sub UnPas(nInsatisfaits As Integer,_ nIteration As Integer) Dim i As Integer ' n° de ligne Dim j As Integer ' n° de colonne Dim p As Integer ' n° aléatoire de cellule Dim n As Integer ' numéro de cellule Dim SV As Double ' nombre seuil pour le voisinage If Not EstInitialise Then Call InitDomaine Application.ScreenUpdating = False SV = Seuil * nV ' nbr d’étrangers maxi tolérés ds voisinage nInsatisfaits = 0 'on calcule un ordre de parcourt aléatoire des cellules Call RangsAleatoires(nT, Rg) 'déplacements des insatisfaits For n = 0 To nT - 1 p = Rg(n) ' numéro de rang aléatoire i = (p \ nc) + 1 ' n° de ligne associée à p j = (p Mod nc) + 1 ' n° de colonne associée à p If (T(i,j) > 0) And (NbEtrangers(i, j, T(i, j)) > SV) Then nInsatisfaits = nInsatisfaits + 1 Call DeplacerIndividu(i, j, T(i, j)) End If Next n nIteration = nIteration + 1 ' sortie des résultats : Range("nInsatisfaits") = nInsatisfaits Range("nIter") = nIteration Range("Domaine") = T Application.ScreenUpdating = True End Sub 'UnPas ' fonction de calcul du nombre d’étrangers dans le voisinage : Public Function NbEtrangers(i As Integer, j As Integer,_ nG As Integer) As Integer Dim k As Integer Dim ii As Integer Dim jj As Integer
Comparaison de trois implémentations du modèle de Schelling. 395 Dim n As Integer Dim m As Integer n = 0 For k = 1 To nV 'calcul de la position du voisin n° k : ii = i + V(k, 1) 'n° de ligne du k-ième voisin jj = j + V(k, 2) 'n° de colonne du k-ième voisin 'prise en compte de la fermeture toroïdale du domaine : If ii < 1 Then 'si le n° de ligne dépasse en haut ii = ii + nl 'on prend la ligne du bas ElseIf ii > nl Then 'si le n° de ligne dépasse en bas ii = ii – nl 'on prend la ligne du haut End If If jj < 1 Then 'si le n° de colonne dépasse à gauche jj = jj + nc 'on prend celle de droite ElseIf jj > nc Then 'si le n° de colonne dépasse à droite jj = jj – nc 'on prend celle de gauche End If 'comptage des voisins différents de moi (de n° de groupe nG) m = T(ii, jj) If (m > 0) And (m nG) Then n = n + 1 End If Next k NbEtrangers = n End Function ' sous-programme de déplacement d’un individu de type « numGr » ' depuis la case (i,j) vers une case libre choisie au hasard : Public Sub DeplacerIndividu(ii As Integer, jj As Integer, numGr As Integer) Dim i As Integer Dim j As Integer Dim p As Integer Dim m As Integer Dim n As Integer ' tirage aléatoire d'un n° m de cellule libre m = Int(Rnd * NbLibres) ' on détermine les coordonnées de la cellule concernée n = CellsLibres(m) 'n-ième cellule du tableau (libre) i = n \ nc + 1 'n° de ligne de la n-ième cellule j = n Mod nc + 1 'n° de colonne de la n-ième cellule T(i, j) = numGr 'on mémorise la nouvelle position de la cellule après déplacement T(ii, jj) = 0 CellsLibres(m) = (ii - 1) * nc + jj - 1 End Sub ' sous-programme de calcul d’un ordre aléatoire
- Page 339 and 340: Approche conceptuelle de l’espace
- Page 341 and 342: Approche conceptuelle de l’espace
- Page 343 and 344: Approche conceptuelle de l’espace
- Page 345 and 346: Approche conceptuelle de l’espace
- Page 347 and 348: Approche conceptuelle de l’espace
- Page 349 and 350: Chapitre 16 « A Monte Carlo approa
- Page 351 and 352: « A Monte Carlo approach to diffus
- Page 353 and 354: « A Monte Carlo approach to diffus
- Page 355 and 356: « A Monte Carlo approach to diffus
- Page 357 and 358: « A Monte Carlo approach to diffus
- Page 359 and 360: « A Monte Carlo approach to diffus
- Page 361 and 362: « A Monte Carlo approach to diffus
- Page 363 and 364: « A Monte Carlo approach to diffus
- Page 365 and 366: « A Monte Carlo approach to diffus
- Page 367 and 368: « A Monte Carlo approach to diffus
- Page 369 and 370: « A Monte Carlo approach to diffus
- Page 371 and 372: « A Monte Carlo approach to diffus
- Page 373: « A Monte Carlo approach to diffus
- Page 376 and 377: 380 Modélisation et simulation mul
- Page 378 and 379: 382 Modélisation et simulation mul
- Page 380 and 381: 384 Modélisation et simulation mul
- Page 382 and 383: 386 Modélisation et simulation mul
- Page 384 and 385: 388 Modélisation et simulation mul
- Page 386 and 387: 390 Modélisation et simulation mul
- Page 388 and 389: 392 Modélisation et simulation mul
- Page 392 and 393: 396 Modélisation et simulation mul
- Page 394 and 395: 398 Modélisation et simulation mul
- Page 396 and 397: 400 Modélisation et simulation mul
- Page 398 and 399: 402 Modélisation et simulation mul
- Page 400 and 401: 404 Modélisation et simulation mul
- Page 402 and 403: 406 Modélisation et simulation mul
- Page 404 and 405: 408 Modélisation et simulation mul
- Page 406 and 407: 410 Modélisation et simulation mul
- Page 408 and 409: 412 Modélisation et simulation mul
- Page 410: 414 Modélisation et simulation mul
Comparaison de trois implémentations du modèle de Schelling. 395<br />
Dim n As Integer<br />
Dim m As Integer<br />
n = 0<br />
For k = 1 To nV<br />
'calcul de la position du voisin n° k :<br />
ii = i + V(k, 1) 'n° de ligne du k-ième voisin<br />
jj = j + V(k, 2) 'n° de colonne du k-ième voisin<br />
'prise en compte de la fermeture toroïdale du domaine :<br />
If ii < 1 Then 'si le n° de ligne dépasse en haut<br />
ii = ii + nl 'on prend la ligne du bas<br />
ElseIf ii > nl Then 'si le n° de ligne dépasse en bas<br />
ii = ii – nl 'on prend la ligne du haut<br />
End If<br />
If jj < 1 Then 'si le n° de colonne dépasse à gauche<br />
jj = jj + nc 'on prend celle de droite<br />
ElseIf jj > nc Then 'si le n° de colonne dépasse à droite<br />
jj = jj – nc 'on prend celle de gauche<br />
End If<br />
'comptage <strong>des</strong> voisins différents de moi (de n° de groupe nG)<br />
m = T(ii, jj)<br />
If (m > 0) And (m nG) Then<br />
n = n + 1<br />
End If<br />
Next k<br />
NbEtrangers = n<br />
End Function<br />
' sous-programme de déplacement d’un individu de type « numGr »<br />
' depuis la case (i,j) vers une case libre choisie au hasard :<br />
Public Sub DeplacerIndividu(ii As Integer, jj As Integer,<br />
numGr As Integer)<br />
Dim i As Integer<br />
Dim j As Integer<br />
Dim p As Integer<br />
Dim m As Integer<br />
Dim n As Integer<br />
' tirage aléatoire d'un n° m de cellule libre<br />
m = Int(Rnd * NbLibres)<br />
' on détermine les coordonnées de la cellule concernée<br />
n = CellsLibres(m) 'n-ième cellule du tableau (libre)<br />
i = n \ nc + 1 'n° de ligne de la n-ième cellule<br />
j = n Mod nc + 1 'n° de colonne de la n-ième cellule<br />
T(i, j) = numGr<br />
'on mémorise la nouvelle position de la cellule après déplacement<br />
T(ii, jj) = 0<br />
CellsLibres(m) = (ii - 1) * nc + jj - 1<br />
End Sub<br />
' sous-programme de calcul d’un ordre aléatoire