Simple Quasi-Market

Simple Quasi-Market preview image

1 collaborator

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by everyone
Model was written in NetLogo 6.4.0 • Viewed 515 times • Downloaded 1 time • Run 0 times
Download the 'Simple Quasi-Market' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Info tab cannot be displayed because of an encoding error

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

breed [students student]
breed [schools school]

students-own [
  social-class    ; "favorise", "moyen", ou "defavorise"
  year           ; année scolaire (1-6)
  tolerance      ; seuil de tolérance
  my-school      ; école assignée
  waiting        ; en attente d'une place ou non
]

schools-own [
  capacity-per-year  ; capacité par année (60 places en 1ère année, etc.)
  nb-favorises
  nb-moyens
  nb-defavorises
]

to setup
  clear-all

  ; Création des écoles
  create-schools 4 [
    set shape "house"
    set color 9.9
    set capacity-per-year 60
    set nb-favorises 0
    set nb-moyens 0
    set nb-defavorises 0
    set size 3
    ; Positionnement en carré
    if who = 0 [ setxy -10 10 ]  ; Nord-Ouest
    if who = 1 [ setxy 10 10 ]   ; Nord-Est
    if who = 2 [ setxy -10 -10 ] ; Sud-Ouest
    if who = 3 [ setxy 10 -10 ]  ; Sud-Est
  ]

  reset-ticks
end 

to go
  ; Faire avancer les élèves d'une année (sauf les nouveaux)
  ask students with [year > 0] [
    set year year + 1
    if year > 6 [ die ]  ; Les élèves sortent du système après 6 ans
  ]

  ; Créer de nouveaux élèves
  create-students 100 [
    set shape "person"
    set size 1
    set year 1
    set waiting true
    ; Assigner une classe sociale aléatoirement (distribution égale)
    set social-class one-of ["favorise" "moyen" "defavorise"]
    ; Définir la couleur selon la classe sociale
    if social-class = "favorise" [ set color red ]
    if social-class = "moyen" [ set color green ]
    if social-class = "defavorise" [ set color blue ]

    ; Définir le seuil de tolérance selon la classe sociale
    if social-class = "favorise" [
      set tolerance tolerance-favorises
    ]
    if social-class = "moyen" [
      set tolerance tolerance-moyens
    ]
    if social-class = "defavorise" [
      set tolerance tolerance-defavorises
    ]
  ]

  ; Phase 1 : Les nouveaux élèves choisissent leur école préférée
  ask students with [waiting = true] [
    choose-preferred-school
  ]

  ; Phase 2 : Les écoles sélectionnent les élèves selon leurs critères
  ask schools [
    select-students
  ]

  ; Mettre à jour les statistiques des écoles
  update-school-stats

  tick
end 

to choose-preferred-school
  ifelse count students = 0 or tolerance = 1  ; Si premiers élèves OU tolérance totale
  [
    ; Attribution purement aléatoire
    move-to one-of schools
  ]
  [
    ; Sinon, utiliser le système de préférences
    let school0-discomfort calculate-discomfort self school 0
    let school1-discomfort calculate-discomfort self school 1
    let school2-discomfort calculate-discomfort self school 2
    let school3-discomfort calculate-discomfort self school 3

    let min-discomfort min (list school0-discomfort school1-discomfort school2-discomfort school3-discomfort)

    if min-discomfort = school0-discomfort [ move-to school 0 ]
    if min-discomfort = school1-discomfort [ move-to school 1 ]
    if min-discomfort = school2-discomfort [ move-to school 2 ]
    if min-discomfort = school3-discomfort [ move-to school 3 ]
  ]
end 

