python 遗传编程_遗传编程pyeasyGA和Zelle图形在Python上

我发现你的健身功能最难理解.而不是平均角落或找到中心,它将角落相加然后找到距离.什么是几何解释?

此外,您的代码是指ga.logGenerations,它不是当前pyeasyga 0.3.1版本的一部分.

以下是我对你的要求的近似.如果它没有标记,那么请用示例和/或图表来扩充您的解释:

from time import sleep

from random import randint

from itertools import cycle

from graphics import *

from pyeasyga import pyeasyga

NUMBER_OF_RECTANGLES = 4 # make one more than what you want to see

NUMBER_OF_POINTS = 2

arrivo = (90,90)

colori = ["red","green","blue","cyan","magenta","yellow"]

X,Y = 0,1

def distEuclidea(p1,p2):

x1,y1 = p1

x2,y2 = p2

return ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5

def create_individual(colors):

color = next(colors)

while color in rectangles and rectangles[color] is None: # skip over deleted rectangle

color = next(colors)

if color in rectangles:

rectangle = rectangles[color]

p1,p2 = rectangle.getP1(),rectangle.getP2()

points = [[p1.getX(),p1.getY()],[p2.getX(),p2.getY()]]

else:

points = [[randint(0,20),20)] for _ in range(NUMBER_OF_POINTS)]

rectangle = Rectangle(*[Point(x,y) for x,y in points])

rectangle.setOutline(color)

rectangle.draw(win)

rectangles[color] = rectangle

return [color,points]

def fitness(individual,colors):

_,points = individual

rectangle = Rectangle(*[Point(x,y in points])

center = rectangle.getCenter()

return distEuclidea(arrivo,(center.getX(),center.getY()))

def mutate(individual):

_,points = individual

mutate_index = randint(0,NUMBER_OF_POINTS - 1)

points[mutate_index][X] += randint(-1,1)

points[mutate_index][Y] += randint(-1,1)

def is_point_inside_rectangle(point,rectangle):

p1,rectangle.getP2()

return min(p1.getX(),p2.getX()) < point.getX() < max(p1.getX(),p2.getX()) and \

min(p1.getY(),p2.getY()) < point.getY() < max(p1.getY(),p2.getY())

win = GraphWin("Genetic Graphics",500,500)

win.setCoords(0,100,100)

rectangles = {}

color_generator = cycle(colori[0:NUMBER_OF_RECTANGLES])

arrivoC = Circle(Point(*arrivo),1)

arrivoC.setFill("orange")

arrivoC.draw(win)

number_of_rectangles = NUMBER_OF_RECTANGLES

while True:

ga = pyeasyga.GeneticAlgorithm(color_generator,\

elitism=False,\

maximise_fitness=False,\

crossover_probability=0.0,\

population_size=number_of_rectangles)

ga.create_individual = create_individual

ga.fitness_function = fitness

ga.mutate_function = mutate

ga.run()

for member in ga.last_generation():

my_fitness,(my_color,my_points) = member

if rectangles[my_color] is None:

continue # skip over deleted rectangle

rectangle = Rectangle(*[Point(x,y in my_points])

rectangle.setOutline(my_color)

rectangle.draw(win)

rectangles[my_color] = rectangle

if is_point_inside_rectangle(arrivoC.getCenter(),rectangle):

rectangles[my_color] = None # delete finished rectangle

number_of_rectangles -= 1

if number_of_rectangles < 2:

break

sleep(0.1)

for value in rectangles.values():

if value is not None:

value.undraw() # delete unfinished rectangle

win.getMouse()

win.close()

以上是粗略的代码(例如,它并不总是保持通用域点和矩形独立于graphics.py点和矩形.)但它应该给你一些实验:

它在窗口的左下角创建矩形,遗传算法在右上角向目标突变,当它们到达目标时丢弃矩形.

我的代码的一部分复杂性是pyeasyga没有提供一个功能钩子来可视化每一代发生的事情.更好的方法可能是将pyeasyga子类化为添加这样的钩子以简化代码的逻辑.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值