Sunteți pe pagina 1din 17

lab3

Teodora Ursu
April 2023

1 Cerinta 1:
1.Să se implementeze unalgoritm evolutiv pentru problema rucsacului.
a.Codificare binară
b.Operatori specifici (incrucisare, mutatie)
c.Algoritm şi parametrizared.Experimente pe cele două instanţe primite la Tema
1

1.1 Rezolvare:
Pentru rezolvarea acestei probleme am folosit urmatoarele functii:
Functia de citire are ca parametru numele fisierului, si returneaza prima val-
oare citita din fisier (in acest caz numarul de inregistrari), un array care contine
greutatea obiectelor (numit weight), un array care contine valoarea obiectelor
(numit values), si valoarea finala din fisier, care reprezinta capacitatea ghioz-
danului.
Functia random gen genereaza un array de 0 si 1, de lungimea data ca si
parametru.
Functia best genereaza un numar de k (k-introdus de la tastatura) solutii pen-
tru problema data. In cazul in care sunt mai multe solutii acceptate, va returna
si solutia cea mai calitativa, precum si calitatea medie a solutiilor acceptate.
Totodata, functia returneaza si numarul de solutii generate acceptate.
Folosita ca si best(1) genereaza o solutie.
Functia solution acc verifica daca solutia transmisa prin parametrul sol este
acceptata, adica daca greutatea obiectelor introduse este mai mica decat capac-
itatea ghiozdanului.
Functia check quality verifica calitatea solutiei, calculand valoarea obiectelor
introduse in ghiozdan.
Functia fitness calculeaza fitness-ul solutiei. Daca configuratia este valida, ii
returneaza valoarea.
Functia selection(population) selecteaza, pe baza procentajului fitnessulin-
dividual in suma totala 2 parinti (indexul acestora)
Functia tournament selection selecteaza parintii prin metoda turnir, dimen-
siunea turnirului fiind data ca parametru
Functia crossover(parent1, parent2) realizeaza o interschimbare la un punct

1
aleatoriu intre cei 2 parinti.
Functia mutation(chromosome) realizeaza o mutatie aleatorie a cromo-
zomilor, influentata de rata de mutatie
Functia generate population genereaza o populatie de lungimea data de
parametrul population size, populand vectorii population fitness si population
Functia create new population creeaza populatie noua, generand 2 copii pe
baza crossoverului dintre parintii alesi, carora le aplica mutatii

1.2 Experimente:
1.2.1 RUCSAC-20:
1. In prima varianta de rulare, se genereaza o populatie initiala pe baza careia
se creaza, pentru un numar dat de generatii, noi populatii. Noua populatie
inlocuiste populatia initiala. La final, se verifica cel mai bun rezultat. In timpul
crearii populatiilor nu se verifica daca solutiile generate sunt sau nu acceptate,
verificarea facand-se doar la final, cand se alege cea mai buna solutie.

• consideram k= 10, population size = 100 mutation rate = 0.1 si genera-


tions = 1000

nr.crt solutie
1 659
2 675
3 695
4 657
5 697 avg = 656.0
6 589
7 682
8 616
9 650
10 640

• consideram k= 10, population size = 100, mutation rate = 0.01,genera-


tions = 10000

nr.crt solutie
1 625
2 668
3 599
4 669
5 645 avg = 650.9
6 607
7 721
8 672
9 621
10 682

2
• consideram k= 10, population size = 100, mutation rate = 0.001,genera-
tions = 10000

nr.crt solutie
1 0
2 551
3 572
4 574
5 781 avg = 531.7
6 598
7 430
8 532
9 672
10 607

2. In a 2-a varianta de rulare, se genereaza o populatie initiala pe baza careia


