参考: 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的第一步就是将实际的二次规划问题转换为上式的结构,写出对应的PqGhAb

  • 目标函数若为求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 问题的更多相关文章

  1. 利用python求解物理学中的双弹簧质能系统详解

    利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...

  2. python 求解线性方程组

    Python线性方程组求解 求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了.比如我们要求以下方程的解,这是一个非齐次线性方程组: 3x_1 + x_2 - ...

  3. Python求解线性规划——PuLP使用教程

    简洁是智慧的灵魂,冗长是肤浅的藻饰.--莎士比亚<哈姆雷特> 1 PuLP 库的安装 如果您使用的是 Anaconda[1] 的话(事实上我也更推荐这样做),需要先激活你想要安装的虚拟环境 ...

  4. Python求解进制问题(阿里巴巴2015笔试题)

    问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来 ...

  5. Python求解登楼梯问题(京东2016笔试题)

    问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法? 解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一 ...

  6. Python求解数组重新组合求最小值(优酷)

    题目描述:题目:含有n个元素的整型数组,将这个n个元素重新组合,求出最小的数,如(321,3,32,) 最小数为321323 题目分析: 将数组中所有元素填充到个数相等,填充的数字为最后一位的数字,如 ...

  7. Python求解啤酒问题(携程2016笔试题)

    问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升.32升.36升.38升.40升和62升,并且只卖整桶酒,不零卖.第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的 ...

  8. 华为2018软件岗笔试题之第一题python求解分享

    闲来无事,突然看到博客园首页上有人写了篇了华为2018软件岗笔试题解题思路和源代码分享.看了下题目,感觉第一题能做出来,就想着用刚刚学的python试着写一下,花费的时间有点长~~,看来又好长时间没练 ...

  9. 牛客网 python 求解立方根

    •计算一个数字的立方根,不使用库函数 详细描述: •接口说明 原型: public static double getCubeRoot(double input) 输入:double 待求解参数 返回 ...

随机推荐

  1. 【PHP】五分钟教你编写一个实时弹幕网站

    由于博主是个忠实的英雄联盟粉丝,所以经常观看一些明星大神的直播.而一谈到直播,肯定会看到满屏幕飘来飘去的弹幕.那么问题来了,这些视频弹幕网站如何做到实时同步的?PHP如何开发一个类似的网站? 首先要搞 ...

  2. tensorflow读取数据的方式

    转载:https://blog.csdn.net/u014038273/article/details/77989221 TensorFlow程序读取数据一共有四种方法(一般针对图像): 供给数据(F ...

  3. SSH2 No Session found for current thread原因

    Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:“No Session found for curre ...

  4. C语言:传值,传地址

    形参:形式参数实参:实际参数 传值: 把实参的值复制给形参, 修改函数内的形参,不会影响实参. 传地址: 指针传值,形参为指向实参地址的指针 当对形参的指向操作时,相当于对实参本身进行的操作 #inc ...

  5. mapreduce运行原理及YARN

    mapreduce1回顾 mapreduce1的不足 yarn的基本架构 yarn工作流程

  6. MySQL--局域网、外网访问MySQL

    一.局域网.外网访问 1. 打开CMD,导航到当前MySQL的bin路径,如下图: 2. 访问MySQL:输入MySQL -u root -p,点击Enter键,即可看到密码输入框: 输入密码,点需E ...

  7. CS229 6.9 Neurons Networks softmax regression

    SoftMax回归模型,是logistic回归在多分类问题的推广,即现在logistic回归数据中的标签y不止有0-1两个值,而是可以取k个值,softmax回归对诸如MNIST手写识别库等分类很有用 ...

  8. WPF vs2015,vs2012 添加ArcObjects SDK

    一:如果是vs2015,找到注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\下面的这两个,并且将名称和数 ...

  9. 《机器学习实战》KNN算法实现

    本系列都是参考<机器学习实战>这本书,只对学习过程一个记录,不做详细的描述! 注释:看了一段时间Ng的机器学习视频,感觉不能光看不练,现在一边练习再一边去学习理论! KNN很早就之前就看过 ...

  10. 5.2_k-means案例分析

        k-means案例分析 手写数字数据上K-Means聚类的演示 from sklearn.metrics import silhouette_score from sklearn.cluste ...