参考: 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. CyclicBarrier循环屏障相关

    简介 CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会 ...

  2. MySQL架构之keepalived+haproxy+mysql 实现MHA中slave集群负载均衡的高可用(原创)

    MySQL的高可用方案一般有如下几种:keepalived+双主,MHA,PXC,MMM,Heartbeat+DRBD等,比较常用的是keepalived+双主,MHA和PXC. HAProxy是一款 ...

  3. curl 与wget的区别

    CURL与wget的区别 当想要直接通过linux 命令行下载文件,马上就能想到两个工具:wget 和 CURL.它们有很多一样的特征,可以很轻易的完成一些相同的任务,虽然它们有一些相似的特征,但它们 ...

  4. Apache poi简介及代码操作Excel

    一.简介 在我们进行企业的系统开发时,难免会遇到网页表格和Excel之间的操作问题(POI是个不错的选择) Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序 ...

  5. Delphi XE5中的新增内容

    Delphi XE5中的新增内容 Delphi XE5是所有Delphi开发人员的必须备升级,并且是来自Embarcadero的获奖的.多设备应用开发解决方案的最新版本.使用Delphi XE5的新特 ...

  6. 各种波形文件VCD,VPD,SHM,FSDB生成的方法

    转载---http://www.cnblogs.com/zeushuang/archive/2012/11/14/2769640.html 仿真是IC设计不可或缺的重要步骤,仿真后一般需要记录下波形文 ...

  7. vue elment-ui 样式替换 input select

    # 有时候经常需要替换element-ui的样式 第一种方法: 直接修改源码,样式路径如下 直接修改idnex.css即可. 第二种方法: 直接在当前页面修改,替换掉原来的样式. <style ...

  8. python+selenium+PhantomJS批量投递智联简历(不要用自己的账号进行测试,请使用小号,很烦人的,哈哈哈)

    1.环境python2.7+selenium+PhantomJS(软件安装和库的安装网上都有教程我们跳过,so easy) 2.原理 绕过首页登录需要验证码,直接进入搜索栏,输入搜索的职位+地区搜索出 ...

  9. 高德地图打包后不能使用,高德导航View不显示,高德地图导航组件黑屏的问题;

    在现在的APP中地图真的很常见,我们在去使用是一般都会选择一些三方的API,像百度.高德等等... 在集成的过程中,难免会遇到一些问题,大部分问题我们仔细的阅读开发文档都能解决的:但是!!!问题出现后 ...

  10. Error running app: Default Activity not found ; 安卓程序运行不了,也不报错。

    我最近copy一个工程,写完了去运行时不能运行,项目不报错,就是运行的地方有个叉号:尝试很多办法后准备重新New一个时发现:"10:17 Error running app: Default ...