Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
restricted:opti-c-tp1 [2022/05/24 12:01] – créée edauce | restricted:opti-c-tp1 [2023/09/10 23:35] (Version actuelle) – edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ==== TP1 ==== | ||
+ | |||
+ | Le TP sera écrit en Python. Pour l’affichage de la carte et du chemin proposé, on utilisera la librairie {{https:// | ||
+ | |||
+ | <code python> | ||
+ | import numpy as np | ||
+ | import matplotlib.pyplot as plt | ||
+ | import random | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | * permutation d’une liste d’entiers : | ||
+ | <code python> | ||
+ | np.random.permutation(range(n)) | ||
+ | </ | ||
+ | * copie de liste : | ||
+ | <code python> | ||
+ | copie_de_l = list(l) | ||
+ | </ | ||
+ | → important pour déterminer la liste des voisins | ||
+ | </ | ||
+ | |||
+ | === Problème du voyageur de commerce === | ||
+ | Un voyageur de commerce doit visiter $n$ villes au cours de sa tournée numérotées $0, | ||
+ | * ordre $i \rightarrow s(i) ∈ 0..n-1$ | ||
+ | sous la contrainte que chaque ville doit être visitée une fois et une seule. | ||
+ | (autrement dit, $s$ est une permutation de $(0, | ||
+ | Le coût d’une solution s est : | ||
+ | $$J(s) = \sum_{i=0}^{n-2} d(s(i), | ||
+ | avec: | ||
+ | $$d(s(i), s(j)) = \sqrt{(x_{s(i)} - x_{s(j)})^2 + (y_{s(i)} - y_{s(j)})^2}$$ | ||
+ | |||
+ | Le problème d’optimisation consiste à // | ||
+ | |||
+ | === Résolution par optimisation stochastique === | ||
+ | Le but est d’écrire une librairie Python permettant de résoudre le problème du voyageur de commerce. | ||
+ | |||
+ | Un problème de voyageur de commerce sera décrit sous la forme d’une liste de villes avec leurs coordonnées géographiques. | ||
+ | |||
+ | <note tip> | ||
+ | Pour simplifier, on peut tirer les coordonnées de toutes les villes au hasard entre 0 et 1 pour les abcisses et les ordonnées | ||
+ | </ | ||
+ | |||
+ | Une solution s sera définie come une permutation de la liste des n premiers entiers | ||
+ | |||
+ | Ecrire une fonction qui affiche graphiquement la solution courante (comme une série de segments reliant les points dans l' | ||
+ | |||
+ | Implémentez ensuite plusieurs méthodes de résolution. Vous devez impérativement implémenter | ||
+ | * la Méthode de Monte Carlo | ||
+ | * et la Méthode glouton. | ||
+ | |||
+ | Pensez en particulier écrire les fonctions suivantes: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | <note tip> | ||
+ | * Le voisin d'une solution s est obtenu en permutant deux éléments de s | ||
+ | * L' | ||
+ | </ | ||
+ | |||
+ | Puis vous implementerez au choix : | ||
+ | * méthode tabou (hyperparamètre K) | ||
+ | * la méthode du recuit simulé (hypermaramètres $\beta_0$ et ε) | ||
+ | |||
+ | |||
+ | === Tableau comparatif === | ||
+ | Une fois vos méthodes testées, vous devez indiquer pour chaque méthode la longueur du chemin trouvé pour n = 10, n = 20, n = 40, n = 80 et n = 160, ainsi que le temps de calcul nécessaire pour obtenir la solution. | ||
+ | |||
+ | Vous afficherez graphiquement les différents chemins trouvés. | ||
+ | |||
+ | === Rappels === | ||
+ | |||
+ | **Monte Carlo :** | ||
+ | < | ||
+ | données : N | ||
+ | J* ← + infini | ||
+ | pour i de 1 à N: | ||
+ | tirer un parcours s au hasard | ||
+ | si J(s) < J* alors: | ||
+ | J* ← J | ||
+ | s* ← s | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Glouton :** | ||
+ | < | ||
+ | données : s | ||
+ | J* ← +infini | ||
+ | tant que J(s) < J*: | ||
+ | J* <-- J(s) | ||
+ | s <-- argmin_J(s) | ||
+ | </ | ||
+ | |||
+ | **Glouton aléatoire :** | ||
+ | < | ||
+ | données : s | ||
+ | J* <-- +infini | ||
+ | Pour i de 1 à N: | ||
+ | choisir au hasard s’ voisin de s | ||
+ | si J(s’) < J(s) alors: | ||
+ | J* <-- J | ||
+ | s <-- s’ | ||
+ | </ | ||
+ | |||
+ | **Tabou :** | ||
+ | < | ||
+ | données : s,K | ||
+ | J* ← +infini | ||
+ | tabou ← [] | ||
+ | Pour i de 1 à N: | ||
+ | si J(s) < J* : | ||
+ | J* ← J(s) | ||
+ | s* ← s | ||
+ | | ||
+ | | ||
+ | s ← argmin_J(s, | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Recuit :** | ||
+ | < | ||
+ | données : s, beta_0, eps | ||
+ | beta <--- beta_0 | ||
+ | Pour i de 1 à N: | ||
+ | choisir au hasard s’ voisin de s | ||
+ | si J(s’) < J(s) alors: | ||
+ | ACCEPTER | ||
+ | sinon : | ||
+ | p = exp(-beta * (J(s’)-J(s))) | ||
+ | x <-- tirage_uniforme sur [0,1] | ||
+ | si x < p alors: | ||
+ | ACCEPTER | ||
+ | sinon: | ||
+ | REFUSER | ||
+ | si ACCEPTER: | ||
+ | s <-- s’ | ||
+ | beta <-- (1+eps) * beta | ||
+ | </ | ||
+ | |||
+ | |||