Algorytm genetyczny dążący do wartości 255



Założeniem programu jest dążenie do wartości liczbowej 255. Początkowo tworzona jest populacji liczb z przedziału od 0 do 10. Następnie wybieramy 25% największych wartości, które krzyżujemy i mutujemy.

import random
import numpy as np
import pygame
import time
a=[]
b=[]
new=[]
male=[]
female=[]
new_pop=[]
M=0
F=0
val=0
size=8
cross=0
cross_range=1
mutation_id=0
z=0
best=0
def bintodec(b):
    val=0
    for j in range(8):
            if j == 0 and b[j] == 1:
                val += 128
            if j == 1 and b[j] == 1:
                val += 64
            if j == 2 and b[j] == 1:
                val += 32
            if j == 3 and b[j] == 1:
                val += 16
            if j == 4 and b[j] == 1:
                val += 8
            if j == 5 and b[j] == 1:
                val += 4
            if j == 6 and b[j] == 1:
                val += 2
            if j == 7 and b[j] == 1:
                val += 1
    return val

def dectobin(a):
    b = []
    if a >= 128:
        b.append(1)
        a -= 128
    else:
        b.append(0)
    if a >= 64:
        b.append(1)
        a -= 64
    else:
        b.append(0)
    if a >= 32:
        b.append(1)
        a -= 32
    else:
        b.append(0)
    if a >= 16:
        b.append(1)
        a -= 16
    else:
        b.append(0)
    if a >= 8:
        b.append(1)
        a -= 8
    else:
        b.append(0)
    if a >= 4:
        b.append(1)
        a -= 4
    else:
        b.append(0)
    if a >= 2:
        b.append(1)
        a -= 2
    else:
        b.append(0)
    if a >= 1:
        b.append(1)
        a -= 1
    else:
        b.append(0)
    return b

# POCZĄTEK PROGRAMU

pygame.init()
szerokosc = 1080
wysokosc = 800
ekran = pygame.display.set_mode((szerokosc, wysokosc))
pygame.display.set_caption("Algorytm genetyczny")
czcionka = pygame.font.SysFont("monospace", 30)
black = [0, 0, 0]
white = [255, 255, 255]
green = [0, 255, 24]
CZERWONY = (255, 0, 0)
ZIELONY = (0, 255, 0)
ZOLTY = (255, 255, 0)

# TWORZYMY POPULACJĘ POCZĄTKOWĄ W ILOŚCI RÓWNEJ ZMIENNEJ SIZE
for i in range(size):
        a.append(random.randint(0,5))
        b.append(dectobin(a[i]))
print('a ',a)


while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
    pygame.draw.line(ekran, ZOLTY, (100, 700), (900, 700), 1)
    pygame.draw.line(ekran, ZIELONY, (100, 190), (900, 190), 1)
    label = czcionka.render('255 ', 3, (255, 0, 255))
    ekran.blit(label, (65, 200))
    label = czcionka.render('0 ', 3, (255, 0, 255))
    ekran.blit(label, (65, 700))

    pygame.display.update()



    # SORTUJEMY POPULACJĘ ABY ZWERYFIKOWAĆ FUNKCJĘ PRZYSTOSOWANIA
    # SZUKAMY LICZB NAJBARDZIEJ ZBLIŻONYCH DO WARTOŚCI 255
    for k in range(100):
        a=np.sort(a)[::-1]  # SORTUJEMY LICZBY W POPULACJI

        for i in range(int(size/4)):    # TWORZYMY NOWĄ POPULACJĘ LICZĄCĄ 25% POPULACJI POPRZEDNIEJ
            new.append(a[i])
        print('size new ',len(new))
        # KRZYŻOWANIE
        # losowanie osobników do reprodukcji

        for pop in range(len(new)*2):   # wielkość nowej reprodukcji 4 razy większa niż nowa populacja
            z+=1
            for i in range(len(new)):
               M=random.randint(0,len(new)-1)     # LOSUJEMY INDEKS OSOBNIKA MĘSKIEGO DO KRZYŻOWANIA
               F=random.randint(0,len(new)-1)     # LOSUJEMY INDEKS OSOBNIKA ŻEŃSKIEGO DO KRZYŻOWANIA
               if F==M:
                   F = random.randint(0, len(new)-1)  # WYKLUCZAMY KAZIRODZTWO, TZN. ABYNIE KRZYZOWAĆ TEGO SAMEGO OSOBNIKA
               male=dectobin(new[M])                # przeliczamy wartość dec na bin
               female=dectobin(new[F])

           # KRZYŻOWANIE
            cross=random.randint(0,3)        # losowanie zakresu krzyżowania
            for j in range(cross_range):              # krzyżujemy w zakresie CROSS_RANGE
                val=female[cross+j]
                female[cross+j]=male[cross+j]
                male[cross+j]=val

            # MUTACJA
            mutation_id=random.randint(0,7)
            if male[mutation_id]==0:
                male[mutation_id] = 1
            else:
                male[mutation_id] = 0
            if female[mutation_id]==0:
                female[mutation_id] = 1
            else:
                female[mutation_id] = 0

            new_pop.append(bintodec(male))
            new_pop.append(bintodec(female))
        a=[]

        a=new_pop
        new_pop=[]
        new=[]
        print('z ',z,' a ', a, ' new_pop ', new_pop)
        for i in range(len(a)):
            pygame.draw.circle(ekran, white, ((100 + z * 10), (700 - 2 * a[i])), 3, 0)
            pygame.display.update()
            if a[i]>best:
                best=a[i]
        pygame.draw.circle(ekran, CZERWONY, ((100 + z * 10), (700 - 2 * best)), 5, 0)
        czcionka = pygame.font.SysFont("monospace", 15)
        label = czcionka.render(str(best), 3, (255, 50,50))
        ekran.blit(label, (100+z*10, 150))
        pygame.display.update()
        label = czcionka.render(str(a), 3, (250, 250, 250))
        ekran.blit(label, (700,200+z*5))
        pygame.display.update()
        time.sleep(1)

        pygame.display.update()

   
	


Graficzna prezentacja procesu ewolucji algorytmu w dążeniu do wartości liczbowej 255.



:)