Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(ggplot2)
- library(genalg)
- library(GA)
- library(foreach)
- #ALGORITMI GENETICI
- #Un capital de 8 miliarde de lei este disponibil pentru amplasarea unor unitati productive
- #in 3 localitati, L1,L2,L3. Costul amplasarii depinde de fiecare localitate avand valorile
- #1,3 miliarde L1, 1,2 miliarde L2 si 1,7 miliarde L3
- #Profiturile unitare asociate investitiilor din fiecare localitate sunt
- #0,34 miliarde L1, 0,32 L2, 0.5 pentru L3
- #Sa se stabileasca ce localitati trebuie alese si cate unitati productive xi trebuie construite in fiecare localitate
- #pentru ca beneficiul total sa fie maxim
- #Rezolvare
- #Pas1: definirea cromozonilor si codificarea
- # max 0,34x1+0,32x2+0,5x3 pe restrictie 1.3x1+1.2x2+1.7x3<=8, xi>=0 , i=1,3
- #Trebuie sa vedem numarul maxim de unitati productive din fiecare localitate
- #x2=x3=0 avem 1.3*6=7,8<=8 => x1 max =6
- #daca x1=x3=0 avem 1.2*6=7.2<=8 x2 max=6
- #daca x1=x2=0 avem 1.7*4=6,8=>x3 max =4
- #scriem 6 din baza 10 in baza 2 si este 110
- #scriem 4 din baza 10 in baza 2 si este 100
- #Un cromozom este obtinut prin concatenarea lui x1,x2,x3 care au 3 biti in baza 2 un cromozom va fi x=x1x2x3 si are 9 biti
- #Spatiul de cautare al solutiilor este submultimea {0,1}^9 formata din solutiile admisibile ale problemei
- #fiecarui cromozom i se asociaza o functie de aptitudine care masoara performanta cromozomului
- #in acest caz functia de aptitudine masoara beneficiul total cand investitia se incadreaza in 8 miliarde si 0 in caz contrar
- #f(x1,x2,x3)={0.34x1+0.32x2+0.5x3, cand e satisfacuta R1 si 0 in caz contrar) R1 e cea cu profitul
- #populatia initiala si selectia
- #se considera o populatie formata aleator din 4 cromozomi
- #se calculeaza functia de aptitudine si proportia pentru generatia urmatoare(numarul mediu al descendentilor fiecarui cromozom)
- # Cromozomul i f(xi) ni
- # x1 x2 x3
- # 001 001 001 1.16 1.16/1.2=0.96
- # 000 001 001 0.82 0.82/1.2=0.68
- # 010 000 001 1.18 1.18/1.2=0.98
- # 000 010 010 1.64 1.64/1.2=1.36
- #Performanta totala 4.8
- #performanta medie 4.8/4=1.2
- #f(1,1,1)= 0.34+0.32+0.5=1.16
- #f(0,1,1)= 0.32+0.5=0.82
- #f(2,0,1)= 0.34*2+ 0.5=1.18
- #f(0,2,2)=1+0.64=1.64
- #selectia: aleator cromozomul cu performanta cea mai mare adica cel mai apt este cromozomul 4 cu perf 1.64
- #apare aleator in locul altui cromozom de exemplu in locul primului cromozom si trebuie sa vedem ce se intampla
- #Cromozomii f(xi) ni
- #000 010 010 1.64 1.64/1.32=1.24
- #000 001 001 0.82 0.82/1.32=0.62
- #010 000 001 1.18 1.18/1.32=0.89
- #000 010 010 1.64 1.64/1.32=1.24
- #Perf total= 5.28
- #Perf medie= 1.32
- #Etapa 3 incrucisarea
- #se va face o incrucisare aleatoare intre cromozomii 2 si 3 in pozitia a 4-a
- #pozitia poate fi fixata
- # 000 0|01 001 => 000 0 00 001
- # 010 0|00 001 => 0100 01 001
- #Cromozomi f(xi) ni
- #000 010 010 1.64 1.24
- #000 000 001 0.5 0.5/1.32=0.37
- #010 001 001 1.5 1.5/1.32=1.13
- #000 010 010 1.64 1.24
- #total 5,28
- #medie 1,32
- #etapa 4 mutatia - se efectueaza aleator o mutatie la bitul 4 al primului cromozom
- #se mai obtine un tabel
- #Cromozomi f(xi) ni
- #000 110 010 0 0
- #000 000 001 0.5 0.5/0.91=0.54
- #010 001 001 1.5 0.64
- #000 010 010 1.64 1.80
- #Total 3,64
- #Medie 0,91
- #selectia a doua - aleator in locul primului cromozom apare cromozomul 4 cu aptitudinea cea mai mare
- #iar in locul cromozomului 2 apare cromozomul 3 cu aptitudinea imediat descrescatoare
- #Cromozomi f(xi) ni
- #000 010 010 1.64 1.64/1.57=1.04
- #010 001 001 1.5 0.95
- #010 001 001 1.5 0.95
- #000 010 010 1.64 1.04
- #Total 6.28
- #Media 1.57
- #continuand prin acest mod se ajunge la cromozomul 000 001 100
- #x1*=0, x2*=1,x3*=4 f(0,1,4)=0.32+2=2,32 miliarde
- ##############################
- ##############################
- #sa se determine minimul functiei de o variabila f(x)=|x|+cos(x),xE[-20,20]
- f<-function(x) abs(x)+cos(x)
- f
- min<- -20
- max<- 20
- curve(f,min,max)
- #functia fitness(functia de aptitudine) trebuie sa aiba mereu valori pozitive
- fitness<-function(x) -f(x)
- #vrem sa minimizam f
- functiega<- ga(type="real-valued",fitness=fitness,min=min,max=max)
- functiega
- #o medie a valoriilor functiile de evaluare pentru toata populatia
- #si valoarea cea mai buna
- plot(functiega)
- summary(functiega)
- #elitism numarul de indivizi cei mai performanti care supravietuiesc la fiecare generatie (5% din totalul populatiei supravietuieste)
- #probabilitatea de incrucisare(crossover probability)
- #Sa se determine maximul functiei f(x)=(x^2+x)cosx,xE[-10,10]
- f<-function(x) (x^2+x)*cos(x)
- min<- -10
- max<- 10
- curve(f,min,max)
- functiega<- ga(type="real-valued",fitness=f,min=min,max=max)
- #trebuie sa-l maximizam pe f de aceea il punem la fitness
- plot(functiega)
- summary(functiega)
- #problema rucsacului
- #iti vei petrece o luna in excursie greutatea maxima a unui rucsac este de 20kg
- #ai la dispozitie un numar de obiecte de supravietuire fiecare avand un numar de puncte
- #obiectivul este de a maximiza numarul de puncte
- #Obiect Nr.puncte Greutate
- #Briceag 10 1
- #Fasole 20 5
- #cartofi 15 10
- #Ceapa 2 1
- #sacdedormit 30 7
- #sfoara 10 5
- #busola 30 1
- date<-data.frame(obiect=c("briceag","fasole","cartofi","ceapa","sacdedormit","sfoara","busola"),
- puncte=c(10,20,15,2,30,10,30),greutate=c(1,5,10,1,7,5,1))
- greutatelimita<-20
- evalfunc<-function(x){current_solution_puncte<-x%*%date$puncte
- current_solution_greutate<- x%*%date$greutate
- if(current_solution_greutate>greutatelimita) return(0)
- else return(-current_solution_puncte)}
- #inmultirea a doi vectori %*%
- #algoritmul gen alg optimizeaza o functie de minim si noi avem obiectivul sa maximizam puncte
- #trebuie sa fixam numarul de iteratii
- iter=100
- ga<-rbga.bin(size=7,popSize=200,iter=iter,mutationChance=0.01,elitism=T,evalFunc=evalfunc)
- #size e marimea cromozomului, 7 gene pentru ca 7 obiecte, elitism=T 5% sa traiasca
- cat(summary(ga))
- #1 inseamna ca ia obiectul, 0 inseamna ca nu-l ia
- solutie<-c(1,1,0,1,1,1,1)
- date[solutie==1,]
- cat(solutie%*%date$puncte)
Advertisement
Add Comment
Please, Sign In to add comment