Simulation cellules de convoyage pour logistique sur NetLogo

Résolu/Fermé
jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017 - 22 mars 2017 à 10:37
 jeaneige - 30 mars 2017 à 12:10
Bonjour,

Je me permets de vous contacter pour avoir votre aide concernant la programmation sur NetLogo.

J'ai actuellement programmé la création de cellule fixe sur la carte et la création de paquets qui se déplace aléatoirement sur la carte, cependant je voudrais que les paquets aient un point de destination aléatoire (coordonnées xy) et change de direction au passage sur les cellules pour atteindre leur point de destination.

Je ne sais pas si j'ai réussi à être clair mais pouvez-vous m'aider sur des lignes de code, comme par exemple donner une destination finale aux "turtles" (paquets) crées, modifier la direction des "turtles" (paquets) au passage sur une cellule
.

En vous remerciant d'avance de votre aide,

Cordialement,

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 mars 2017 à 21:22
Bonjour,

Pour parler de la même chose il serait utile d'avoir ton code de base pour le modifier selon tes besoins.

Pour avoir un point de destination final tu pourrais utiliser random-cor.
https://ccl.northwestern.edu/netlogo/docs/dictionary.html#random-cor

Quant à la modification de la direction, à moins de vouloir une déviation particulière, il s'agirait juste de choisir une nouveau point de destination.
1
jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017
Modifié le 23 mars 2017 à 19:26
Bonjour,
Je vous remercie de votre aide.

Concernant la modification de la direction, je voudrais qu'au passage sur une cellule sur la carte, ça dévie ma turtle (paquet) pour qu'elle aille à son point de destination.

Ci-dessous mon code :

;;;;; DECLARATIONS

; déclaration des cellules de convoyage
breed [ cellules cellule ]

; déclaration des paquets
breed [ boxs box ]

; déclaration du point final d'arriver des paquets
breed [ depots depot ]


;;;;; INITIALISATION

; création des cellules de convoyage
to create-cellule
  create-cellules numcellule[
    set shape "conveyor"
    set size 3
    setxy random-xcor random-ycor
  ]
end

; création des paquets
to create-box
  create-boxs numbox[
  set shape "box"
  set color brown
  set size 3
  set xcor -13 set ycor 13
  ]
end

; bouton permettant de tout effacer
to clear
  clear-all
end

;;;;; SIMULATION

; bouton permettant de déplacer les paquets de 1 à chaque appui
to go
  ask boxs [
    forward 1]
0
jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017
Modifié le 26 mars 2017 à 17:59
J'ai un peu modifié mon code sauf que maintenant au passage sur une cellule, le paquet change de place, or je voudrais qu'il change seulement de direction pour l'aider à se diriger à son point de destination final...
Quelqu'un aurait-il une idée ?


;;;;; DECLARATIONS

; déclaration des cellules de convoyage
breed [ cellules cellule ]

; déclaration des paquets
breed [ boxs box ]

; déclaration du point final d'arriver des paquets
breed [ depots depot ]


;;;;; INITIALISATION

; création des cellules de convoyage
to create-cellule
create-cellules numcellule
[
set shape "conveyor"
set size 3
setxy random-xcor random-ycor
]
end

; création des paquets
to create-box
create-boxs numbox
[
set shape "box"
set color brown
set size 3
set xcor 0 set ycor 13
]
end

; bouton permettant de tout effacer
to clear
clear-all
end

;;;;; SIMULATION

; bouton permettant de déplacer les paquets de 1 à chaque appui
to go

ask boxs
[
forward 1
]

ask cellules with [any? boxs-on patch-here]
[
let cellule-who who

ask boxs-on patch-here
[
let box-who who

set cellule-who who setxy random-xcor random-ycor
]
]
end
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
29 mars 2017 à 00:01
Bonsoir,

Ci-dessous un exemple de code, avec d'abord quelques explications.