se creaza, pentru un numar dat de generatii, noi populatii. Noua populatie
inlocuiste populatia initiala. La final, se verifica cel mai bun rezultat. In timpul
crearii populatiilor se verifica daca copiii generati sunt solutii, iar in caz contrar
se genereaza alti copii pana cand se gaseste o solutie acceptata sau se atinge
numarul maxim de incercari (incercari = 100).
• consideram k= 10, population size = 100 mutation rate = 0.1 si genera-
tions = 1000

nr.crt solutie
1 645
2 676
3 703
4 690
5 684 avg = 665.7
6 634
7 610
8 701
9 622
10 692

• consideram k= 10, population size = 100, mutation rate = 0.01,genera-


tions = 10000

3
nr.crt solutie
1 624
2 640
3 586
4 612
5 590 avg = 628.1
6 640
7 645
8 621
9 651
10 672

• consideram k= 10, population size = 100, mutation rate = 0.001,genera-


tions = 10000
nr.crt solutie
1 618
2 493
3 446
4 481
5 368 avg = 528.8
6 509
7 593
8 661
9 533
10 586

3. In cea de-a treia varianta, folosim o selectie de tip turnir, si verificam doar
la final daca solutiile generate sun viabile pentru a le considera pentru best.
Consideram tournament size = 10
• consideram k= 10, population size = 100 mutation rate = 0.1 si genera-
tions = 1000
nr.crt solutie
1 690
2 669
3 699
4 669
5 664 avg =673.0
6 692
7 682
8 661
9 634
10 670

• consideram k= 10, population size = 100 mutation rate = 0.01, genera-


tions = 10000

4
nr.crt solutie
1 685
2 683
3 589
4 723
5 614 avg = 648.8
6 612
7 675
8 591
9 615
10 701
• consideram k= 10,population size = 100, mutation rate = 0.001, genera-
tions = 10000
nr.crt solutie
1 698
2 595
3 425
4 538
5 555 avg = 517.3
6 644
7 478
8 423
9 373
10 444

1.2.2 RUCSAC-200:
1. In prima varianta de rulare, se genereaza o populatie initiala pe baza careia
se creaza, pentru un numar dat de generatii, noi populatii. Noua populatie
inlocuiste populatia initiala. La final, se verifica cel mai bun rezultat. In timpul
crearii populatiilor nu se verifica daca solutiile generate sunt sau nu acceptate,
verificarea facand-se doar la final, cand se alege cea mai buna solutie.
• consideram k= 10, population size = 100 mutation rate = 0.1 si genera-
tions = 1000
nr.crt solutie
1 95628
2 97042
3 94230
4 95678
5 93274 avg = 94608.9
6 94673
7 95281
8 95630
9 93770
10 90883

5
• consideram k= 10, population size = 100, mutation rate = 0.01,genera-
tions = 10000
nr.crt solutie
1 96425
2 94227
3 95170
4 0
5 96458 avg =67079.2
6 95989
7 0
8 0
9 96345
10 96178

• consideram k= 10, population size = 100, mutation rate = 0.001,genera-


tions = 10000
nr.crt solutie
1 0
2 551
3 572
4 574
5 781 avg = 531.7
6 598
7 430
8 532
9 672
10 607

2. In cea de-a doua varianta, folosim o selectie de tip turnir, si verificam


doar la final daca solutiile generate sun viabile pentru a le considera pentru
best. Consideram tournament size = 10
• consideram k= 10, population size = 100 mutation rate = 0.1 si genera-
tions = 1000
nr.crt solutie
1 0
2 95408
3 94788
4 92719
5 93029 avg =89746.9
6 97176
7 96701
8 94699
9 95099
10 96370

6
• consideram k= 10, population size = 100 mutation rate = 0.01, genera-
tions = 10000

nr.crt solutie
1 94945
2 0
3 94116
4 95911
5 88582 avg = 84897.6
6 91987
7 96134
8 96009
9 94991
10 96301

• consideram k= 10,population size = 100, mutation rate = 0.001, genera-


tions = 10000

