Principe: On comence par une solution nulle et à chaque itération on ajoute un élément (sommet, arc, job, tâche, etc) jusqu'à l'obtention d'une solution complète
Problème : soit G = <S, A>
un graphe non orienté
∀ (i, j) ∈ C(i, j) coût de l'arrête
Trouver un arbre couvrant de coût minimal
Début de l'algorithme :
T = O T = {(1,2)} T = T U (4,6) T = T U (2,5) T = T U (5,7) T = T U (3,4) stop
On ne prend pas la (3,6) parce que ca fait un cycle. On arrête car tous les somets sont couverts.
C(T) = 2 + 7 + 8 + 8 + 10 + 3
Remarque : T est un arbre optimal
Trouver un cycle Hamiltonien de coût
Heuristique constructive du plus proche voisin. π = < 1 >
π = <1> i = 1, z = 0 tant que π != S faire C(i, j) = min { C(i, k) : k ∈ S - π} z = z + C(i, j) π = π U {j} j = i fin z = z + c(i, 1)
max z = ∑ Cj xj s.c. ∑ aj xj <= b xj ∈ {0, 1} j = 1, ..., n
Trier les objets j selon un ordre
xj ∀j = 1, ..., n
z = 0 j = 1 Δ = b tant que (j <= n) faire si aj <= Δ alors xj = 1 z = z + Cj Δ = Δ - aj fin j++ fin
Remarque : En général pour les problèmes NP-difficiles les heuristiques constructives ne garantissent ni l'optimalité ni la réalisabilité de la solution finale
On commence par une solution irréalisabe et à chaque itération on retire un élément jusqu'à l'obtention éventuelle d'une solution réalisable.
Remarque : stratégie d'oscillation alterné entre les phases constructives et destructives
Principe : on commence par une solution initiale x0 et on essaye d'améliorer la qualité de cette dernière
Il y a 2 cas :
Cas 1: x0 est réalisable et ƒ0 = ƒ(x0), x0 → xk tel que ƒ(xk) ≤ ƒ(x0)
Cas 2 : x0 irréalisable Δ0 : violation de la réalisabilité, x0 -> xk tel que Δk ≤ Δ0
Simplexe :
x0 -> x1 -> ... -> xk
cx0 ≤ cx1 ... ≤ cxk
Problème : min ƒ(x) s.c. x ∈ X ⊆ E
Voisinnage : v : E → P(E)
x ∼> V(x) ⊆ E
x0 : Solution initiale
x = x0 Fin = faux tant que non Fin faire selectionner x ∈ V(x) tel que f(x') < f(x) si x' existe alors x = x' sinon Fin = vrai fin fin retourner x
Remarque : les méthodes de descente sont appelées aussi méthodes de recherche locale.
Elles dépendent de :
- La solution initiale.
=> La solution finale est une optimisation locale.
- Du voisinnage V
La taille de | V(x) | dépend du problème.
- Choix de l'améliorant
Ici 14.
Δ = ƒ(x) - ƒ(x')
Exemple : Problème du sac à dos x ∈ { 0, 1 }n.
ƒ(x) = ∑ Cj xj
ƒ(x') → O(n)
V(x) = { x' : ∑ | x'i - xi | }
xj ∈ V(x)
Δj = ƒ(x) - ƒ(xj)
= c1x1 + ... + cnxn
- c1xj1 + ... + cnxjn
= cjxj - cjxjj
= cj(2xj - 1)
Problème du voyageur de commerce
Voisinnage 2 - 0
π' ∈ V(π)
Δ = C(π) - C(π')
Complexité en O(1).
x0 : Solution initiale
x = x0 x* = x // Meilleure solution Fin = faux tant que non Fin faire selectionner aleatoirement x' ∈ V(x) si f(x') < f(x*) alors x* = x' fin x = x' MAJ Fin fin
Test d'arrêt :