"Mais comment est-il possible pour que la cellule sache quelles Boxs il faut diriger à droite ou en bas ?"
C'est là le point le plus difficile, tel que je l'ai fait c'est manuel, il faut configurer chacune des boxs avant la simulation.
Une (grosse) évolution serait bien sûr d'introduire un algorithme qui permettrait de faire cette configuration de manière automatique, mais je ne m'y risquerai pas.

Tout d'abord voici à quoi ressemble l'interface, il va te falloir 1 slider (world-size) et 5 boutons (init, build, setup, go, reset).
Remarque : build est un bouton forever, il faudra bien penser à le désactiver avant d'utiliser un autre bouton.


Explication sur les boutons :
  • init permet de créer la grille, ça efface tout et en particulier ça change la taille de la grille avec la valeur du slider world-size.
  • build permet de cliquer sur la grille pour positionner les cases vertes (les entrées des boxs) ou bleues (les sorties) sur la bordure noire, ainsi que les cases oranges (les cellules) dans le damier.
  • setup permet de numéroter les sorties (entre 0 et n-1) et initialises la configuration par défaut des cellules. C'est après le setup qu'il faudra compléter la configuration de chaque cellule, j'y reviens juste après.
  • go permet de créer une nouvelle box dans chaque case de départ et fait avancer toutes les boxs d'une case. Si une box est sur une cellule, elle peut éventuellement changer de direction, conformément à la configuration de la cellule. Quand une box retourne au bord elle disparaît, même si elle n'atteint pas une sortie.
  • reset permet d'effacer les boxs uniquement, mais les cases et leur configurations restent en place.

Ensuite, parlons de la configuration des cellules... c'est la partie la plus technique dans l'utilisation du programme, mais ça reste assez simple quand même.

Si tu fais un clic droit sur une case tu peux faire "inspect patch" ce qui t'ouvres une vue comme celles-ci :


Ce qui nous intéresse ce sont les 4 dernières valeurs : north, south, east, west. Ce sont des listes d'entiers dont les valeurs correspondent à un dépôt. Si la valeur d'une box est dans une des listes alors elle changera de direction.

Par exemple, prenons le patch 4 4 (celui du milieu), il possède east [1 2] et west [0 3] donc les boxs qui arrivent sur cette cellule avec la valeur 0 ou 3 iront vers la gauche et celles qui auront pour valeur 1 ou 2 iront vers la droite. Si une box a un numéro qui n'est dans aucune liste alors elle continue son chemin tout droit, la cellule ne la dévie pas.

