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

            

	


:)