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.