首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pymoo优化中提供约束

在Pymoo优化中提供约束
EN

Stack Overflow用户
提问于 2020-06-09 10:07:06
回答 1查看 1.2K关注 0票数 0

我有一个目标函数,它看起来像:

代码语言:javascript
复制
f1 = -1 * (constant1 * (variable1 - constant2))

我有一个约束,使得函数f1只应该取10到20之间的值。

代码语言:javascript
复制
10 <= f1 <= 20    where, f1 = -1 * (constant1 * (variable1 - constant2))

如何在pymoo优化问题中编写上述约束。我对边界不感兴趣,因为正如我从文档中看到的,界仅用于定义输入(X)值的限制,而不是定义目标函数(F1)本身的输出值的限制。我看到有两种方法来定义约束:

  1. 直接在目标函数内定义约束
  2. 定义Repair函数并指定其中的约束

有人能指导我使用repair或默认方法为这个约束方程构建代码吗?repair会更好一些,因为它看起来很灵活。

我已经阅读了pymoo的文档,这就是我所能为约束方程提供的所有框架:

代码语言:javascript
复制
g1 = f1-10
g2 = 20-f1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-10 22:13:29

首先,我想指出,你的目标函数是一个简单的线性函数,它需要在设计空间中有界,才能在目标空间中有界。我想你的例子无论如何都是概念的证明。正如您在问题中已经指出的,您必须定义两个约束,一个限制f1 < 20,另一个限制f1 > 10。您不需要任何Repair操作符来实现您想要实现的目标。此外,在一个目标上有一个边界,使修理在一般情况下非常困难。然而,对于您的简单问题,它也将是相当容易实现(但实际上并不是真正有意义的,一般来说)。

要实现您想要做的事情,您必须将问题表述为符合pymoo定义。在皮莫中,约束冲突被定义为:当所有的约束违约都小于零时,一个解决方案被认为是可行的。如果至少有一个违反约束的行为大于零,则认为解决方案是不可行的。因此,上面的表达必须是正确的(基本上翻转)。当g1 = 10 - f1大于10时,f1小于零(满意)。当f1小于20时,g2 = f1 - 20小于零(满意)。完整的运行代码示例如下:

代码语言:javascript
复制
import numpy as np

from pymoo.algorithms.so_pattern_search import PatternSearch
from pymoo.model.problem import Problem
from pymoo.optimize import minimize


class MyProblem(Problem):

    def __init__(self, const_1, const_2):
        super().__init__(n_var=1, n_obj=1, n_constr=2, xl=0, xu=100, type_var=np.double)
        self.const_1 = const_1
        self.const_2 = const_2

    def _evaluate(self, x, out, *args, **kwargs):
        f = - (self.const_1 * (x[:, 0] - self.const_2))

        g1 = f - 20.0
        g2 = 10.0 - f
        G = np.column_stack([g1, g2])

        out["F"], out["G"] = f, G


problem = MyProblem(100.0, 1.0)

algorithm = PatternSearch()

res = minimize(problem,
               algorithm,
               seed=1,
               verbose=False)

print("Best solution found: \nX = %s\nF = %s" % (res.X, res.F))

对于此示例,请确保您定义了const_1const_2,以便能够在定义的范围内获得目标值。否则,该算法将无法找到可行的解决方案。

此外,我想提到的是,在我们的入门指南中解释了关于实现给定数学表达式的目标函数和约束函数的更多细节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62280032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档