python 非线性规划方式(scipy.optimize.minimize)


Posted in Python onFebruary 11, 2020

一、背景:

现在项目上有一个用python 实现非线性规划的需求。非线性规划可以简单分两种,目标函数为凸函数 or 非凸函数。

凸函数的 非线性规划,比如fun=x^2+y^2+x*y,有很多常用的python库来完成,网上也有很多资料,比如CVXPY

非凸函数的 非线性规划(求极值),从处理方法来说,可以尝试以下几种:

1.纯数学方法,求导求极值;

2.使用神经网络,深度学习来处理,可参考反向传播算法中链式求导的过程;

3.寻找一些python库来做,本文介绍scipy.optimize.minimize的使用方法

二、库方法介绍

官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html

来看下改方法的入参

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

解释:

fun: 求最小值的目标函数

x0:变量的初始猜测值,如果有多个变量,需要给每个变量一个初始猜测值。minimize是局部最优的解法,所以

args:常数值,后面demo会讲解,fun中没有数字,都以变量的形式表示,对于常数项,需要在这里给值

method:求极值的方法,官方文档给了很多种。一般使用默认。每种方法我理解是计算误差,反向传播的方式不同而已,这块有很大理论研究空间

constraints:约束条件,针对fun中为参数的部分进行约束限制

三、demo

1.计算 1/x+x 的最小值

# coding=utf-8
from scipy.optimize import minimize
import numpy as np
 
#demo 1
#计算 1/x+x 的最小值
 def fun(args):
  a=args
  v=lambda x:a/x[0] +x[0]
  return v
 
 if __name__ == "__main__":
  args = (1) #a
  x0 = np.asarray((2)) # 初始猜测值
  res = minimize(fun(args), x0, method='SLSQP')
  print(res.fun)
  print(res.success)
  print(res.x)

执行结果:函数的最小值为2点多,可以看出minimize求的局部最优

python 非线性规划方式(scipy.optimize.minimize)

2.计算 (2+x1)/(1+x2) - 3*x1+4*x3 的最小值 x1,x2,x3的范围都在0.1到0.9 之间

# coding=utf-8
from scipy.optimize import minimize
import numpy as np
 
# demo 2
#计算 (2+x1)/(1+x2) - 3*x1+4*x3 的最小值 x1,x2,x3的范围都在0.1到0.9 之间
def fun(args):
 a,b,c,d=args
 v=lambda x: (a+x[0])/(b+x[1]) -c*x[0]+d*x[2]
 return v
def con(args):
 # 约束条件 分为eq 和ineq
 #eq表示 函数结果等于0 ; ineq 表示 表达式大于等于0 
 x1min, x1max, x2min, x2max,x3min,x3max = args
 cons = ({'type': 'ineq', 'fun': lambda x: x[0] - x1min},\
    {'type': 'ineq', 'fun': lambda x: -x[0] + x1max},\
    {'type': 'ineq', 'fun': lambda x: x[1] - x2min},\
    {'type': 'ineq', 'fun': lambda x: -x[1] + x2max},\
   {'type': 'ineq', 'fun': lambda x: x[2] - x3min},\
    {'type': 'ineq', 'fun': lambda x: -x[2] + x3max})
 return cons
 
if __name__ == "__main__":
 #定义常量值
 args = (2,1,3,4) #a,b,c,d
 #设置参数范围/约束条件
 args1 = (0.1,0.9,0.1, 0.9,0.1,0.9) #x1min, x1max, x2min, x2max
 cons = con(args1)
 #设置初始猜测值 
 x0 = np.asarray((0.5,0.5,0.5))
 
 res = minimize(fun(args), x0, method='SLSQP',constraints=cons)
 print(res.fun)
 print(res.success)
 print(res.x)

执行结果:

python 非线性规划方式(scipy.optimize.minimize)

对于这种简单的函数,可以看出局部最优的求解和真实最优解相差不大,对于复杂的函数,x0的初始值设置,会很大程度影响最优解的结果。

ADD:

全局最优的函数: scipy.optimize.basinhopping

有一个缺点是无法设置约束,求全局的最优解的函数

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html

以上这篇python 非线性规划方式(scipy.optimize.minimize)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中将阿拉伯数字转换成中文的实现代码
May 19 Python
python网络编程学习笔记(六):Web客户端访问
Jun 09 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
python获取命令行输入参数列表的实例代码
Jun 23 Python
解决使用export_graphviz可视化树报错的问题
Aug 09 Python
python解析yaml文件过程详解
Aug 30 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
python基于event实现线程间通信控制
Jan 13 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 Python
python计算auc的方法
Sep 09 Python
使用遗传算法求二元函数的最小值
Feb 11 #Python
Python for循环搭配else常见问题解决
Feb 11 #Python
Python获取二维数组的行列数的2种方法
Feb 11 #Python
使用Puppeteer爬取微信文章的实现
Feb 11 #Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 #Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 #Python
如何通过python实现全排列
Feb 11 #Python
You might like
php不使用插件导出excel的简单方法
2014/03/04 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
使用SAE部署Python运行环境的教程
2015/05/05 Python
python rsa 加密解密
2017/03/20 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
学python需要去培训机构吗
2020/07/01 Python
python开发入门——set的使用
2020/09/03 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
《愚公移山》教学反思
2014/02/20 职场文书
留学顾问岗位职责
2014/04/14 职场文书
招商银行收入证明
2015/06/17 职场文书
2015新员工工作总结范文
2015/10/15 职场文书