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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
跟老齐学Python之玩转字符串(2)
Sep 14 Python
Python中用sleep()方法操作时间的教程
May 22 Python
python中list常用操作实例详解
Jun 03 Python
Python3中列表list合并的四种方法
Apr 19 Python
python批量爬取下载抖音视频
Jun 17 Python
python实现while循环打印星星的四种形状
Nov 23 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
Python PyQt5整理介绍
Apr 01 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
pycharm 快速解决python代码冲突的问题
Jan 15 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
基于mysql的论坛(3)
2006/10/09 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
python爬取网页转换为PDF文件
2018/06/07 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
海飞丝广告词
2014/03/20 职场文书
安全生产月活动总结
2014/05/04 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
质量整改报告范文
2014/11/08 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书