nr.crt solutie
1 96043
2 0
3 0
4 96160
5 0 avg = 19220.3
6 0
7 0
8 0
9 0
10 0

2 Cerinta 2:
2.Să se implementeze unalgoritm evolutiv pentru problema comis-voiajorului.
a.Codificare prin permutări
b.Operatori specifici (incrucisare, mutatie)
c.Algoritm şi parametrizared.Experimente pe instanţa primită la Tema 2

2.1 Rezolvare:
Pentru rezolvarea acestei probleme am folosit urmatoarele functii:
Functia read from file: Funcita primeste ca si parametru numele fisierului
din care ia datele, pe care le parseaza si le adauga in vectorul de orase.
Functia distance: Functia primeste 2 orase si returneaza distanta dintre ele
Functia fitness: Functia primeste ca parametri un tur si vectorul de orase,
si returneaza distanta parcursa pentru a vizita orasele
Functia create tour: Functia primeste ca parametru numarul de orase si

7
genereaza un posibil tur.
Functia create population: Creeaza o populatie de tururi de dimensiuni
date.
Functia selection: Selecteaza 2 indivizi din populatie, pe baza fitnessului
Functia selection tour: Realizeaza selectia de tip turnir
Functia crossover: Primeste 2 parinti intre care realizeaza crossoverul si
returneaza cei 2 copii formati.
Functia mutation: Se genereaza numar aleator, daca acesta este mai mic
decat rata de mutatie, se interschimba 2 indivizi din turul dat ca si parametru
Functia evolutionary algorithm: Functia primeste vectorul de orase si un
array folosit pentru grafic. Se genereaza o populatie initiala, iar apoi, pentru
fiecare generatie din numarul de generatii date, se calculeaza cel mai bun tur
Functia get the best tour: primeste o populatie initiala careia ii adauga
noi indivizi. Populatia nou formata se sorteaza pe baza fitnessului si se aleg
un numar de inivizi conform cu populatia initiala. Noua populatie si best tour
sunt returnate.
Functia new population: se aleg doi parinti intre care se face crossoverul si
se aplica functia de mutare pe copii.

2.2 Experimente:
1. In prima varianta de rulare, se genereaza o populatie initiala pe baza careia se
creaza, apoi, urmatoarea populatie. Din populatia nou formata se alege cel mai
buni individ. Selectia parintilor pentru crossover se face tinand cont e fitnessul
acestora.
• consideram k= 10,population size = 10, mutation rate = 0.1, generations
= 100

nr.crt solutie
1 543705.67
2 560832.66
3 539687.84
4 548672.45
5 579966.65 avg fitness: 552060.672
6 507713.35
7 567138.08
8 540770.79
9 564299.42
10 567819.81

Cel mai bun fitness l-a avut a 6 iteratie: 507713.35 avand urmatoarea
evolutie pe generatii:

8
• consideram k= 10,population size = 50, mutation rate = 0.1,
generations = 100

nr.crt solutie
1 514011.89
2 467990.04
3 518219.07
4 525817.53
5 516005.98 avg fitness: 515981.854
6 529746.64
7 519920.3
8 517194.29
9 521642.19
10 529270.61

el mai bun fitness l-a avut a 2 iteratie: 467990.04 avand urmatoarea


evolutie pe generatii:

9
• consideram k= 10,population size = 50, mutation rate = 0.1,
generations = 500

nr.crt solutie
1 525939.92
2 515809.82
3 519322.77
4 512486.11
5 517792.8 avg fitness: 515682.685
6 490907.5
7 511877.84
8 509683.71
9 517579.29
10 535427.1

Cel mai bun fitness l-a avut a 6 iteratie: 490907.5 avand urmatoarea
evolutie pe generatii:

10
2. In cea de-a doua varianta de rulare, atunci cand se genereaza o noua
populatie, se pastreaza populatia intiala caruia i se adauga o populatie de copii
generata se populatia initiala, si se sorteaza noul vector pe baza fitnessului. Din
vectorul nou format se ia o populatie de dimensiunile populatiei initiale.

