我试图在PyGAD中设置适应度函数,但在此内部,我正在为每个解决方案(单个)调用和外部进程,以获得结果数据并执行适应度。因此,对于每个进程执行,我将为每个生成和每个个体创建一个文件夹,我可以使用solution_idx获得个体编号,但我想要生成编号,以便我可以为每个索引(生成和个体)创建文件夹。PyGAD文档中适应度函数的格式为:
def fitness_func(solution, solution_idx):
#perform fitness
return fitness
我想让它看起来像这样:
def fitness_func(solution, solution_idx,ga_instance):
generation=ga_instance.generation_completed
data=function2callprocess(solution,solution_idx,generation)
fitness=fitness(data)
return fitness
因此function2callprocess需要解决方案索引和生成编号来跟踪GA,以便它创建文件夹或每次运行进程。
我想知道这是否可能或者有人有什么建议。
感谢您使用PyGAD, Maria:)
根据你的问题,你需要传递3个参数而不是2个参数到适应度函数,其中第三个参数是当前代数。
因为PyGAD期望适应度函数只有2个参数,所以不能传递第三个参数。但是要绕过它是非常容易的。
您已经知道可以通过pygad.GA
实例的generations_completed
属性访问当前生成号。如果实例是ga_instance
,那么我们可以使用以下命令访问该参数:
ga_instance.generations_completed
基于只有在创建了pygad.GA
类的实例之后才调用适应度函数的事实,那么我们可以在适应度函数内部使用这个实例来访问generations_completed
属性。
适应度函数应该是这样的。诀窍是访问全局变量ga_instance
,它在适应度函数之外定义。关于Python中全局变量的更多信息,您可以阅读这篇文章。
def fitness_func(solution, solution_idx):
global ga_instance
print("generations_completed", ga_instance.generations_completed)
# fitness = ...
return fitness
这是一个生成随机适应度值的完整示例。只需编辑适应度函数,即可正确计算适应度。
import pygad
import random
def function2callprocess(solution, solution_idx, generation_number):
return random.random()
def fitness_func(solution, solution_idx):
global ga_instance
print("generations_completed", ga_instance.generations_completed)
generation = ga_instance.generations_completed
data = function2callprocess(solution, solution_idx, generation)
# fitness = ...
fitness = data
return fitness
last_fitness = 0
def on_generation(ga_instance):
global last_fitness
print("Generation = {generation}".format(generation=ga_instance.generations_completed))
print("Fitness = {fitness}".format(fitness=ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1]))
print("Change = {change}".format(change=ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1] - last_fitness))
last_fitness = ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1]
ga_instance = pygad.GA(num_generations=5,
num_parents_mating=5,
sol_per_pop=10,
num_genes=2,
fitness_func=fitness_func,
on_generation=on_generation)
ga_instance.run()
ga_instance.plot_fitness()
solution, solution_fitness, solution_idx = ga_instance.best_solution(ga_instance.last_generation_fitness)
print("Solution", solution)
print("Fitness value of the best solution = {solution_fitness}".format(solution_fitness=solution_fitness))