微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CVXPY - 逆屏障法

如何解决CVXPY - 逆屏障法

帖子的以下部分组织如下:

0 - 问题定义

1 - 使用约束方法解决方

2 - 使用日志屏障方法解决方

3 - 尝试使用逆障碍法求解

4 - 我尝试过的东西

5 - 我推断的东西

6 - 我的终极问题

0 - 问题定义

我有一个优化问题,可以使用约束方法和对数屏障方法解决。但是我需要使用逆屏障方法解决它。更具体地说,

我正在尝试优化: f = x1 - 2*x2

具有以下约束: x2**2 - x1 - 1

1 - 使用约束方法我可以解决它:

x1 = cp.Variable(1)
x2 = cp.Variable(1)
g1 = (x2**2 - x1 - 1)
g2 = (-x2)
f = x1 - 2*x2
obj = cp.Minimize(f)
constraints = [g1 <= 0] + \
              [g2 <= 0]
problem = cp.Problem(obj,constraints)
print(problem.solve())
print("x1 value : ",x1.value)
print("x2 value : ",x2.value)

结果是 -1.9999999998524243 x1 值:[2.35228084e-05] x2 值:[1.00001176]

2 - 使用日志屏障方法我可以解决它:

x1 = cp.Variable(1)
x2 = cp.Variable(1)
g1 = (x2**2 - x1 - 1)
g2 = (-x2)
f = x1 - 2*x2
obj = cp.Minimize(f)

mu = 0.000001

#obj = cp.Minimize(x1 - 2*x2 - mu*cp.log(-1*(x2**2 - x1 - 1)) - mu*cp.log(-1*(-x2)) )
obj = cp.Minimize(f - mu*cp.log(-g1) - mu*cp.log(-g2) )

problem = cp.Problem(obj)
print(problem.solve())
print("x1 value : ",x2.value)

结果是 -1.9999851857553026 x1 值:[1.81318945e-06] x2 值:[1.00000041]

3 - 反向屏障方法我得到 DCP 错误

x1 = cp.Variable(1)
x2 = cp.Variable(1)
g1 = (x2**2 - x1 - 1)
g2 = (-x2)
f = x1 - 2*x2
obj = cp.Minimize(f)

mu = 0.000001

obj = cp.Minimize(f - mu/g1 - mu/g2)

problem = cp.Problem(obj)
print(problem.solve())

但是,当我运行上面的代码时,它给了我以下错误: DCPError:问题不符合 DCP 规则。具体来说: 目标不是 DCP。它的以下子表达式不是: 1e-06 / (power(var82,2.0) + -var81 + -1.0) 1e-06 / -var82

4 - 我尝试过的事情

我知道

  • (f).curvature 是“仿射”
  • (mu/g1).曲率是“QUASICONCAVE”
  • (mu/g2).曲率是“准线性”
  • (f - mu/g1 - mu/g2).曲率是“未知”

所以我尝试使用 obj = cp.Minimize(f - mucp.inv_pos(g1) - mucp.inv_pos(g2)) 解决 但由于

  • (mu*cp.inv_pos(g2)).曲率是'CONVEX'
  • (mu*cp.inv_pos(g1)).曲率是'QUASICONCAVE' 我得到同样的错误

我也试过使用 problem.solve(qcp=True) 但我收到以下错误 DQCPError:问题不是 DQCP。

我已经看到 The DCP ruleset — CVX Users' Guide (cvxr.com) 基本上说明使用不同的函数实现相同的表达式可能会改变 DCP 状态。但无论如何,我不能以 DCP 问题告终。

我已经看到了 python - Constraints do not follow DCP rules in CVXPY - Stack Overflow 但它没有帮助,因为帖子中给出的问题可以通过重写效用函数解决

我已经看过 DCPError("Problem does not follow DCP rules. Specifically:\n" + append) raised when using SCS solver · Issue #863 · cvxgrp/cvxpy · GitHub 但由于我对日志函数没有任何问题,所以这篇文章是无关紧要的。

我已经看过mathematical optimization - Problem does not follow DCP rules in CVXPY - Stack Overflow。这篇文章指出,两个凸表达式相乘是不可能的。但这不是我想要做的。所以这篇文章也无关紧要。

我已经看过python 3.x - Why is this CVXPY expression not DCP? - Stack Overflow。这篇文章指出应该重新表述这个问题。但由于我试图使用逆屏障方法解决问题,因此无法重新表述。

我已经看到 cvxpy - Convex optimization problem does not follow DCP rules - Stack Overflow 是关于约束的。由于逆屏障法没有约束,所以这篇文章也无关紧要。

5 - 我推断出来的东西。 逆障碍和对数障碍方法都在边界附近建立了快速增加的成本。 (使用高成本隐含约束)因此,由于问题可以使用对数屏障方法解决(请参阅第 2 节以获得更好的理解),因此应该可以使用逆屏障方法解决。两种方法的工作方式相似。

由于以不同的方式表达某些函数(即以下代码是 sqrt( x^2 + 1 ) 被解释为非 DCP 而 norm( [ x 1 ] ) 被解释为 DCP,The DCP ruleset — CVX Users' Guide (cvxr.com)) 发生了变化DCP 状态,重写目标函数可以解决问题。

6 - 我的终极问题

  • 如何使用逆屏障法解决这个问题?

7 - 附录

代码

import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
import math 
#%% With constraints
x1 = cp.Variable(1)
x2 = cp.Variable(1)
g1 = (x2**2 - x1 - 1)
g2 = (-x2)
f = x1 - 2*x2
obj = cp.Minimize(f)
constraints = [g1 <= 0] + \
              [g2 <= 0]
problem = cp.Problem(obj,x2.value)
#%% with log barrier
x1 = cp.Variable(1)
x2 = cp.Variable(1)
g1 = (x2**2 - x1 - 1)
g2 = (-x2)
f = x1 - 2*x2
obj = cp.Minimize(f)

mu = 0.000001

#obj = cp.Minimize(x1 - 2*x2 - mu*cp.log(-1*(x2**2 - x1 - 1)) - mu*cp.log(-1*(-x2)) )
obj = cp.Minimize(f - mu*cp.log(-g1) - mu*cp.log(-g2) )

problem = cp.Problem(obj)
print(problem.solve())
print("x1 value : ",x2.value)
#%% inverse barrier
x1 = cp.Variable(1)
x2 = cp.Variable(1)
g1 = (x2**2 - x1 - 1)
g2 = (-x2)
f = x1 - 2*x2
obj = cp.Minimize(f)

mu = 0.000001

obj = cp.Minimize(f - mu*cp.inv_pos(g1) - mu*cp.inv_pos(g2))

problem = cp.Problem(obj)
print(problem.solve(qcp=True))
w.value

Inverse barrier method

log barrier method

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。