【问题标题】:Defining constraints in Jenetics在 Jenetics 中定义约束
【发布时间】:2019-04-24 01:03:36
【问题描述】:

我之前用过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 有类似的东西吗?或者我如何将约束编码为适应度函数的一部分(或其他地方)?

【问题讨论】:

    标签: java optimization genetic-algorithm jenetics


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      从 Jenetic v5.0.0 开始,phenotypeValidatorgenotypeValidator 都已被删除,但现在可以定义 Constraint(另请参阅 user guide,第 2.5 节):

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

      也可以实现Constraintrepair方法来尝试修复给定的个体。

      请注意(见this answer):

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

      【讨论】:

        【解决方案3】:

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

        例如如果你的双精度值最大化只是返回最小的负双精度作为适应度函数的结果,如果优化的解决方案没有通过约束。

        【讨论】:

        • 谢谢,但这与Franz 已经说过的基本相同:“第二种可能性是返回这些值的所有目标的最小适应度值。”
        猜你喜欢
        • 2018-06-17
        • 2016-11-23
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2019-10-24
        • 2014-09-19
        相关资源
        最近更新 更多