我对元启发式优化非常陌生。 我正在尝试使用遗传算法解决问题。
我有 4 个输出:
我的目标是让所有值都为0(最小化问题)。 我的健身功能是所有功能的总和。
function fitness(){
return over-population + under-population + over-time + under-time
}
但这并不好,因为一个目标与另一个目标不同。所以我想将一个目标(如人口)缩放到另一个目标。
但是我在申请时遇到了问题。我没有得到这个的起点。
你能告诉我应该从哪里开始吗?
理想情况下,您将使用具有多个适应度函数的实际多目标优化算法,而不是您发布的单个标量化算法。 我建议你研究一下 NSGA-II,这是一种广泛使用的进化多目标优化算法。
如果您确实坚持使用具有标量化方法的单一目标优化算法,则必须提出某种权重。我认为没有一个普遍适用的方法。
如果每个目标都有最大误差,您可以使用它来标准化每个目标,因此它们都具有相同的权重,但即使这样也可能与您想要的不匹配,因为可能存在不同的分布值。您还可以分配权重并通过反复试验来调整它们。
顺便说一句,如果人口过多和人口不足是互补的(你不能同时拥有两者),那么无论你采用哪种优化方法,你都应该对人口使用单一错误,这将是人口过多和人口不足之间的绝对差理想人口规模和实际(超过或低于)人口规模。如果适用的话,超时和超时也是如此。
您可以尝试 pygad 库。
您可以使用 NSGA-2 并让您的适应度函数返回值数组(多目标)而不是单个值。
例如:
def fitness_func(ga_instance, solution, solution_idx):
output1 = numpy.sum(solution*function_inputs1)
output2 = numpy.sum(solution*function_inputs2)
fitness1 = 1.0 / (numpy.abs(output1 - desired_output1) + 0.000001)
fitness2 = 1.0 / (numpy.abs(output2 - desired_output2) + 0.000001)
return [fitness1, fitness2]
参见示例:https://github.com/ahmedfgad/GeneticAlgorithmPython/blob/master/examples/example_multi_objective.py