Parlons code maintenant (NB. j'ai testé avec NetLogo 6.0.1)

J'ai essayé de faire simple, donc je me suis basé au maximum sur ce qui existait déjà par défaut dans NetLogo, par exemple les couleurs des patchs me permet de les différencier et j'utilise uniquement des turtles simples (je n'en ai pas défini de nouvelles).
La seule chose que j'ai rajouté ce sont les listes north, south, east, west dont j'ai déjà parlé, et quelques variables globales.

En cas de question sur un morceau de code, tu peux commencer par regarder le manuel de NetLogo pour voir ce que ça fait :
https://ccl.northwestern.edu/netlogo/docs/dictionary.html

globals [ world-limit number-blue
  dark-grey light-grey dark-orange light-orange ]
patches-own [ north south east west ]

; création de la grille principale
; le bord est de couleur noir, l'intérieur est un damier de gris
to init
  clear-all
  
  ; changement de taille de la grille
  set world-limit (world-size + 1)
  set-patch-size (420 / world-size)
  resize-world 0 world-limit 0 world-limit
  
  ; modification des couleurs
  set dark-grey 2
  set light-grey 3
  set dark-orange 24
  set light-orange 25
  
  ask patches [    
    ifelse (pxcor = 0) or (pxcor = world-limit) 
    or (pycor = 0) or (pycor = world-limit) [
        set pcolor black
    ] [
      ifelse ((pxcor + pycor) mod 2 = 0) [
        set pcolor dark-grey
      ] [
        set pcolor light-grey
      ]
    ]
  ]
    
end

; manipulation de la grille avec la souris
; bord : noir (vide) -> vert (entrée) -> bleu (sortie) -> noir (vide)
; damier : gris (vide) -> cellule (orange) -> gris (vide)
to build
  if mouse-down? [
     ask patch mouse-xcor mouse-ycor [
      ifelse (pxcor = 0) or (pxcor = world-limit) 
      or (pycor = 0) or (pycor = world-limit) [
        ifelse (pcolor = black) [
          set pcolor green
        ] [
          ifelse (pcolor = green) [
          set pcolor blue
        ] [
            set pcolor black
          ]
        ]
      ] [
        ifelse (pcolor = dark-orange) or (pcolor = light-orange) [
          ifelse ((pxcor + pycor) mod 2 = 0) [
            set pcolor dark-grey
          ] [
            set pcolor light-grey
          ]
        ] [
          ifelse ((pxcor + pycor) mod 2 = 0) [
            set pcolor dark-orange
          ] [
            set pcolor light-orange
          ]
        ]
      ]
    ]
    wait 0.2 ; évite de cliquer deux fois de suite par erreur
  ]
end

; configuration des patchs après le build
to setup
  set number-blue 0
  ask patches [
    ifelse (pcolor = blue) [
      set plabel number-blue
      set number-blue (number-blue + 1)
    ] [
      set plabel ""
    ]
    
    set north []
    set south []
    set west []
    set east []
  ]
end

; animation principale
to go
  ask turtles [ forward 1 ]

  ; on supprime les tortues qui sont sur le bord
  ask patches with [(pxcor = 0) or (pxcor = world-limit)
    or (pycor = 0) or (pycor = world-limit)] [
    ask turtles-here [ die ]
  ]

  ; création d'une nouvelle tortue sur chaque entrée (case verte)
  ask patches with [pcolor = green] [
    sprout 1 [
      set color white
      set label (random number-blue)
      if (pxcor = 0) [ set heading 90 ]
      if (pxcor = world-limit) [ set heading 270 ]
      if (pycor = 0) [ set heading 0 ]
      if (pycor = world-limit) [ set heading 180 ]
    ]
  ]

  ; redirection des tortues par les cases oranges
  ask patches with [(pcolor = dark-orange) or (pcolor = light-orange)] [
    foreach north [ x ->
      ask turtles-here with [ label = x ] [
        set heading 0
      ]
    ]
    foreach south [ x ->
      ask turtles-here with [ label = x ] [
        set heading 180
      ]
    ]
    foreach east [ x ->
      ask turtles-here with [ label = x ] [
        set heading 90
      ]
    ]
    foreach west [ x ->
      ask turtles-here with [ label = x ] [
        set heading 270
      ]
    ]
  ]

end

; effacement des tortues
to reset
  clear-turtles
end

Et pour finir, un exemple de 4 entrées, 4 sorties, avec 8 cellules qui forment un cercle de redistribution :

1
Bonjour,

Je ne peux que vous remercier de votre aide précieuse.

Si vous êtes sur Bordeaux, je vous paye la bouteille :D

Merci encore,
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 mars 2017 à 20:55
Bonjour,

J'ai du mal à voir le lien entre tes explications et ton code.

En particulier, je ne vois pas où tu te sers des "dépot" qui sont tes destinations d'arrivée et ce qui se passe quand la packet atteint cette position. De même la notion de "déviation" quand le packet arrive sur une cellule est assez flou...

Voici un code modifié, normalement plus simple, et surtout qui fonctionne sous réserve que j'ai bien compris le problème (ce qui est loin d'être sûr)

breed [ cellules cellule ]
breed [ boxs box ]
breed [ depots depot ]

globals [depot-x depot-y]

to setup
	clear-all
	reset-ticks

	set depot-x random-xcor
	set depot-y random-ycor

	create-depots 1
	[
		set shape "circle"
		set size 2
		set color green
		setxy depot-x depot-y
	]

	create-cellules numcellule
	[
		set shape "square"
		set color yellow
		setxy random-xcor random-ycor
	]

	create-boxs numbox
	[
		setxy random-xcor random-ycor
		set color red
	]
end

to go
	ask boxs
	[
		forward 1

		if any? cellules-on patch-here
		[
			set heading (random 360)
		]

		if any? depots-on patch-here 
		[
			die
		]
	]

	if not any? boxs
	[
		stop
	]

	tick
end
0
jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017
26 mars 2017 à 22:14
Bonsoir,

Merci de votre aide,

Oui il est vrai que je n'ai pas encore utilisé les "dépôts" car je pensais les utiliser à la fin.

En fait, dans l'idéal j'aurai espérer avoir 2-3 dépôts situé sur la carte.
Que les "Box" se créent toute sur un même point et qu'elles aient un des dépôts comme destination finale.

Ensuite j'aurai aimé que les Boxs se déplace aléatoirement sur la carte pour atteindre les Dépôts et que ça serait grâce aux cellules sur la carte qu'elles y parviendraient.

Dans l'idéal, qu'il y ai des lignes de cellules sur la carte qui apportent les Boxs à leurs Dépôts respectifs.

En tout cas merci beaucoup de votre aide et d'essayer de m'aider malgré mon problème pas très clair :)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017
26 mars 2017 à 23:00
Donc dans les évolutions :

