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里隐藏的“禅”
Jun 16 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
python pandas 时间日期的处理实现
Jul 30 Python
python进阶之自定义可迭代的类
Aug 20 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
Numpy 多维数据数组的实现
Jun 18 Python
Python如何执行系统命令
Sep 23 Python
OpenCV读取与写入图片的实现
Oct 13 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
Mar 04 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关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
理解javascript回调函数
2014/12/28 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
JS实现的排列组合算法示例
2019/07/16 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
发布你的Python模块详解
2016/09/15 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
python开头的coding设置方法
2019/08/08 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
如何在django中添加日志功能
2020/02/06 Python
使用python实现飞机大战游戏
2020/03/23 Python
英国森林假期:Forest Holidays
2021/01/01 全球购物
高一地理教学反思
2014/01/18 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
公司仓库管理制度
2015/08/04 职场文书
爱国教育主题班会
2015/08/14 职场文书
素质教育培训心得体会
2016/01/19 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python