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