"j'aurai espérer avoir 2-3 dépôts situé sur la carte"
Pas de problème, tu remplaces le
create-depots 1
par un
create-depots numdepots
comme tu as fait pour les cellules et boxs.

"qu'elles aient un des dépôts comme destination finale"
On peut associer des valeurs à chaque tortue, par exemple lui donner sa destination à atteindre avec
boxs-own [ depot-cible ]
. La valeur pourrait être l'identifiant de la tortue (ou du patch) à atteindre.

"Que les "Box" se créent toute sur un même point"
Il suffit de changer le
setxy random-xcor random-ycor
pour mettre en dur la position où tu veux qu'elles démarrent, éventuellement paramétrées par l'interface.

"les Boxs se déplace aléatoirement sur la carte"
Actuellement elle se déplace en ligne droite, à part quand elles touchent une cellule où leur direction change avec
set heading (random 360)
mais on peut changer leur direction à chaque tour si besoin.

"des lignes de cellules sur la carte"
On peut s'arranger pour positionner les cellules exactement où l'on veut.

"qui apportent les Boxs à leurs Dépôts respectifs"
Je comprends moins l'objectif. Les cellules vont se déplacer ?

Peut-être devrais-tu essayer de faire un dessin (même très moche, peu importe) des différentes étapes de l'animation afin de mieux comprendre le résultat attendu à l'exécution du programme.
0
jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017
27 mars 2017 à 17:38
Super merci.

Est-ce qu'avec
box-own [ depot - cible ]
les Boxs que l'on va créer au fur et à mesure vont avoir aléatoirement un des 3 dépôts comme destination finale ? Ou devons-nous décider le dépôt pour chaque cellule créé ?

On peut donc mettre des cellules collées les unes aux autres sur la carte et faire ainsi que les Boxs se déplacent que sur les cellules et non sur "le fond noir" ?

Ah non désolé je me suis mal exprimé, les cellules ne se déplacent pas mais ça serait grâce au "chemin de cellule" que l'on apporterait les Boxs à leurs dépôts respectifs.

Voici ci-dessous un dessin "moche" du procédé que je voudrais :D

