Je dois intégrer DEAP dans un cadre plus grand.
Pour les tests, j'ai défini:
from deap import base
from deap import creator
from deap import tools
from collections import *
import random
NAME = 0
TYPE = 1
INITIAL = 2
MIN = 3
MAX = 4
CATEGORY = 5
IND_SIZE = 1
Data = OrderedDict()
Data['P1'] = ['distance' , float, 8. ,7.9 ,8.1 , [] ]
Data['P2'] = ['velocity' , float, 80. ,79.7 ,83.3 , [] ]
Data['P3'] = ['rigid' , int , 0 ,0 ,1 , ['false','true'] ]
toolbox = base.Toolbox()
for Key in Data:
if Data[Key][TYPE] is float:
toolbox.register(Data[Key][NAME], random.uniform, Data[Key][MIN], Data[Key][MAX])
if Data[Key][TYPE] is int:
toolbox.register(Data[Key][NAME], random.randint, Data[Key][MIN], Data[Key][MAX])
AttrSet = (toolbox.distance, toolbox.velocity, toolbox.rigid)
toolbox.register("individual", tools.initCycle, creator.individual, AttrSet, IND_SIZE)
Cela fonctionne comme prévu, mais si le framework fournit des données différentes, il len()
AttrSet
doit également être modifié
Existe-t-il un moyen de créer à AttrSet
partir de données, par exemple dans la boucle où les paramètres sont enregistrés?
toolbox.register()
renvoie toujours None, donc cela ne fonctionne pas.
Vous pouvez utiliser la fonction intégrée Python getattr
, qui vous permet d'obtenir les attributs d'un objet par son nom.
Comme expliqué dans la documentation: getattr(x, 'foobar')
équivaut à x.foobar
.
Vous pouvez donc faire quelque chose comme:
toolbox = base.Toolbox()
AttrSet = []
for Key in Data:
if Data[Key][TYPE] is float:
toolbox.register(Data[Key][NAME], random.uniform, Data[Key][MIN], Data[Key][MAX])
elif Data[Key][TYPE] is int:
toolbox.register(Data[Key][NAME], random.randint, Data[Key][MIN], Data[Key][MAX])
AttrSet.append(getattr(toolbox, Data[Key][NAME]))
toolbox.register("individual", tools.initCycle, creator.individual, AttrSet, IND_SIZE)
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots