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操作Elasticsearch数据索引的教程
Apr 08 Python
浅谈Python 中整型对象的存储问题
May 16 Python
Numpy中的mask的使用
Jul 21 Python
python对视频画框标记后保存的方法
Dec 07 Python
详解python中@的用法
Mar 27 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
详解Python中的分支和循环结构
Feb 11 Python
python圣诞树编写实例详解
Feb 13 Python
python使用Geany编辑器配置方法
Feb 21 Python
python对execl 处理操作代码
Jun 22 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
Python urlopen()参数代码示例解析
Dec 10 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
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
php报错502badgateway解决方法
2019/10/11 PHP
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
javascript常用的设计模式
2017/02/09 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
js实现随机点名程序
2020/09/17 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
Python中asyncore的用法实例
2014/09/29 Python
Python中装饰器的一个妙用
2015/02/08 Python
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
tensorflow 实现数据类型转换
2020/02/17 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
中学教师个人总结
2015/02/10 职场文书
辅导员学期工作总结
2015/08/14 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技