我有一个目标函数,它看起来像:
f1 = -1 * (constant1 * (variable1 - constant2))我有一个约束,使得函数f1只应该取10到20之间的值。
10 <= f1 <= 20 where, f1 = -1 * (constant1 * (variable1 - constant2))如何在pymoo优化问题中编写上述约束。我对边界不感兴趣,因为正如我从文档中看到的,界仅用于定义输入(X)值的限制,而不是定义目标函数(F1)本身的输出值的限制。我看到有两种方法来定义约束:
Repair函数并指定其中的约束有人能指导我使用repair或默认方法为这个约束方程构建代码吗?repair会更好一些,因为它看起来很灵活。
我已经阅读了pymoo的文档,这就是我所能为约束方程提供的所有框架:
g1 = f1-10
g2 = 20-f1发布于 2020-06-10 22:13:29
首先,我想指出,你的目标函数是一个简单的线性函数,它需要在设计空间中有界,才能在目标空间中有界。我想你的例子无论如何都是概念的证明。正如您在问题中已经指出的,您必须定义两个约束,一个限制f1 < 20,另一个限制f1 > 10。您不需要任何Repair操作符来实现您想要实现的目标。此外,在一个目标上有一个边界,使修理在一般情况下非常困难。然而,对于您的简单问题,它也将是相当容易实现(但实际上并不是真正有意义的,一般来说)。
要实现您想要做的事情,您必须将问题表述为符合pymoo定义。在皮莫中,约束冲突被定义为:当所有的约束违约都小于零时,一个解决方案被认为是可行的。如果至少有一个违反约束的行为大于零,则认为解决方案是不可行的。因此,上面的表达必须是正确的(基本上翻转)。当g1 = 10 - f1大于10时,f1小于零(满意)。当f1小于20时,g2 = f1 - 20小于零(满意)。完整的运行代码示例如下:
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_1和const_2,以便能够在定义的范围内获得目标值。否则,该算法将无法找到可行的解决方案。
此外,我想提到的是,在我们的入门指南中解释了关于实现给定数学表达式的目标函数和约束函数的更多细节。
https://stackoverflow.com/questions/62280032
复制相似问题