Algorytm genetyczny.
import random
def foo(x,y,z): # funkcja optymalizowana
return 6*x**3+9*y**2+90*z-25
def fitness(x,y,z):
ans=foo(x,y,z)
if ans==0:
return 99999
else:
return abs(1/ans) # im mniejszy wynik fitnes tym większy ranking
# generujemy rozwiązania
solutions=[]
for s in range(1000): # generujemy populację początkową, trzyargumentową o wartościach losowych od 0 do 10000
solutions.append((random.uniform(0,10000),
random.uniform(0,10000),
random.uniform(0,10000)))
print(solutions[:5])
# tworzymy algorytm genetyczny
for i in range(10000): # pierwotnie zakładamy skończoną ilość symulacji, 10000
rankedsolutions=[]
for s in solutions:
rankedsolutions.append((fitness(s[0],s[1],s[2]),s)) #przypisujemy dw argumenty, wynik funkcji przystosowania i nr iteracji określający nr rozwizania w liście
rankedsolutions.sort() # sortujemy wyniki od najmniejszych do największych
rankedsolutions.reverse() # odwracamy kolejność, bo chcemy od największych do najmniejszych
print(f"=== gen {i} best solutions ===")
print(rankedsolutions[0])
if rankedsolutions[0][0]>999: #jeżeli wynik jest wysoko oceniany, przerywamy dalszą symulację
break
bestsolutions = rankedsolutions[:100]#100 najlpeszych rozwiązań. wybieramy populcję do reprodukcji
elements=[]
for s in bestsolutions:
elements.append(s[1][0])
elements.append(s[1][1])
elements.append(s[1][2])
newgen=[]
for _ in range(1000):
e1=random.choice(elements)*random.uniform(0.99,1.01) #krzyżowanie poprzez losowanie elementu oraz mutacja w zkresie 2%
e2=random.choice(elements)*random.uniform(0.99,1.01)
e3=random.choice(elements)*random.uniform(0.99,1.01)
newgen.append((e1,e2,e3))
solutions = newgen