【366】通过 python 求解 QP 问题
参考: 9.3 凸优化 · 如何在 Python 中利用 CVXOPT 求解二次规划问题
参考: Quadratic Programming - Official website
步骤如下:
- 首先安装 cvxopt library
- 将问题化成标准 QP 问题, 得到 P/q/G/h/A/b
- 直接利用自带函数求解即可
cvxopt.solvers.qp(P, q[, G, h[, A, b[, solver[, initvals]]]])
1、二次规划问题的标准形式
上式中,x
为所要求解的列向量,xT
表示x
的转置
接下来,按步骤对上式进行相关说明:
上式表明,任何二次规划问题都可以转化为上式的结构,事实上用cvxopt的第一步就是将实际的二次规划问题转换为上式的结构,写出对应的
P
、q
、G
、h
、A
、b
目标函数若为求
max
,可以通过乘以−1,将最大化问题转换为最小化问题Gx≤b
表示的是所有的不等式约束,同样,若存在诸如x≥0
的限制条件,也可以通过乘以−1转换为≤
的形式Ax=b
表示所有的等式约束
2、以一个标准的例子进行过程说明
例子中,需要求解的是x
,y
,我们可以把它写成向量的形式,同时,也需要将限制条件按照上述标准形式进行调整,用矩阵形式表示,如下所示:
- 如上所示,目标函数和限制条件均转化成了二次规划的标准形式,这是第一步,也是最难的一步,接下来的事情就简单了
- 对比上式和标准形式,不难得出:
接下来就是几行简单的代码,目的是告诉计算机上面的参数具体是什么
from cvxopt import solvers, matrix
P = matrix([[1.0,0.0],[0.0,0.0]]) # matrix里区分int和double,所以数字后面都需要加小数点
q = matrix([3.0,4.0])
G = matrix([[-1.0,0.0,-1.0,2.0,3.0],[0.0,-1.0,-3.0,5.0,4.0]])
h = matrix([0.0,0.0,-15.0,100.0,80.0]) sol = solvers.qp(P,q,G,h) # 调用优化函数solvers.qp求解
print sol['x'] # 打印结果,sol里面还有很多其他属性,读者可以自行了解 pcost dcost gap pres dres
0: 1.0780e+02 -7.6366e+02 9e+02 1e-16 4e+01
1: 9.3245e+01 9.7637e+00 8e+01 1e-16 3e+00
2: 6.7311e+01 3.2553e+01 3e+01 6e-17 1e+00
3: 2.6071e+01 1.5068e+01 1e+01 2e-16 7e-01
4: 3.7092e+01 2.3152e+01 1e+01 2e-16 4e-01
5: 2.5352e+01 1.8652e+01 7e+00 8e-17 3e-16
6: 2.0062e+01 1.9974e+01 9e-02 6e-17 3e-16
7: 2.0001e+01 2.0000e+01 9e-04 6e-17 3e-16
8: 2.0000e+01 2.0000e+01 9e-06 9e-17 2e-16
Optimal solution found.
[ 7.13e-07]
[ 5.00e+00]
- 看了上面的代码,是不是觉得很简单。因为难点不在代码,而是在于将实际优化问题转化为标准形式的过程
- 在上面的例子中,并没有出现等号,当出现等式约束时,过程一样,找到
A
,b
,然后运行代码sol = solvers.qp(P,q,G,h,A,b)
即可求解
扩展:上述定义各个矩阵参数用的是最直接的方式,其实也可以结合Numpy来定义上述矩阵
from cvxopt import solvers, matrix
import numpy as np P = matrix(np.diag([1.0,0])) # 对于一些特殊矩阵,用numpy创建会方便很多(在本例中可能感受不大)
q = matrix(np.array([3.0,4]))
G = matrix(np.array([[-1.0,0],[0,-1],[-1,-3],[2,5],[3,4]]))
h = matrix(np.array([0.0,0,-15,100,80]))
sol = solvers.qp(P,q,G,h) pcost dcost gap pres dres
0: 1.0780e+02 -7.6366e+02 9e+02 1e-16 4e+01
1: 9.3245e+01 9.7637e+00 8e+01 1e-16 3e+00
2: 6.7311e+01 3.2553e+01 3e+01 6e-17 1e+00
3: 2.6071e+01 1.5068e+01 1e+01 2e-16 7e-01
4: 3.7092e+01 2.3152e+01 1e+01 2e-16 4e-01
5: 2.5352e+01 1.8652e+01 7e+00 8e-17 3e-16
6: 2.0062e+01 1.9974e+01 9e-02 6e-17 3e-16
7: 2.0001e+01 2.0000e+01 9e-04 6e-17 3e-16
8: 2.0000e+01 2.0000e+01 9e-06 9e-17 2e-16
Optimal solution found.
【366】通过 python 求解 QP 问题的更多相关文章
- 利用python求解物理学中的双弹簧质能系统详解
利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...
- python 求解线性方程组
Python线性方程组求解 求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了.比如我们要求以下方程的解,这是一个非齐次线性方程组: 3x_1 + x_2 - ...
- Python求解线性规划——PuLP使用教程
简洁是智慧的灵魂,冗长是肤浅的藻饰.--莎士比亚<哈姆雷特> 1 PuLP 库的安装 如果您使用的是 Anaconda[1] 的话(事实上我也更推荐这样做),需要先激活你想要安装的虚拟环境 ...
- Python求解进制问题(阿里巴巴2015笔试题)
问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来 ...
- Python求解登楼梯问题(京东2016笔试题)
问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法? 解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一 ...
- Python求解数组重新组合求最小值(优酷)
题目描述:题目:含有n个元素的整型数组,将这个n个元素重新组合,求出最小的数,如(321,3,32,) 最小数为321323 题目分析: 将数组中所有元素填充到个数相等,填充的数字为最后一位的数字,如 ...
- Python求解啤酒问题(携程2016笔试题)
问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升.32升.36升.38升.40升和62升,并且只卖整桶酒,不零卖.第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的 ...
- 华为2018软件岗笔试题之第一题python求解分享
闲来无事,突然看到博客园首页上有人写了篇了华为2018软件岗笔试题解题思路和源代码分享.看了下题目,感觉第一题能做出来,就想着用刚刚学的python试着写一下,花费的时间有点长~~,看来又好长时间没练 ...
- 牛客网 python 求解立方根
•计算一个数字的立方根,不使用库函数 详细描述: •接口说明 原型: public static double getCubeRoot(double input) 输入:double 待求解参数 返回 ...
随机推荐
- [UE4]在AIController中使用行为树
行为树会在Root根下面的每个子节点中从左右到右来回往复循环执行.
- 封装MemoryCache
一.定义一个缓存接口IChace using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- C# 生成日期维度值
1. 时间维度表结构 /*==============================================================*/ /* Table: dim_date_day ...
- System.Drawing.Graphics.FromImage(Image image)引发内存不足
原因:图片位深度导致的,c# gui 应该无法将32位jpg格式的图片load到内存中 通过对比可成功处理的图片 和 不能处理的图片,发现 CMYK(印刷格式)的图片是无法处理的,具体需要深入 .ne ...
- mysql的DATE_FORMAT参数格式
mysql有个字段是DATETIME类型,要实现可以按月统计,该怎么写sql语句?select month(f1) from tt group by month(f1)or select DATE_F ...
- IIS Express内存溢出错误
IIS Express只是vs自带的一个简单版开发调试用的web服务器,所以本身貌似并不能容纳太多内存,有时候内存占用超过一定程度就会出错. 这时候可以试着发布到真正的IIS上查看一下,可能就不会出错 ...
- HTTP请求返回值所代表的含义
一些常见的状态码为: 200 - 服务器成功返回网页(表示请求成功) 404 - 请求的网页不存在(可能是网络的问题,也可能是网页没办法访问不代表网页不存在) 503 - 服务器超时(服务器故障) 下 ...
- python 函数传递可变参数的用法
可变参数 在Python函数中,还可以定义可变参数.顾名思义,可变参数就是传入的参数个数是可变的,可以是1个.2个到任意个,还可以是0个. 我们以数学题为例子,给定一组数字a,b,c……,请计算a2 ...
- Postgresql ERROR: permission denied for relation app_info
启用终端,: 进入mydb数据库:\c mydb 然后给当前数据库的角色赋予权限:GRANT ALL PRIVILEGES ON TABLE 表名 TO 角色名;
- 自动化运维工具----ansible
ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行命令等功能. 主要模块以及功能: 1 command 2 user ...