to-report calculate-discomfort [student-agent school-agent]
  let total-students ([nb-favorises + nb-moyens + nb-defavorises] of school-agent)
  if total-students = 0 [ report 0 ]

  let discomfort 0
  let my-class [social-class] of student-agent
  let my-tolerance [tolerance] of student-agent

  ; Les favorisés regardent la proportion d'élèves non-favorisés
  if my-class = "favorise" [
    let prop-non-favorises (([nb-moyens + nb-defavorises] of school-agent) / total-students)
    ifelse prop-non-favorises > my-tolerance
      [ set discomfort 1 ]
      [ set discomfort prop-non-favorises / my-tolerance ]
  ]

  ; Les moyens regardent la proportion d'élèves aux extrêmes
  if my-class = "moyen" [
    let prop-extremes (([nb-favorises + nb-defavorises] of school-agent) / total-students)
    ifelse prop-extremes > my-tolerance
      [ set discomfort 1 ]
      [ set discomfort prop-extremes / my-tolerance ]
  ]

  ; Les défavorisés regardent la proportion d'élèves non-défavorisés
  if my-class = "defavorise" [
    let prop-non-defavorises (([nb-favorises + nb-moyens] of school-agent) / total-students)
    ifelse prop-non-defavorises > my-tolerance
      [ set discomfort 1 ]
      [ set discomfort prop-non-defavorises / my-tolerance ]
  ]

  report discomfort
end 

to select-students
  let year1-students students-here with [waiting = true]
  if count year1-students > capacity-per-year [
    let selected-students nobody

    ifelse selectivite-ecoles = 0 [
      ; Mode aléatoire pur
      set selected-students n-of capacity-per-year year1-students
    ][
      ; Mode avec sélection selon composition sociale
      ; Déterminer le type majoritaire dans l'école
      let major-type "favorise"
      if nb-moyens > nb-favorises and nb-moyens > nb-defavorises [
        set major-type "moyen"
      ]
      if nb-defavorises > nb-favorises and nb-defavorises > nb-moyens [
        set major-type "defavorise"
      ]

      ; Première vague : type majoritaire
      let first-priority year1-students with [social-class = major-type]

      ; Mélanger entre prioritaires et non-prioritaires selon le niveau de sélectivité
      let nb-prioritaires floor (capacity-per-year * selectivite-ecoles)
      let nb-random floor (capacity-per-year * (1 - selectivite-ecoles))

      ; Sélectionner d'abord les prioritaires
      ifelse count first-priority <= nb-prioritaires [
        set selected-students first-priority
        set nb-random (capacity-per-year - count first-priority)
      ][
        set selected-students n-of nb-prioritaires first-priority
      ]

      ; Compléter avec des élèves aléatoires parmi les non-sélectionnés
      let remaining-students year1-students with [not member? self selected-students]
      if any? remaining-students and nb-random > 0 [
        set selected-students (turtle-set selected-students
          n-of (min list nb-random count remaining-students) remaining-students)
      ]
    ]

    ; Les élèves sélectionnés restent, les autres doivent partir
    ask year1-students [
      ifelse member? self selected-students [
        set waiting false
        set my-school myself
        ; Position autour de l'école
        fd 3
        rt random 360
      ][
        ; Aller à une autre école si possible
        let other-possible-schools schools with [
          self != myself and
          count students-here with [waiting = true] < capacity-per-year
        ]
        if any? other-possible-schools [
          move-to min-one-of other-possible-schools [
            calculate-discomfort myself self
          ]
        ]
      ]
    ]
  ]
end 

to update-school-stats
  ask schools [
    set nb-favorises count students-here with [social-class = "favorise"]
    set nb-moyens count students-here with [social-class = "moyen"]
    set nb-defavorises count students-here with [social-class = "defavorise"]
  ]

  ; Calcul de l'indice de Duncan pour les défavorisés
  let total-defavorises sum [nb-defavorises] of schools
  let total-autres sum [nb-favorises + nb-moyens] of schools

  let duncan-index 0

  if total-defavorises > 0 and total-autres > 0 [
    set duncan-index 0.5 * sum [
      abs(
        (nb-defavorises / total-defavorises) -
        ((nb-favorises + nb-moyens) / total-autres)
      )
    ] of schools
  ]

  ; Mise à jour du graphique
  set-current-plot "Indice de ségrégation (défavorisés)"
  plot duncan-index
end 

There are 2 versions of this model.

Uploaded by When Description Download
Nathanaël Friant 22 days ago Added school selectivity and made first choice random Download this version
Nathanaël Friant 22 days ago Initial upload Download this version

Attached files

File Type Description Last updated
Simple Quasi-Market.png preview Preview for 'Simple Quasi-Market' 22 days ago, by Nathanaël Friant Download

This model does not have any ancestors.

This model does not have any descendants.