我以前曾与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有相似之处吗?或者我如何将约束编码为适应性函数的一部分(或其他地方)?
答案 0 :(得分:2)
Jenetics不直接支持约束。您可以在phenotypeValidator
中设置Engine.Builder
。这将拒绝Phenotypes
并重新创建无效个人。不完全是一种约束,而是一种约束。第二种可能性是为所有目标返回最小适合度值。
答案 1 :(得分:0)
自Jenetic v5.0.0起,phenotypeValidator
和genotypeValidator
均已删除,但是现在可以定义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。