Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.89 KB | None | 0 0
  1. import random
  2.  
  3.  
  4. class ApstraktnaIndividua:
  5.  
  6.  
  7. Fitness=0.0
  8.  
  9. def __init__(self,duzinaHromozoma):
  10. if duzinaHromozoma<2 or int(duzinaHromozoma)!=duzinaHromozoma:
  11. raise Exception ('Duzina hromozoma mora biti veca od 2 i hromozom mora biti tipa int')
  12. else:
  13. self.DuzinaHromozoma=duzinaHromozoma
  14. self.Hromozom=[]
  15. for i in range(self.DuzinaHromozoma):
  16. self.Hromozom.append(random.randint(0,1))
  17. def GetDuzinaHromozoma(self):
  18. return self.DuzinaHromozoma
  19. def SetDuzinaHromozoma(self, DuzinaHromozoma):
  20. if DuzinaHromozoma < 2 or int(DuzinaHromozoma) != DuzinaHromozoma:
  21. raise Exception ('Duzina hromozoma mora biti veca od 2 i hromozom mora biti tipa int')
  22. else:
  23. self.DuzinaHromozoma = DuzinaHromozoma
  24.  
  25. def GetFitness(self):
  26. return self.Fitness
  27. def SetFitness(self,Fitness):
  28. self.Fitness=Fitness
  29.  
  30. def GetHromozom(self):
  31. return self.Hromozom
  32. def SetHromozom(self, Hromozom):
  33.  
  34. for i in Hromozom:
  35. if i!=0 and i!=1:
  36. raise Exception ('Hromozom nije binarno kodiran')
  37. self.Hromozom = []
  38. self.Hromozom = Hromozom
  39. self.DuzinaHromozoma=len(Hromozom)
  40.  
  41.  
  42.  
  43. def Evaluiraj(self):
  44. pass
  45.  
  46.  
  47. class Populacija:
  48. VelicinaPopulacije=0
  49. VjerovatnocaUkrstanja=0.0
  50. VjerovatnocaMutacije=0.0
  51. MaxGeneracija=0
  52. VelicinaElite=0
  53. populacija=[]
  54.  
  55.  
  56. def __init__(self,VelicinaPopulacije,VjerovatnocaUkrstanja,VjerovatnocaMutacije,MaxGeneracija,VelicinaElite,DuzinaHromozoma=16):
  57.  
  58. 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:
  59. raise Exception ('Nepravilna velicina populacije ili elite ili vjerovatnoce mutacije i ukrstaanja nisu u opsegu ili max generacija parametar nije int')
  60. else:
  61.  
  62. if int(VelicinaPopulacije)!=VelicinaPopulacije or int(VelicinaElite)!=VelicinaElite:
  63. raise Exception('Velicina populacije ili velicina elite int')
  64. self.VelicinaPopulacije=VelicinaPopulacije
  65. self.VjerovatnocaUkrstanja=VjerovatnocaUkrstanja
  66. self.VjerovatnocaMutacije=VjerovatnocaMutacije
  67. self.VelicinaElite=VelicinaElite
  68. self.MaxGeneracija=MaxGeneracija
  69.  
  70. for i in range(VelicinaPopulacije):
  71. self.populacija.append(MojaIndividua(DuzinaHromozoma))
  72.  
  73. def SetVelicinaPopulacije(self,VelicinaPopulacije):
  74. if VelicinaPopulacije<2 or int(VelicinaPopulacije)!=VelicinaPopulacije:
  75. raise Exception('Velicina mora biti veca od 2 i mora biti tipa int')
  76. else:
  77. self.VelicinaPopulacije=VelicinaPopulacije
  78. def GetVelicinaPopulacije(self):
  79. return self.VelicinaPopulacije
  80.  
  81. def SetVelicinaElite(self,VelicinaElite):
  82. if (VelicinaElite<0 or VelicinaElite>2) or int(VelicinaElite)!=VelicinaElite:
  83. raise Exception('Velicina elite mora biti u opsegu [0,2] i mora biti tipa int')
  84. else:
  85. self.VelicinaElite=VelicinaElite
  86. def GetVelicinaElite(self):
  87. return self.VelicinaElite
  88.  
  89. def SetMaxGeneracija(self,MaxGeneracija):
  90. if int(MaxGeneracija)!=MaxGeneracija:
  91. raise Exception('Mora biti paramterar max generacija tipa int')
  92. else:
  93. self.MaxGeneracija=MaxGeneracija
  94. def GetMaxGeneracija(self):
  95. return self.MaxGeneracija
  96.  
  97. def SetVjerovatnocaKrizanja(self,VjerovatnocaUkrstanja):
  98. if VjerovatnocaUkrstanja<0 or VjerovatnocaUkrstanja>1:
  99. raise Exception('Vjerovatnoca ukrstanja nije u opsegu [0,1]')
  100. else:
  101. self.VjerovatnocaUkrstanja=VjerovatnocaUkrstanja
  102. def GetVjerovatnocaKrizanja(self):
  103. return self.VjerovatnocaUkrstanja
  104.  
  105. def SetVjerovatnocaMutacije(self,VjerovatnocaMutacije):
  106. if VjerovatnocaMutacije<0 or VjerovatnocaMutacije>1:
  107. raise Exception('Vjerovatnoca mutacije nije u opsegu [0,1]')
  108. else:
  109. self.VjerovatnocaMutacije=VjerovatnocaMutacije
  110. def GetVjerovatnocaMutacije(self):
  111. return self.VjerovatnocaMutacije
  112.  
  113.  
  114. def SetPopulacija(self,populacija):
  115. self.populacija=populacija
  116. self.VelicinaPopulacije=len(populacija)
  117.  
  118. def GetPopulacija(self):
  119. return self.populacija
  120.  
  121. def OpKrizanjaDvijeTacke(self,p1, p2): #Dvije individue tj dva roditelja prima
  122. father=p1.GetHromozom()
  123. mother=p2.GetHromozom()
  124. indeks1=random.randint(1,len(p1.GetHromozom())-1)
  125. indeks2=random.randint(1,len(p2.GetHromozom())-1)
  126. if indeks1>indeks2:
  127. indeks1,indeks2=indeks2,indeks1
  128.  
  129.  
  130. c1 = MojaIndividua(len(p1.GetHromozom()))
  131. c2 = MojaIndividua(len(p2.GetHromozom()))
  132.  
  133. u = random.uniform(0,1)
  134. if self.VjerovatnocaUkrstanja > u:
  135. child1=father[:indeks1]+mother[indeks1:indeks2]+father[indeks2:]
  136. child2=mother[:indeks1]+father[indeks1:indeks2]+mother[indeks2:]
  137. c1.SetHromozom(child1)
  138. c2.SetHromozom(child2)
  139. #print (child1)
  140. else:
  141. return [p1,p2]
  142.  
  143.  
  144. c1.Evaluiraj()
  145. c2.Evaluiraj()
  146. return [c1,c2]
  147.  
  148. def OpKrizanjaTacka(self,p1, p2):
  149. father=p1
  150. mother=p2
  151. indeks=random.randint(1,len(p1.GetHromozom())-1)
  152.  
  153. c1 = MojaIndividua(len(p1.GetHromozom()))
  154. c2 = MojaIndividua(len(p1.GetHromozom()))
  155.  
  156. u = random.uniform(0,1)
  157. if self.VjerovatnocaUkrstanja > u:
  158. child1=father[:indeks]+mother[indeks:]
  159. child2=mother[:indeks]+father[indeks:]
  160. c1.SetHromozom(child1)
  161. c2.SetHromozom(child2)
  162. else:
  163. return p1,p2
  164.  
  165. c1.Evaluiraj()
  166. c2.Evaluiraj()
  167. return [c1, c2]
  168.  
  169. def OpBinMutacija(self,c1):
  170. indeks=random.randint(1,len(c1.GetHromozom())-1)
  171. hromozom=c1.GetHromozom()
  172. c = c1;
  173.  
  174. u = random.uniform(0,1)
  175.  
  176. if self.VjerovatnocaMutacije > u:
  177.  
  178. for i in range(len(c1.GetHromozom())):
  179. if indeks==i:
  180. if hromozom[i]==0:
  181. hromozom[i]=1
  182. else:
  183. hromozom[i]=0
  184. else:
  185. return c1
  186.  
  187. c.SetHromozom(hromozom)
  188. return c
  189.  
  190.  
  191.  
  192.  
  193.  
  194. class MojaIndividua(ApstraktnaIndividua):
  195.  
  196. def __init__(self,DuzinaHromozoma):
  197. ApstraktnaIndividua.__init__(self,DuzinaHromozoma)
  198. def Evaluiraj(self):
  199.  
  200. k=0
  201. x=0
  202. #racunanje fitnesa
  203. for i in range(self.DuzinaHromozoma-1,-1,-1):
  204. x=x+self.Hromozom[i]*2**k
  205. k+=1
  206.  
  207. self.Fitness=x**2 #Neka kriterijalna funkcija
  208. return self.GetFitness()
  209.  
  210.  
  211.  
  212.  
  213.  
  214. try:
  215.  
  216. #Test sa vjezbe
  217. p = Populacija(10, .99, .99, 5, 1, 8)
  218. r1 = random.randint(1, p.GetVelicinaPopulacije() - 1)
  219. r2 = random.randint(1, p.GetVelicinaPopulacije() - 1)
  220. p1 = p.GetPopulacija()[r1]
  221. p2 = p.GetPopulacija()[r2]
  222. print ('P1: ', p1.GetHromozom())
  223. print ('P2: ', p2.GetHromozom())
  224. (c1, c2) = p.OpKrizanjaDvijeTacke(p1, p2)
  225. print ('C1: ', c1.GetHromozom())
  226. print ('C2: ', c2.GetHromozom())
  227. c3 = p.OpBinMutacija(c1)
  228. print ('C3: ', c3.GetHromozom())
  229.  
  230. except Exception as e:
  231. print ('Greksa: ', e)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement