Sunteți pe pagina 1din 27

Problema comis-voiajorului

rezolvata cu algoritmi
evolutivi

Catalin Stoean
catalin.stoean@inf.ucv.ro
http://inf.ucv.ro/~cstoean
Catalin
Inteligenta Artificiala
Stoean

Problema comis voiajorului


„ Problema:
„ Se dau n oraşe
„ Să se găsească un tur
complet de lungime
minimală
„ Reprezentare:
„ Etichetăm oraşele 1, 2,
…,n
„ Un tur complet este o
permutare (pt. n =4:
[1,2,3,4], [3,4,2,1])
„ Spaţiul de căutare este
imens: pentru 30 de oraşe
sunt 30! ≈ 1032 tururi
posibile! 2/27
Catalin
Inteligenta Artificiala
Stoean

Distantele in km dintre orase


n = 20
1 Bucuresti
2 Satu Mare
Distanta de la
3 Baia Mare Bucuresti la Satu Mare
4 Oradea
5 Arad
6 Timisoara 596 550 574 555 538 394 426 419 330 282 161 126 248 436 349 406 213 278 225
7 Alba Iulia 67 135 250 304 331 170 216 271 333 434 485 544 369 429 463 660 752 815
8 Cluj Napoca 183 298 352 303 146 148 219 305 388 457 516 326 387 420 618 710 768
115 169 278 147 263 249 311 412 463 463 478 444 538 671 763 792
9 Bistrita 52 239 263 378 350 273 415 429 394 593 531 646 674 766 780
10 Targu Mures 217 316 417 327 256 399 406 353 575 509 691 651 743 758
11 Sibiu 160 200 116 113 232 268 293 358 292 407 490 583 612
119 101 163 264 315 374 334 297 390 523 615 644
12 Brasov
89 200 257 352 411 214 247 308 486 578 638
13 Pitesti 112 168 262 321 261 195 310 426 519 548
14 Craiova 142 155 236 358 289 441 401 493 507
15 Suceava 149 205 319 228 299 258 350 380
123 468 378 448 318 404 351
16 Piatra Neamt
524 434 504 434 504 451
17 Iasi 122 144 341 433 520
18 Braila 131 254 346 432
19 Tulcea 271 364 434 Distanta de la Braila la
20 Constanta
92 178 Tulcea
124
3/27
Catalin
Inteligenta Artificiala
Stoean

Ideile principale ale algoritmilor


evolutivi
„ O populaţie cu indivizi există într-un mediu cu resurse limitate.
„ Competiţia pentru aceste resurse face ca selecţia să îi avantajeze
pe indivizii mai buni care s-au adaptat mai bine la mediu.
„ Aceşti indivizi acţionează ca părinţi ai generaţiei de noi indivizi
obţinuţi prin recombinare şi mutaţie.
„ Noii indivizi sunt evaluaţi si luptă pentru supravieţuire cu
generaţia anterioară (posibil chiar cu părinţii lor).
„ Selecţia naturală face ca performanţa populaţiei să crească odată
cu trecerea timpului.
„ Operatorii de variaţie (mutaţia şi recombinarea) creează
diversitatea necesară în populaţii şi aduc noutate.
„ Selecţia reduce diversitatea şi acţionează ca o forţă care duce la
creşterea calităţii.
4/27
Catalin
Inteligenta Artificiala
Stoean

Schema unui algoritm evolutiv


Iniţializare şi
evaluare
Evaluări
2
Populaţia
6 4
9
3 2 3
Evaluarea 7 Selecţia
4
6 9
7

Mutaţia Reproducerea

5/27
Catalin
Inteligenta Artificiala
Stoean

Schema unui algoritm evolutiv

1. Se iniţializează populaţia cu indivizi generaţi aleator;


2. Se evaluează fiecare individ;
3. Cât timp (condiţia de terminare nu este satisfăcută) execută
3.1 Se selectează părinţii;
3.2 Se recombină perechi de părinţi;
3.3 Se aplică mutaţia asupra descendenţilor obţinuţi
după recombinare;
3.4 Se evaluează fiecare descendent;
3.5 Se selectează indivizii care vor forma următoarea
generaţie;
4. Sfârşit cât timp

6/27
Catalin
Inteligenta Artificiala
Stoean

Funcţia obiectiv

„ Înainte de a defini funcţia de performanţă, trebuie stabilit


obiectivul problemei, care este sarcina care trebuie
îndeplinită. Este vorba de găsirea funcţiei obiectiv.

„ În cazul problemei comis-voiajorului, obiectivul se referă


la minimizarea drumului pe care îl parcurge comis-
voiajorul prin vizitarea fiecărui oraş o singură dată cu
întoarcere în oraşul de pornire.

7/27
Catalin
Inteligenta Artificiala
Stoean

Selecţia
„ Procesul de selecţie apare de două ori în cursul unei
parcurgeri a ciclului cât timp a algoritmului evolutiv
prezentat anterior.
„ Selecţia pentru reproducere (selecţia părinţilor), când
sunt aleşi părinţii generaţiei următoare
„ Selecţia pentru înlocuire (selecţia pentru supravieţuire),
care apare când indivizii care vor forma populaţia din
următoarea generaţie sunt aleşi dintre descendenţii
obţinuţi şi indivizii din populaţia curentă.
„ Modul în care creşte calitatea generală a soluţiilor depinde
de ambele tipuri de selecţie.
8/27
Catalin
Inteligenta Artificiala
Stoean