• consideram k= 10,population size = 10, mutation rate = 0.1, generations


= 100

nr.crt solutie
1 401794.1
2 383278.8
3 374263.65
4 386416.08
5 393257.17 avg fitness: 387055.599
6 419522.92
7 376046.43
8 395984.67
9 372139.07
10 367853.1

Cel mai bun fitness l-a avut a 10 iteratie: 367853.1 avand urmatoarea
evolutie pe generatii:

11
• consideram k= 10,population size = 50, mutation rate = 0.1,
generations = 100

nr.crt solutie
1 277734.6
2 290161.9
3 292453.95
4 291755.56
5 258724.94 avg fitness: 271634.398
6 249953.01
7 281659.4
8 239481.33
9 269884.02
10 264535.27

Cel mai bun fitness l-a avut a 8 iteratie: 239481.33 avand urmatoarea
evolutie pe generatii:

12
• consideram k= 10,population size = 50, mutation rate = 0.1,
generations = 500

nr.crt solutie
1 199690.03
2 195551.64
3 198055.69
4 215346.84
5 183286.22 avg fitness: 202660.894
6 205518.21
7 214122.69
8 205652.91
9 205454.49
10 203930.22

Cel mai bun fitness l-a avut a 5 iteratie: 183286.22 avand urmatoarea
evolutie pe generatii:

13
2. In cea de-a treia varianta de rulare, se modifica fata de ce-a de-a doua,
selectia, folosindu-se o selectie de tip turnir..
• consideram k= 10,population size = 10, mutation rate = 0.1, generations
= 100

nr.crt solutie
1 385564.56
2 375680.97
3 384468.42
4 388617.73
5 391246.98 avg fitness: 375409.315
6 378074.91
7 336021.9
8 396568.19
9 359894.97
10 357954.52

Cel mai bun fitness l-a avut a 7 iteratie: 336021.9 avand urmatoarea
evolutie pe generatii:

14
• consideram k= 10,population size = 50, mutation rate = 0.1,
generations = 100

nr.crt solutie
1 345486.23
2 335261.84
3 343087.67
4 312205.07
5 333487.73 avg fitness: 327467.844
6 327527.76
7 339033.36
8 327041.86
9 306875.0
10 304671.92

Cel mai bun fitness l-a avut a 10 iteratie: 304671.92 avand urmatoarea
evolutie pe generatii:

15
• consideram k= 10,population size = 50, mutation rate = 0.1,
generations = 500

nr.crt solutie
1 199448.04
2 203896.56
3 175142.57
4 185220.57
5 189060.71 avg fitness: 188489.975
6 194859.08
7 162709.02
8 187470.17
9 196124.39
10 190968.64

Cel mai bun fitness l-a avut a 7 iteratie: 162709.02 avand urmatoarea
evolutie pe generatii:

16
3 Concluzii:
In concluzie, se poate observa ca pentru ambele probleme, inlocuirea populatiei
initiale partial sau total cu poopulatie mai buna creste eficacitatea algoritmului.
Pentru problema rucsacului, cea mai buna solutie s-a dovedit a fi verificarea la
final a solutiei viabile, pentru ca inercand sa generam solutii acceptate (obliga-
toriu) pe parcurs, ajungem la solutii slabe. Daca verificam doar la final daca
sunt acceptate sau nu, avem sanse sa eliminam adaugarea solutiilor acceptate
dar slabe. Si pentru problema TSP se poate observa cum solutiile sunt mai
bune daca amestecam popualtia initiala cu cea nou formata. In ceea ce priveste
alegerea parintilor, alegerea pe baza fitnessului este mai buna ca selectia turnir,
pentru un numar mic de generatii. Pentru numar mare de generatii, este mai
eficienta selectia de tip turnit.

17

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