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制作简单的朴素基数估计器的教程
Apr 01 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
pandas修改DataFrame列名的方法
Apr 08 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
Python flask框架实现浏览器点击自定义跳转页面
Jun 04 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 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
星际RPG字典
2020/03/04 星际争霸
php防注
2007/01/15 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
Vue 实现简易多行滚动"弹幕"效果
2020/01/02 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
在Python中进行自动化单元测试的教程
2015/04/15 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
python实现flappy bird小游戏
2018/12/24 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
求职自荐信格式
2013/12/04 职场文书
违纪检讨书范文
2015/01/27 职场文书
结婚司仪主持词
2015/06/29 职场文书