Как строго набирать примитивы с нулевым аргументом - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь написать генетическую программу на Python с использованием DEAP и иметь несколько функций с нулевым аргументом в качестве терминалов.Я хочу иметь возможность комбинировать их, используя, например, примитив if_then_else, но этот примитив продолжает пытаться вызывать мои другие терминалы типа int.Я хочу строго ввести pset, чтобы избежать этого, но DEAP не позволяет мне использовать аргументы типа None при добавлении строго типизированных примитивов, что я могу сделать?

Это код, определяющий pset, который у меня есть до сих пор.

def progn(*args):
    for arg in args:
        arg()

def prog2(out1, out2): 
    return partial(progn,out1,out2)

def prog3(out1, out2, out3):     
    return partial(progn,out1,out2,out3)

def if_then_else(condition, out1, out2):
    out1() if condition() else out2()   

pset = gp.PrimitiveSetTyped("main", [None, int, bool], None)

pset.addPrimitive(if_wall_ahead, [None, None], None)
pset.addPrimitive(prog2, [None, None], None)
pset.addPrimitive(prog3, [None, None, None], None)
pset.addPrimitive(compare, [int,int], bool)
pset.addPrimitive(operator.and_, [bool, bool], bool)
pset.addPrimitive(operator.or_, [bool, bool], bool)
pset.addPrimitive(operator.not_, [bool], bool)

pset.addTerminal(player.changeDirectionRight, None)
pset.addTerminal(player.changeDirectionUp, None)
pset.addTerminal(player.changeDirectionLeft, None)
pset.addTerminal(player.changeDirectionDown, None)
pset.addTerminal(player.h_target_distance, int)
pset.addTerminal(player.v_target_distance, int)
pset.addEphemeralConstant("rand", random.randint(0,20), int)

1 Ответ

0 голосов
/ 25 января 2019

Вы можете создать фиктивный класс для представления ваших логических типов, поскольку bool и int являются "одними и теми же типами".

Один из авторов DEAP предлагает следующее решение:

class Bool(object): pass
pset.addPrimitive(xxxx, [yyy, yyy], Bool)

Вы можете прочитать обсуждение об этом на github , возможно, это может быть полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...