Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- class ApstraktnaIndividua:
- Fitness=0.0
- def __init__(self,duzinaHromozoma):
- if duzinaHromozoma<2 or int(duzinaHromozoma)!=duzinaHromozoma:
- raise Exception ('Duzina hromozoma mora biti veca od 2 i hromozom mora biti tipa int')
- else:
- self.DuzinaHromozoma=duzinaHromozoma
- self.Hromozom=[]
- for i in range(self.DuzinaHromozoma):
- self.Hromozom.append(random.randint(0,1))
- def GetDuzinaHromozoma(self):
- return self.DuzinaHromozoma
- def SetDuzinaHromozoma(self, DuzinaHromozoma):
- if DuzinaHromozoma < 2 or int(DuzinaHromozoma) != DuzinaHromozoma:
- raise Exception ('Duzina hromozoma mora biti veca od 2 i hromozom mora biti tipa int')
- else:
- self.DuzinaHromozoma = DuzinaHromozoma
- def GetFitness(self):
- return self.Fitness
- def SetFitness(self,Fitness):
- self.Fitness=Fitness
- def GetHromozom(self):
- return self.Hromozom
- def SetHromozom(self, Hromozom):
- for i in Hromozom:
- if i!=0 and i!=1:
- raise Exception ('Hromozom nije binarno kodiran')
- self.Hromozom = []
- self.Hromozom = Hromozom
- self.DuzinaHromozoma=len(Hromozom)
- def Evaluiraj(self):
- pass
- class Populacija:
- VelicinaPopulacije=0
- VjerovatnocaUkrstanja=0.0
- VjerovatnocaMutacije=0.0
- MaxGeneracija=0
- VelicinaElite=0
- populacija=[]
- def __init__(self,VelicinaPopulacije,VjerovatnocaUkrstanja,VjerovatnocaMutacije,MaxGeneracija,VelicinaElite,DuzinaHromozoma=16):
- if VelicinaPopulacije<2 or (VjerovatnocaUkrstanja>1 or VjerovatnocaUkrstanja<0) or (VjerovatnocaMutacije>1 or VjerovatnocaMutacije<0) or (VelicinaElite>2 or VjerovatnocaUkrstanja<0) or int(MaxGeneracija)!=MaxGeneracija:
- raise Exception ('Nepravilna velicina populacije ili elite ili vjerovatnoce mutacije i ukrstaanja nisu u opsegu ili max generacija parametar nije int')
- else:
- if int(VelicinaPopulacije)!=VelicinaPopulacije or int(VelicinaElite)!=VelicinaElite:
- raise Exception('Velicina populacije ili velicina elite int')
- self.VelicinaPopulacije=VelicinaPopulacije
- self.VjerovatnocaUkrstanja=VjerovatnocaUkrstanja
- self.VjerovatnocaMutacije=VjerovatnocaMutacije
- self.VelicinaElite=VelicinaElite
- self.MaxGeneracija=MaxGeneracija
- for i in range(VelicinaPopulacije):
- self.populacija.append(MojaIndividua(DuzinaHromozoma))
- def SetVelicinaPopulacije(self,VelicinaPopulacije):
- if VelicinaPopulacije<2 or int(VelicinaPopulacije)!=VelicinaPopulacije:
- raise Exception('Velicina mora biti veca od 2 i mora biti tipa int')
- else:
- self.VelicinaPopulacije=VelicinaPopulacije
- def GetVelicinaPopulacije(self):
- return self.VelicinaPopulacije
- def SetVelicinaElite(self,VelicinaElite):
- if (VelicinaElite<0 or VelicinaElite>2) or int(VelicinaElite)!=VelicinaElite:
- raise Exception('Velicina elite mora biti u opsegu [0,2] i mora biti tipa int')
- else:
- self.VelicinaElite=VelicinaElite
- def GetVelicinaElite(self):
- return self.VelicinaElite
- def SetMaxGeneracija(self,MaxGeneracija):
- if int(MaxGeneracija)!=MaxGeneracija:
- raise Exception('Mora biti paramterar max generacija tipa int')
- else:
- self.MaxGeneracija=MaxGeneracija
- def GetMaxGeneracija(self):
- return self.MaxGeneracija
- def SetVjerovatnocaKrizanja(self,VjerovatnocaUkrstanja):
- if VjerovatnocaUkrstanja<0 or VjerovatnocaUkrstanja>1:
- raise Exception('Vjerovatnoca ukrstanja nije u opsegu [0,1]')
- else:
- self.VjerovatnocaUkrstanja=VjerovatnocaUkrstanja
- def GetVjerovatnocaKrizanja(self):
- return self.VjerovatnocaUkrstanja
- def SetVjerovatnocaMutacije(self,VjerovatnocaMutacije):
- if VjerovatnocaMutacije<0 or VjerovatnocaMutacije>1:
- raise Exception('Vjerovatnoca mutacije nije u opsegu [0,1]')
- else:
- self.VjerovatnocaMutacije=VjerovatnocaMutacije
- def GetVjerovatnocaMutacije(self):
- return self.VjerovatnocaMutacije
- def SetPopulacija(self,populacija):
- self.populacija=populacija
- self.VelicinaPopulacije=len(populacija)
- def GetPopulacija(self):
- return self.populacija
- def OpKrizanjaDvijeTacke(self,p1, p2): #Dvije individue tj dva roditelja prima
- father=p1.GetHromozom()
- mother=p2.GetHromozom()
- indeks1=random.randint(1,len(p1.GetHromozom())-1)
- indeks2=random.randint(1,len(p2.GetHromozom())-1)
- if indeks1>indeks2:
- indeks1,indeks2=indeks2,indeks1
- c1 = MojaIndividua(len(p1.GetHromozom()))
- c2 = MojaIndividua(len(p2.GetHromozom()))
- u = random.uniform(0,1)
- if self.VjerovatnocaUkrstanja > u:
- child1=father[:indeks1]+mother[indeks1:indeks2]+father[indeks2:]
- child2=mother[:indeks1]+father[indeks1:indeks2]+mother[indeks2:]
- c1.SetHromozom(child1)
- c2.SetHromozom(child2)
- #print (child1)
- else:
- return [p1,p2]
- c1.Evaluiraj()
- c2.Evaluiraj()
- return [c1,c2]
- def OpKrizanjaTacka(self,p1, p2):
- father=p1
- mother=p2
- indeks=random.randint(1,len(p1.GetHromozom())-1)
- c1 = MojaIndividua(len(p1.GetHromozom()))
- c2 = MojaIndividua(len(p1.GetHromozom()))
- u = random.uniform(0,1)
- if self.VjerovatnocaUkrstanja > u:
- child1=father[:indeks]+mother[indeks:]
- child2=mother[:indeks]+father[indeks:]
- c1.SetHromozom(child1)
- c2.SetHromozom(child2)
- else:
- return p1,p2
- c1.Evaluiraj()
- c2.Evaluiraj()
- return [c1, c2]
- def OpBinMutacija(self,c1):
- indeks=random.randint(1,len(c1.GetHromozom())-1)
- hromozom=c1.GetHromozom()
- c = c1;
- u = random.uniform(0,1)
- if self.VjerovatnocaMutacije > u:
- for i in range(len(c1.GetHromozom())):
- if indeks==i:
- if hromozom[i]==0:
- hromozom[i]=1
- else:
- hromozom[i]=0
- else:
- return c1
- c.SetHromozom(hromozom)
- return c
- class MojaIndividua(ApstraktnaIndividua):
- def __init__(self,DuzinaHromozoma):
- ApstraktnaIndividua.__init__(self,DuzinaHromozoma)
- def Evaluiraj(self):
- k=0
- x=0
- #racunanje fitnesa
- for i in range(self.DuzinaHromozoma-1,-1,-1):
- x=x+self.Hromozom[i]*2**k
- k+=1
- self.Fitness=x**2 #Neka kriterijalna funkcija
- return self.GetFitness()
- try:
- #Test sa vjezbe
- p = Populacija(10, .99, .99, 5, 1, 8)
- r1 = random.randint(1, p.GetVelicinaPopulacije() - 1)
- r2 = random.randint(1, p.GetVelicinaPopulacije() - 1)
- p1 = p.GetPopulacija()[r1]
- p2 = p.GetPopulacija()[r2]
- print ('P1: ', p1.GetHromozom())
- print ('P2: ', p2.GetHromozom())
- (c1, c2) = p.OpKrizanjaDvijeTacke(p1, p2)
- print ('C1: ', c1.GetHromozom())
- print ('C2: ', c2.GetHromozom())
- c3 = p.OpBinMutacija(c1)
- print ('C3: ', c3.GetHromozom())
- except Exception as e:
- print ('Greksa: ', e)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement