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中矩阵库Numpy基本操作详解
Nov 21 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
利用arcgis的python读取要素的X,Y方法
Dec 22 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
Python3模拟curl发送post请求操作示例
May 03 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
python实现的爬取电影下载链接功能示例
Aug 26 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
python中@contextmanager实例用法
Feb 07 Python
python 模拟在天空中放风筝的示例代码
Apr 21 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
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
php 注释规范
2012/03/29 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
javascript 随机展示头像实现代码
2011/12/06 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
JS实现可切换图片的幻灯切换效果示例
2019/05/24 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
原生js生成图片验证码
2020/10/11 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
python实现汉诺塔方法汇总
2016/07/25 Python
python3实现名片管理系统
2020/11/29 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
python常用数据重复项处理方法
2019/11/22 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
机电一体化应届生求职信范文
2014/01/24 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
周年庆促销方案
2014/03/15 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
杜甫草堂导游词
2015/02/03 职场文书
加班费申请报告
2015/05/15 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL