2

我以前使用过MOEA 框架,它知道约束的概念。也就是说,问题的解决方案可能具有良好的适应度,但不可行。例如,在处理背包问题时,物品的特定组合可能会带来高利润,但它们的重量超过了背包的容量。相应的适应度函数将包括以下行:

// Set the fitness (=> profit) of the solution (=> knapsack).
solution.setObjective(0, profit)
// Set the constrain (=> 0.0 if OK, , otherwise the distance to the boundary).
solution.setConstraint(0, (weight <= capacity) ? 0.0 : weight - capacity)

在多目标背包问题的情况下的另一个示例是不允许一个背包使用已经在另一个背包中使用的物品的约束。

Jenetics有类似的东西吗?或者我如何将约束编码为适应度函数的一部分(或其他地方)?

4

3 回答 3

3

Jenetics不直接支持约束。您可以phenotypeValidatorEngine.Builder. 这将拒绝Phenotypes并重新创建无效的个人。不完全是一种约束,而是一种。第二种可能性是返回这些值的所有目标的最小适应度值。

于 2018-11-21T15:33:53.493 回答
1

从 Jenetic v5.0.0 开始,两者phenotypeValidatorgenotypeValidator都已被删除,但现在可以定义一个Constraint(另见用户指南,第 2.5 节):

Engine.builder(/* ... */)
        .constraint(Constraint.of(phenotype -> /* test validity */)
        .build();

也可以实现Constraint'repair方法来尝试修复给定的个人。

请注意(请参阅此答案):

当涉及到检查个人的有效性时,它 [Constraint接口] 意味着作为最后一道防线。[…] 第二个重要的方法 [除了test]Constraintrepair方法。此方法尝试修复给定的个人。如果不定义此方法,则只会创建一个新的随机表型。

于 2019-07-12T13:39:21.140 回答
0

还请考虑在适应度函数本身中验证您的约束,并返回一个与您优化的相反的值。这可能会降低整体性能,但允许您在更高级别上验证结果。

例如,如果您的双精度值最大化只是由于适应度函数而返回最低的负双精度,如果优化的解决方案没有通过约束。

于 2020-04-11T12:27:16.173 回答