Selecţia pentru reproducere


„ Selecţia pentru reproducere are rolul de a alege, în funcţie
de calitatea indivizilor din populaţia curentă, care sunt cei
consideraţi pentru a se aplica operatori de variaţie asupra
lor în vederea obţinerii de noi soluţii candidat.
„ Selecţia pentru reproducere este probabilistă; indivizii
foarte performanţi au şanse bune de a fi selectaţi pentru
reproducere, în timp ce indivizii cu valori mici pentru funcţia
de performanţă au şanse mici să devină părinţi.
„ Natura probabilistă a selecţiei este cea care face căutarea
să scape de optimele locale.
9/27
Catalin
Inteligenta Artificiala
Stoean

Selecţia turnir
„ Se selectează în mod aleator k indivizi şi sunt evaluaţi.
„ Cel mai bun dintre aceştia este selectat ca şi părinte pentru
populaţia din generaţia următoare.
„ Algoritmul de mai jos selectează N părinţi din generaţia curentă.

i=1
Cât timp i < N execută
Selectează k indivizi în mod aleator din întreaga populaţie
Selectează-l pe cel mai performant individ s din cei k
părinţi[i] = s
i=i+1
Sfârşit cât timp
10/27
Catalin
Inteligenta Artificiala
Stoean

Selecţia pentru supravieţuire

„ Selecţia pentru supravieţuire decide care indivizi din


populaţia curentă împreună cu descendenţii obţinuţi
sunt opriţi pentru a forma populaţia generaţiei
următoare.
„ Cum numărul de indivizi din populaţie este de obicei
constant, selecţia pentru supravieţuire intervine cu
scopul de a păstra aceeaşi mărime a populaţiei.
„ De obicei decizia depinde şi în acest caz de
performanţa indivizilor, cei mai buni fiind favorizaţi.

11/27
Catalin
Inteligenta Artificiala
Stoean

Mutaţia
„ Acţionează asupra unui individ şi produce un altul.
„ După ce se aplică asupra unui individ, rezultatul
(descendent) conţine mici modificări faţă de individul
iniţial.
„ Operatorul face ca toate valorile unei gene să fie
disponibile pentru procesul de căutare.
„ Genele ale căror valori sunt considerate pentru a fi
schimbate sunt alese printr-o manieră probabilistă.
„ Un parametru al algoritmului evolutiv este dat de
probabilitatea de mutaţie.
12/27
Catalin
Inteligenta Artificiala
Stoean

Cum se aplica mutaţia


„ Presupunem că avem probabilitatea de mutaţie pm = 0.3.
„ Notăm mărimea populaţiei cu N.

Pentru i = 1 până la N execută


Pentru j = 1 până la numărul de gene ale cromozomului execută
g = număr aleator în intervalul [0, 1];
Dacă g < pm atunci
Aplică mutaţia pentru gena j a
individului i
Sfârşit dacă
Sfârşit pentru
Sfârşit pentru
13/27
Catalin
Inteligenta Artificiala
Stoean

Mutaţia pentru problema comis-voiajorului

„ O mică variaţie într-o permutare:


„ Se aleg două valori în mod aleator (5 şi 7 în imaginea din
stânga).
„ Poziţiile celor două valori sunt interschimbate.

1 3 5 2 6 4 7 8 1 3 7 2 6 4 5 8

14/27
Catalin
Inteligenta Artificiala
Stoean

Recombinarea
„ Recombinarea sau încrucişarea implică doi sau mai mulţi indivizi
(părinţi) aleşi cu o anumită probabilitate de încrucişare în
scopul de a genera unul, doi sau mai mulţi indivizi prin
combinarea genelor părinţilor.
„ Recombinarea reprezintă un operator stochastic devreme ce
alegeri precum ce părţi să fie moştenite de la un părinte şi ce
părţi de la alt părinte sau modul în care părţile acestea sunt
combinate sunt făcute în mod aleator.
„ Prin împreunarea a doi indivizi cu caracteristici diferite, este
obţinut un descendent (sau doi) care combină aceste
caracteristici.

15/27
Catalin
Inteligenta Artificiala
Stoean

Recombinarea pentru problema


damelor şi pentru comis-voiajor
„ Combinarea a două permutări în două noi permutări:
„ Se alege în mod aleator un punct de încrucişare (linia
verticală)
„ Se copiază primele două părţi în cei doi descendenţi
„ A doua parte se completează prin inserarea de valori de la
celălalt părinte:
„ În ordinea în care apar acolo
„ Începând cu punctul de după tăietură
„ Sărind valorile care se găsesc deja în descendent

1 3 5 2 6 4 7 8 1 3 5 8 6 7 4 2
8 5 6 7 4 3 2 1 8 5 6 1 3 2 4 7
16/27
Catalin
Inteligenta Artificiala
Stoean

