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 使用SMTP发送邮件的代码小结
Sep 21 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
对python文件读写的缓冲行为详解
Feb 13 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 Python
Python xlwt模块使用代码实例
Jun 10 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
python打包生成so文件的实现
Oct 30 Python
python压包的概念及实例详解
Feb 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
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Python字节单位转换实例
2019/12/05 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
教师实习自我鉴定
2013/12/11 职场文书
银行职业规划书范文
2013/12/28 职场文书
集体生日活动方案
2014/08/18 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
岳麓书院导游词
2015/02/03 职场文书
西湖英语导游词
2015/02/06 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
心理学培训心得体会
2016/01/22 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
Python基本的内置数据类型及使用方法
2022/04/13 Python