我想使用 Pymunk 生成一种遗传算法,其目的是向目标扔球。
我知道如何做大部分遗传算法的事情,但 Pymunk 对我来说是新的。这个想法是球将从一个固定的位置开始,比如离地1.5m,水平距离篮筐20m。假设球重1公斤。然后,球将以一定的角度以一定的力发射。适应度将是它在飞行过程中最接近目标中心的位置。
因此,例如,人口中的一个人可能看起来像[10.0, 5.0]
10.0 表示水平应用 10N,而 5.0 表示垂直应用 5N。
我不希望它在我能看到的窗口中运行每个模拟,但我希望能够打开它,这样我就可以在一定数量的世代后或达到一定的适应度后为最适合的个体运行它等级。这是我的意思https://prnt.sc/pn1hoc的直观表示。
我已经尽力使用 pymunk 文档自己解决它,但我没有发现它很有帮助,所以我相当卡住了。
我所知道的是我需要启动一个空间
space = pymunk.Space()
space.gravity = (0.0, -900.0) # not sure what this means?
然后在那个空间创造一个球
def add_ball(space):
mass = 1
radius = 14
moment = pymunk.moment_for_circle(mass, 0, radius)
body = pymunk.Body(mass, moment)
body.position = 100, 150
shape = pymunk.Circle(body, radius)
space.add(body, shape)
return shape
虽然这个球会开始下落,但不知道如何让它静态开始。
然后生成目标我应该做类似的事情
def add_target(space):
body = pymunk.Body(body_type = pymunk.Body.STATIC)
body.position = (500, 300)
target = pymunk.Segment(body, (-150, 0), (-150, 50), 5)
space.add(target)
return target
我真的很感谢一些帮助,以便我可以从我的遗传算法中运行模拟,但也可以切换它们以在窗口中运行。
谢谢。
编辑:
我已经弄清楚了如何放置地板,这是我到目前为止的所有代码
import sys, random
import pygame
from pygame.locals import *
import pymunk
import pymunk.pygame_util
def add_ball(space):
mass = 1
radius = 14
moment = pymunk.moment_for_circle(mass, 0, radius)
body = pymunk.Body(mass, moment)
body.position = (50, 150)
shape = pymunk.Circle(body, radius)
space.add(body, shape)
return shape
def add_floor(space):
body = pymunk.Body(body_type = pymunk.Body.STATIC)
body.position = (0, 0)
target = pymunk.Segment(body, (0, 5), (600, 5), 5)
space.add(target)
return target
def add_target(space):
body = pymunk.Body(body_type = pymunk.Body.STATIC)
body.position = (700, 300)
target = pymunk.Segment(body, (-150, 0), (-150, 50), 5)
space.add(target)
return target
def main():
pygame.init()
screen = pygame.display.set_mode((600, 600))
clock = pygame.time.Clock()
space = pymunk.Space()
space.gravity = (0.0, -900.0)
target = add_target(space)
floor = add_floor(space)
balls = []
draw_options = pymunk.pygame_util.DrawOptions(screen)
ball_count = 0
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit(0)
elif event.type == KEYDOWN and event.key == K_ESCAPE:
sys.exit(0)
if ball_count < 1:
ball_shape = add_ball(space)
balls.append(ball_shape)
ball_count += 1
space.step(1/50.0)
screen.fill((255,255,255))
space.debug_draw(draw_options)
pygame.display.flip()
clock.tick(50)
if __name__ == '__main__':
main()