Iniţializarea şi condiţia de terminare

„ De obicei iniţializarea se face în mod aleator.


„ În populaţia iniţială se pot include şi soluţii existente.
„ Condiţia de terminare se verifică la fiecare generaţie
„ Atingerea unei anumite performanţe
„ Ajungerea la un anumit număr maxim de generaţii
„ Ajungerea la un nivel foarte mic de diversitate în
populaţie
„ Atingerea unui anumit număr de generaţii fără să se
mai fi câştigat performanţă.

17/27
Catalin
Inteligenta Artificiala
Stoean

Parametri ai algoritmului evolutiv

„ Marimea populatiei: 400 indivizi


„ Probabilitatea de incrucisare pc = 0.4
„ Probabilitatea de mutatie pm = 0.15
„ Numarul de generatii: 450

18/27
Catalin
Inteligenta Artificiala
Stoean

Initializarea distantelor

„ Luam o matrice distanta in care punem distantele intre


orasele i si j, i = 1, …, n si j = 1, …, n.
„ distanta[i, i] = 0, pentru orice i = 1, …, n.
„ distanta[i, j] = distanta[j, i], i = 1, …, n si j = 1, …, n.

19/27
Catalin
Inteligenta Artificiala
Stoean

Initializarea populatiei
Numarul de
orase
functie initializare() intoarce populatia
Pentru fiecare j = 0 pana la dimensiunea populatiei executa
M = {1, 2, …, n}
i=0
Cat timp (lungime(M) > 0) executa
g = (int)(lungime(M) * random(1))
individ[j][i++] = M[g]
Scoate elementul M[g] din multimea M
lungime(M)--;
Sfarsit cat timp
Sfarsit pentru
intoarce individ
20/27
Catalin
Inteligenta Artificiala
Stoean

Functia de evaluare

functie eval(individ[j]) intoarce distanta_totala


distanta_totala = 0;
Pentru i = 1 pana la n-1 executa
distanta_totala = distanta_totala +
distanta(individ[j][i], individ[j][i+1])
Sfarsit pentru
intoarce distanta_totala

21/27
Catalin
Inteligenta Artificiala
Stoean

Selectia turnir

functie selectie_turnir() intoarce populatie


Pentru fiecare j = 0 pana la dimensiunea_populatiei executa
p = (int)(dimensiunea_populatiei * random(1))
q = (int)(dimensiunea_populatiei * random(1))
Daca eval(individ[p]) < eval(individ[q])
individ_nou[j] = individ[p]
Altfel individ_nou[j] = individ[q]
Sfarsit daca
Sfarsit pentru
intoarce individ_nou
22/27
Catalin
Inteligenta Artificiala
Stoean

Mutatie
functie mutatie() intoarce populatie
Pentru i = 0 pana la dimensiunea_populatiei executa
Pentru j = 0 pana la lungime(individ) executa
p = random(1)
Daca (p < pm) atunci
x = (int)(lungime(individ) * random(1))
Cat timp (x == j) executa
x = (int)(lungime(individ) * random(1))
Sfarsit cat timp
temp = individ[x]
individ[x] = individ[j]
individ[j] = temp
Sfarsit daca
Sfarsit pentru
Sfarsit pentru
intoarce individ
23/27
Catalin
Inteligenta Artificiala
Stoean

Incrucisare
functie incrucisare() intoarce populatie
j = 0;
Pentru i = 0 pana la dimensiunea_populatiei executa
p = random(1)
Daca (p < pc) atunci
parinte[j++] = individ[i]
Sfarsit daca
Safrsit pentru
Punem in individ_nou toti indivizii care nu au fost alesi ca parinti.
Pentru (i = 0; i < j; i +=2)
punct_taietura = (int)(lungime(individ) * random(1))
Pentru k = 0 pana la punct_taietura executa
descendent1[k] = parinte[i][k]
descendent2[k] = parinte[i + 1][k]
Sfarsit pentru
24/27
Catalin
Inteligenta Artificiala
Stoean

Incrucisare (continuare)
functie incrucisare() intoarce populatie
…………
Pentru q = 0 pana la lungime(individ) executa
exista = fals;
Pentru k = 0 pana la punct_taietura executa
Daca parinte[i + 1][q] == descendent1[k])
exista = adevarat;
Sfarsit daca
Daca (!exista)
descendent1.[punct_taietura++] = parinte[i + 1][j];
Sfarsit daca
Sfarsit pentru
Sfarsit pentru
//analog se procedeaza pentru al doilea descendent
25/27
Catalin
Inteligenta Artificiala
Stoean

Incrucisare (continuare 2)

functie incrucisare() intoarce populatie


…………
Se adauga la individ_nou descendentii descendent1 si descendent2.
Sfarsit pentru (i = 0; i < j; i +=2)
intoarce individ_nou

26/27
Catalin
Inteligenta Artificiala
Stoean

Algoritmul evolutiv

individ = initializare()
Pentru t = 0 pana la numarul total de generatii executa
individ = selectie_turnir(individ)
individ = incrucisare()
individ = mutatie()
Sfarsit pentru

27/27

S-ar putea să vă placă și