【问题标题】:Is there a wrapper library for solving optimisation problems by declaring known and unknown variables?是否有通过声明已知和未知变量来解决优化问题的包装库?
【发布时间】:2019-11-13 09:09:28
【问题描述】:

cvxpy 有一种非常简洁的方式来写出优化形式,而无需过多担心将其转换为“标准”矩阵形式,因为这是在内部以某种方式完成的。最好用一个例子来解释:

def cvxpy_implementation():

    var1 = cp.Variable()
    var2 = cp.Variable()

    constraints = [
            var1 <= 3,
            var2 >= 2
    ]

    obj_fun = cp.Minimize(var1**2 + var2**2)

    problem = cp.Problem(obj_fun, constraints)
    problem.solve()

    return var1.value, var2.value


def scipy_implementation1():

    A = np.diag(np.ones(2))
    lb = np.array([-np.inf, 2])
    ub = np.array([3, np.inf])

    con = LinearConstraint(A, lb, ub)

    def obj_fun(x):
        return (x**2).sum()
    result = minimize(obj_fun, [0, 0], constraints=con)
    return result.x

def scipy_implementation2():

    con = [
        {'type': 'ineq', 'fun': lambda x: 3 - x[0]},
        {'type': 'ineq', 'fun': lambda x: x[1] - 2},]

    def obj_fun(x):
        return (x**2).sum()

    result = minimize(obj_fun, [0, 0], constraints=con)
    return result.x

以上所有内容都给出了正确的结果,但 cvxpy 实现更“容易”写出,特别是我不必担心不等式,并且可以在写出不等式时命名变量有用的想法。将其与 scipy1 和 scipy2 实现进行比较,在第一种情况下,我必须写出这些额外的infs,在第二种情况下,我必须记住哪个变量是哪个。你可以想象一个例子,我有 100 个变量,虽然最终需要将它们连接起来,但我希望能够像在 cvxpy 中那样写出来。

问题: 有没有人为 scipy 实现过这个?或者是否有可以使这项工作的替代库?

谢谢

【问题讨论】:

  • scipy 没有这样的东西。当针对一些特定的优化问题(pulp、pyomo)时,您可能能够找到类似的软件。但首先你要明白,上面的例子不是可比的!归结起来,这是通过使用凸假设求解器(cvxpy 的核心用例)构建的凸性执行,而一般非线性编程仅假设两次可微性(scipy 最小化)。专注于python,看到JuMP.jl你可能会有些嫉妒
  • 是的,你是对的,这很整洁,虽然我仍然认为语法有点多余,但看起来很干净

标签: optimization scipy cvxpy


【解决方案1】:

写了一些可以做到这一点的东西,似乎涵盖了我想到的主要问题。

一般的想法是你定义变量,然后创建一个简单的表达式,就像你通常写出来的那样,然后求解器类对定义的变量进行优化

https://github.com/evan54/optimisation/blob/master/var.py

下面的例子说明了一个简单的用例

# fake data 
a = 2
m = 3 
x = np.linspace(0, 10) 
y = a * x + m + np.random.randn(len(x)) 
a_ = Variable() 
m_ = Variable() 
y_ = a_ * x + m_ 
error = y_ - y 
prob = Problem((error**2).sum(), None) 
prob.minimize() print(f'a = {a}, a_ = {a_}') print(f'm = {m}, m_ = {m_}')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多