python 非线性规划方式(scipy.optimize.minimize)

 更新时间:2020年02月11日 10:05:00   作者:ronaldo_liu2018  
今天小编就为大家分享一篇python 非线性规划方式(scipy.optimize.minimize),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

一、背景:

现在项目上有一个用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求的局部最优

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)

执行结果:

对于这种简单的函数,可以看出局部最优的求解和真实最优解相差不大,对于复杂的函数,x0的初始值设置,会很大程度影响最优解的结果。

ADD:

全局最优的函数: scipy.optimize.basinhopping

有一个缺点是无法设置约束,求全局的最优解的函数

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html

以上这篇python 非线性规划方式(scipy.optimize.minimize)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python类继承和多态原理解析

    Python类继承和多态原理解析

    这篇文章主要介绍了python类继承和多态原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • python实现各进制转换的总结大全

    python实现各进制转换的总结大全

    这篇文章主要给大家总结了python实现各进制转换的相关资料,其中包括字符串与十六进制转换、内置函数hex()与进制互转等相关内容,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • python中单下划线与双下划线的区别及说明

    python中单下划线与双下划线的区别及说明

    这篇文章主要介绍了python中单下划线与双下划线的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • python 使用turtle实现实时钟表并生成exe

    python 使用turtle实现实时钟表并生成exe

    这篇文章主要为大家详细介绍了python使用Turtle库绘制动态钟表,并有需要可以生成exe可执行文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Python基于递归算法实现的汉诺塔与Fibonacci数列示例

    Python基于递归算法实现的汉诺塔与Fibonacci数列示例

    这篇文章主要介绍了Python基于递归算法实现的汉诺塔与Fibonacci数列,结合实例形式分析了汉诺塔与Fibonacci数列的递归实现技巧,需要的朋友可以参考下
    2018-04-04
  • Python进阶之递归函数的用法及其示例

    Python进阶之递归函数的用法及其示例

    本篇文章主要介绍了Python进阶之递归函数的用法及其示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Python分支语句与循环语句应用实例分析

    Python分支语句与循环语句应用实例分析

    这篇文章主要介绍了Python分支语句与循环语句应用,结合具体实例形式详细分析了Python分支语句与循环语句各种常见应用操作技巧与相关注意事项,需要的朋友可以参考下
    2019-05-05
  • Django跨域请求CSRF的方法示例

    Django跨域请求CSRF的方法示例

    这篇文章主要介绍了Django跨域请求CSRF的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • pytorch中tensor.expand()和tensor.expand_as()函数详解

    pytorch中tensor.expand()和tensor.expand_as()函数详解

    今天小编就为大家分享一篇pytorch中tensor.expand()和tensor.expand_as()函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 使用Python实现XLS和XLSX之间的相互转换

    使用Python实现XLS和XLSX之间的相互转换

    在日常工作中,我们经常需要处理和转换不同格式的Excel文件,以适应不同的需求和软件兼容性,Excel文件的两种常见格式是XLS(Excel 97-2003)和XLSX(Excel 2007及以上版本),本文将详细介绍如何使用Python在XLS和XLSX格式之间进行转换,需要的朋友可以参考下
    2024-09-09

最新评论