Table des matières - Gilles Daniel

Table des matières - Gilles Daniel Table des matières - Gilles Daniel

gillesdaniel.com
from gillesdaniel.com More from this publisher
01.01.2015 Views

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

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!