Python凸优化cvxpy初步

文章目录

安装与测试

cvxpy是Python的开源凸优化建模库,用于求解满足一定约束条件时的凸函数的最值问题。在凸函数中,任意两点的连线,均在函数的一侧,这种性质非常优良,易于求求解最值。而cvxpy为凸优化问题提供了便捷人性化的语法,使用起来非常方便,下面安装后做一个简单的示例

复制代码
pip install cvxpy -i https://pypi.tuna.tsinghua.edu.cn/simple

考虑当 x + y ⩾ 1 x+y\geqslant1 x+y⩾1时, x 2 + y 2 x^2+y^2 x2+y2的最小值,用cvxpy求解如下

python 复制代码
import cvxpy as cp

x, y = cp.Variable(), cp.Variable() # 优化变量
obj = cp.Minimize(x**2 + y**2)      # 目标函数
constraints = [x + y >= 1]          # 约束条件

prob = cp.Problem(obj, constraints) # 定义问题
prob.solve()                        # 求解

print("最优状态:", prob.status)
# 最优状态: optimal
print(f"最优目标值{prob.value:.2f}, x={x.value:.2f}, y={y.value:.2f}")
# 最优目标值0.50, x=0.50, y=0.50

基础表达式

从上面的示例可以看出,cvxpy中的优化变量,重载了运算符,遵循其自身的语法进行建模。例如其约束被定义为x+y>=1,目标函数被定义为x**2+y**2,这些不符合Python语法的表达式被称作cvxpy表达式。

在cvxpy中,表达式由变量、参数、数值常量、运算符+, -, *, /, @以及cvxpy中的原子函数构成,示例如下

python 复制代码
import cvxpy as cp

x, y = cp.Variable(), cp.Variable()
a, b = cp.Parameter(), cp.Parameter(value=2)

# CVXPY表达式示例
3.69 + b/3
x - 4*a
cp.sqrt(x) - cp.minimum(y, x - a)
cp.maximum(2.66 - sqrt(y), square(x + 2*y))

其中,cp.Variable是变量,cp.Parameter是参数。在优化过程中,变量将被优化至最优值,而参数则是固定的,且在优化之前,必须指定其value。从数学过程来看,上面的b和 2 2 2没什么区别。但是,如果想测试多种不同参数的情况,二者就会表现出巨大差异。当a,b作为参数传入到某个优化问题后,该模型便已被cvxpy编译,后续在优化时,只需重新指定a,b的数值即可;但是,如果不使用参数,而直接填入数值,那么每次优化前,都需要重新编译一遍模型。

问题

一个凸优化问题,数学表达式仅包含两个部分,即目标函数和约束条件。cvxpy中定义了两类目标函数,分别是最小化Minimize和最大化Maximize,二者的输入参数均为cvxpy表达式;约束条件则是约束表达式的列表。

通过目标函数和约束条件即可实现Problem对象,调用Problem中的solve方法,即可完成凸优化问题的求解。solve的部分参数如下

  • 【solver】 字符串类型,用于指定求解器,可选ECOS, SCS, OSQP等。
  • 【verbose】为True时可打印日志
  • 【gp】为True时,cvxpy将问题视为几何规划,自动进行变量代换。
  • 【qcp】为True时,允许目标函数或约束是拟凸的,cvxpy 会通过二分法将其转化为一系列凸可行性问题来求解。
  • 【requires_grad】为True时,开启自动微分。
  • 【enforce_dpp】为True时,强制DPP检查,以确保问题对参数可微。
  • 【ignore_dpp】为True时,忽略DPP检查,可节省时间。
相关推荐
benchmark_cc27 分钟前
用 QuantDash 读取美股行情:AAPL.US 的运行前检查、排错顺序与数据校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
蓝天居士1 小时前
EtherCAT从入门到精通(7)
机器人·嵌入式·ethercat
蓝天居士3 小时前
EtherCAT从入门到精通(10)
机器人·嵌入式·ethercat
羲云网络4 小时前
GPT Image 2.6 接入指南:Flare、Sunburst 怎么选,编辑失败如何排查
人工智能·python·aigc·图像生成·acedatacloud
敢敢のwings4 小时前
Long-WAM 深度解析:机器人怎样记住过去、预测未来,并及时完成下一段动作
机器人
橙橙笔记7 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事7 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
敢敢のwings9 小时前
从 VPP 到 VPP2:让机器人看懂未来,再把未来变成动作
机器人
天天被压力9 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力9 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python