在Jenetics中定义约束

时间:2018-11-21 12:50:42

标签: java optimization genetic-algorithm

我以前曾与MOEA Framework合作,后者了解约束的概念。即,解决问题可能具有良好的适用性,但是不可行。例如,当使用knapsack problem时,特定组合的物品可能会带来很高的利润,但是它们的重量超过了背包的容量。相应的适应度函数将包括以下行:

// 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有相似之处吗?或者我如何将约束编码为适应性函数的一部分(或其他地方)?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

自Jenetic v5.0.0起,phenotypeValidatorgenotypeValidator均已删除,但是现在可以定义Constraint(另请参见user guide,第2.5节):

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

还可以实施Constraint的{​​{3}}方法来尝试修复给定的个人。

请注意(请参阅repair):

  

[Constraint接口]是检查个人有效性的最后一道防线。 […] test的第二个重要方法[除了Constraint]是repair方法。此方法尝试修复给定的个人。如果不定义此方法,则只会创建一个新的随机表型。

答案 2 :(得分:0)

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

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