是否有包装器库通过声明已知变量和未知变量来解决优化问题?

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,constraints=con)
    return result.x

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

问题: 有没有人实施这项技术?还是有其他库可以完成这项工作?

谢谢

csh279029248 回答:是否有包装器库通过声明已知变量和未知变量来解决优化问题?

写点东西可以做到这一点,似乎可以解决我所想到的主要问题。

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

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

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

function titleCase(str) {
  //First of all,lets make all the characters lower case
  let lowerCaseString = "";
  for (let i = 0; i < str.length; i++) {
    lowerCaseString = lowerCaseString + str[i].toLowerCase();
  }
  //Now lets make the first character in the string and the character after the empty character upper case and leave therest as it is
  let i = 0;
  let upperCaseString = "";
  while (i < lowerCaseString.length) {
    if (i == 0) {
      upperCaseString = upperCaseString + lowerCaseString[i].toUpperCase();
    } else if (lowerCaseString[i - 1] == " ") {
      upperCaseString = upperCaseString + lowerCaseString[i].toUpperCase();
    } else {
      upperCaseString = upperCaseString + lowerCaseString[i];
    }
    i = i + 1;
  }
  console.log(upperCaseString);

  return upperCaseString;
}

titleCase("hello woRLD");
本文链接:https://www.f2er.com/3130969.html

大家都在问