【问题标题】:Supplying a vector of inequalities/constraints to mystic为神秘提供不等式/约束的向量
【发布时间】:2019-04-15 20:49:04
【问题描述】:

我正在尝试为函数最小化提供约束,迄今为止我一直使用可通过 scipy (scipy.optimize.fmin_l_bfgs_b()) 获得的无约束算法成功执行该函数。

阅读(例如,参见Python constrained non-linear optimization),我发现了一个名为mystic 的最小化压缩包,这似乎是我需要的。我的情况如下。我有一个3N 变量的函数(代表N 节点的xyz 位置坐标),我想提供一个约束列表,以便为每个节点提供z/x = const.。这使得总共有N 约束。如何为mystic() 最有效地定义/提供这些约束? scipy.optimize.slsqp() 也可以使用相同的约束对象吗?由于我的约束是线性的,因此这也应该是一个可行的选择。

我尝试了以下方法,但它使我的计算机崩溃了:

import mystic.symbolic as ms
ieqns = ''
for p in range(N):
    ieqns += 'x'+str(p+2) +'/x'+str(p) +" <= 2"

cf = ms.generate_constraint(ms.generate_solvers(ms.simplify(ieqns)))
pf = ms.generate_penalty(ms.generate_conditions(ieqns), k=1e12)

【问题讨论】:

  • 对于N=3,我得到'x2/x0 &lt;= 2x3/x1 &lt;= 2x4/x2 &lt;= 2'。你需要在这里换行吗?此外,这可能确实适用于线性规划求解器,因为您可以将所有约束重写为 z = c * x(但我们不知道您的目标函数......)。
  • @Cleb,确实,我意识到我的目标函数虽然复杂,但在 x 中是二次函数。因此,像SLSQP 这样的东西应该是我正在搜索的理想选择(有关使用scipy.minimize() 定义约束的指南,请参阅stackoverflow.com/questions/52001922/…)。但是,为了将来参考,我仍然想知道如何为mystic 定义一个约束向量。添加\n 是否足够?
  • @ap21:答案是肯定的,添加\n 就足够了。 simplify 所做的也是在左侧隔离一个变量......这可能需要一些时间,所以一般来说,如果它像你的约束方程一样简单,我会手动重写它们。

标签: python optimization scipy mystic


【解决方案1】:

我是mystic 作者。我相信你想要做的是这样的:

>>> import mystic.symbolic as ms
>>> ieqns = ''
>>> for p in range(10):
...   ieqns += 'x{0} <= 2*x{1}\n'.format(p+2,p)
... 
>>> cf = ms.generate_constraint(ms.generate_solvers(ieqns))
>>>
>>> # test that it applies the constraints
>>> cf([1.,3.,5.,7.,9.,11.,13.,15.,17.,19.,21.,23.,25.])
[1.0, 3.0, 2.0, 6.0, 4.0, 11.0, 8.0, 15.0, 16.0, 19.0, 21.0, 23.0, 25.0]

然后我们可以在应用约束的同时最小化(但是,在以下情况下,约束基本上是不相关的):

>>> # get an objective
>>> import mystic.models as mm
>>> rosen = mm.dejong.Rosenbrock(12).function
>>> 
>>> # get an optimizer
>>> import mystic.solvers as my
>>> result = my.diffev2(rosen, x0=bounds, bounds=bounds, constrints=cf, npop=40, disp=False, full_output=True, gtol=100)
>>>
>>> # get the solution 
>>> result[0]
array([0.99997179, 1.00005506, 1.00012367, 0.99998539, 0.99984306,
       0.99981495, 0.999951  , 0.99996505, 0.99971107, 0.99925239,
       0.99846259, 0.99692293])
>>> # and the final 'cost'
>>> result[1]
2.2385442425350018e-05
>>> 

【讨论】:

  • 谢谢!但是告诉我,不应该为约束提供一个向量x 来返回一个布尔值向量吗?它返回的数字是多少?
  • 另一个问题:我的成本函数也有一个明确的梯度。我在mystic 中找不到任何使用显式渐变的默认算法。有没有可以使用梯度的算法?
  • @ap21: 不,mystic.constraint 是一个“映射”,所以它的形式为x' = c(x)——您可以将其视为非线性变换。另一方面,mystic.penalty 返回一个添加到成本中的惩罚值……y = k*p(x) 的形式也是如此,它是 cost 的附加值。关于您的第二个问题,最新的mystic 版本没有梯度求解器......但是,我已经构建了一个梯度求解器,以及从太阳能评估点计算梯度的独立函数。这些将包含在下一个版本中,并且应该在本月在 GitHub 中。
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多