0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017
27 mars 2017 à 22:59
"Est-ce qu'avec box-own [ depot - cible ] les Boxs que l'on va créer au fur et à mesure vont avoir aléatoirement un des 3 dépôts comme destination finale ? Ou devons-nous décider le dépôt pour chaque cellule créé ?"
boxs-own [ depot-cible ]
va juste créer une variable
depot-cible
dans chacune des turtles box. Après on peut mettre ce que l'on veut comme valeur dedans, valeur aléatoire ou prédéfinie, ce qui compte c'est juste d'avoir cette valeur dans un coin et pouvoir y accéder.

On peut donc mettre des cellules collées les unes aux autres sur la carte et faire ainsi que les Boxs se déplacent que sur les cellules et non sur "le fond noir" ?
Le fond noir ce sont des patchs. De la même manière que les turtles on peut modifier les patchs (changer leurs couleurs par exemple) et éventuellement leur donner des variables supplémentaires. À mon avis, dans ton cas il vaudrait mieux faire des traitements sur les patch plutôt que créer des turtles pour les cellules.

"ça serait grâce au "chemin de cellule" que l'on apporterait les Boxs à leurs dépôts respectifs"
Une cellule peut elle diriger une box vers plusieurs destination différente en fonction de son dépôt cible ? Parce que dans ce cas c'est "facile" il suffit d'avoir quelques cellules bien placées et le tour est joué.

Exemple : les cellules oranges choisissent de rediriger vers la droite ou vers le bas, les cellules bleues choisissent de rediriger vers la gauche ou vers le bas, et selon la valeur de la box on devrait donc pouvoir avoir un chemin complet.
Dans ton exemple, 6 cellules suffiraient donc, le reste du temps les boxs vont tout droit.

Remarque : ici je suis parti sur ton cas particulier où l'on a autant de sources que de destinations, à voir si c'est vraiment le cas, mais on n'a pas du tout parlé des sources de boxs, pourtant c'est important. Est-ce qu'il y a un flux continu de boxs, avec de nouvelles boxs qui arrivent à chaque tour ? Est-ce qu'il y a autant de sources que de destinations comme dans ton exemple ? Etc.
0
jeaneige Messages postés 7 Date d'inscription vendredi 15 mai 2015 Statut Membre Dernière intervention 27 mars 2017 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
27 mars 2017 à 23:55
Après on peut mettre ce que l'on veut comme valeur dedans, valeur aléatoire ou prédéfinie, ce qui compte c'est juste d'avoir cette valeur dans un coin et pouvoir y accéder.
Parfait ça, c'est donc possible d'avoir un espèce de bouton qui nous permet lequel des dépôts est la cible de notre Boxs ? Si oui, c'est une excellente nouvelle, je te remercie :)

À mon avis, dans ton cas il vaudrait mieux faire des traitements sur les patch plutôt que créer des turtles pour les cellules.
Oui, je pense que c'est donc une meilleure idée de modifier le patch pour que le fond ne sois que des cellules.

Parce que dans ce cas c'est "facile" il suffit d'avoir quelques cellules bien placées et le tour est joué.
Oui, exactement ce n'est pas nécessaire que toutes les cellules changes les Boxs de direction mais seulement certaines bien placés. Mais comment est-il possible pour que la cellule sache quelles Boxs il faut diriger à droite ou en bas ?

Est-ce qu'il y a un flux continu de boxs, avec de nouvelles boxs qui arrivent à chaque tour ? Est-ce qu'il y a autant de sources que de destinations comme dans ton exemple ?
Dans l'idéal, oui il faudrait un flux continu de Box par plusieurs entrées(comme dans mon exemple mais si c'est compliqué, une entrée suffira).
Et dans le max de l'idéal, il faudrait gérer les conflits, c'est à dire que les Boxs ne peuvent pas se croiser.

Créer un vrai flux logistique de paquets qui arrivent sur une plateforme et sont acheminés dans plusieurs dépôts.

Encore merci beaucoup pour votre aide.
0