Advertisement
Guest User

Genetski algoritam

a guest
Nov 15th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.02 KB | None | 0 0
  1. import random
  2. import itertools
  3. import datetime
  4.  
  5. br_gradova = 10
  6. gradovi = [(random.random()*10, random.random()*10) for i in range(br_gradova)]
  7.  
  8. udaljenosti = []
  9.  
  10. for p in itertools.permutations(gradovi):
  11.     udaljenost = 0
  12.     for i in range(len(p)-1):
  13.         udaljenost += (p[i][0]-p[i+1][0])**2 + (p[i][1]-p[i+1][1])**2
  14.  
  15.     udaljenost += (p[0][0]-p[len(p)-1][0])**2 + (p[0][1]-p[len(p)-1][1])**2
  16.     udaljenosti.append(udaljenost)
  17.  
  18. udaljenosti.sort()
  19. print(datetime.datetime.now())
  20. print("Najkraca putanja je : ",udaljenosti[0])
  21.  
  22.  
  23. class Jedinka:
  24.     def __init__(self):
  25.         self.hromozom = []
  26.  
  27.     def inicijalizuj(self, duzina_hromozoma):
  28.         self.hromozom = list(range(duzina_hromozoma))
  29.         random.shuffle(self.hromozom)
  30.  
  31.  
  32.     def fitness(self,gradovi):
  33.         indeksi = list(self.hromozom)
  34.         indeksi.append(indeksi[0])
  35.         udaljenost = 0
  36.         for i in range(len(indeksi)-1):
  37.             udaljenost += (gradovi[indeksi[i]][0] - gradovi[indeksi[i+1]][0])**2 + (gradovi[indeksi[i]][1] - gradovi[indeksi[i+1]][1])**2
  38.         return udaljenost
  39.  
  40.     def mutiraj(self):
  41.         if random.random() > 0.8:
  42.             prvi = random.randrange(len(self.hromozom))
  43.             drugi = random.randrange(len(self.hromozom))
  44.  
  45.         self.hromozom[prvi], self.hromozom[drugi] = self.hromozom[drugi], self.hromozom[prvi]
  46.  
  47.     def ukrstanje(self, druga):
  48.         pocetak = random.randrange(0, len(self.hromozom)-1)
  49.         kraj = random.randrange(pocetak, len(self.hromozom))
  50.  
  51.         nova1 = Jedinka()
  52.  
  53.         nova1.hromozom = list(druga.hromozom)
  54.         nova1.hromozom[pocetak:kraj] = self.hromozom[pocetak:kraj]
  55.  
  56.         nedozvoljeni = set(self.hromozom[pocetak:kraj])
  57.  
  58.         j=kraj
  59.         for i in range(kraj, len(nova1.hromozom)):
  60.             while(druga.hromozom[j%len(druga.hromozom)] in nedozvoljeni):
  61.                 j += 1
  62.  
  63.             nova1.hromozom[i] = druga.hromozom[j%len(druga.hromozom)]
  64.             j += 1
  65.  
  66.         for i in range(0, pocetak):
  67.             while(druga.hromozom[j%len(druga.hromozom)] in nedozvoljeni):
  68.                 j += 1
  69.  
  70.             nova1.hromozom[i] = druga.hromozom[j%len(druga.hromozom)]
  71.             j += 1
  72.  
  73.  
  74.  
  75.         nova2 = Jedinka()
  76.  
  77.         nova2.hromozom = list(self.hromozom)
  78.         nova2.hromozom[pocetak:kraj] = druga.hromozom[pocetak:kraj]
  79.         nedozvoljeni = set(druga.hromozom[pocetak:kraj])
  80.  
  81.                 #--------------------------------------Za Novu2 jedinku-------------------------------------------
  82.    
  83.  
  84.         j=kraj
  85.         for i in range(kraj, len(nova2.hromozom)):
  86.             while(self.hromozom[j%len(self.hromozom)] in nedozvoljeni):
  87.                 j += 1
  88.  
  89.             nova2.hromozom[i] = self.hromozom[j%len(self.hromozom)]
  90.             j += 1
  91.  
  92.         for i in range(0, pocetak):
  93.             while(self.hromozom[j%len(self.hromozom)] in nedozvoljeni):
  94.                 j += 1
  95.  
  96.             nova2.hromozom[i] = self.hromozom[j%len(self.hromozom)]
  97.             j += 1
  98.         #-------------------------------------------------------------------------------------------
  99.  
  100.         return [nova1, nova2]
  101.  
  102.     def __repr__(self):
  103.         return str(self.hromozom)
  104.  
  105.  
  106. class Populacija:
  107.     def __init__(self,gradovi,broj_jedinki=100):
  108.         self.gradovi = gradovi
  109.         self.broj_jedinki = broj_jedinki
  110.         self.jedinke = []
  111.         for i in range(broj_jedinki):
  112.             j = Jedinka()
  113.             j.inicijalizuj(len(self.gradovi))
  114.             self.jedinke.append(j)
  115.  
  116.     def fit(self, broj_iteracija=100):
  117.         for _ in range(broj_iteracija):
  118.             sample_a = random.sample(self.jedinke, 20)
  119.             sample_b = random.sample(self.jedinke, 20)
  120.             for i, j in enumerate(sample_a):
  121.                 self.jedinke.extend(j.ukrstanje(sample_b[i]))
  122.  
  123.             self.jedinke.sort(key=lambda j: j.fitness(self.gradovi))
  124.             self.jedinke = self.jedinke[:self.broj_jedinki]
  125.  
  126.  
  127.  
  128. # test_jedinka = Jedinka()
  129. # test_jedinka.inicijalizuj(len(gradovi))
  130. # print(test_jedinka)
  131. # print(test_jedinka.fitness(gradovi))
  132. # test_jedinka.mutiraj() Ispraviti mutiranje
  133. # print(test_jedinka)
  134.  
  135. # test_jedinka2 = Jedinka()
  136. # test_jedinka2.inicijalizuj(len(gradovi))
  137.  
  138. # rezultat = test_jedinka.ukrstanje(test_jedinka2)
  139. # print(rezultat)
  140. # print(sorted(rezultat[0].hromozom), sorted(rezultat[1].hromozom))
  141.  
  142. print("Genetski algoritam")
  143. populacija = Populacija(gradovi, 100)
  144. populacija.fit(1000)
  145. print(populacija.jedinke[0].fitness(gradovi))
  146. print(populacija.jedinke[0])
  147. print(datetime.datetime.now())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement