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中MySQLdb模块用法实例
Nov 10 Python
python根据出生年份简单计算生肖的方法
Mar 27 Python
Python 类与元类的深度挖掘 I【经验】
May 06 Python
python使用pymysql实现操作mysql
Sep 13 Python
Python 序列的方法总结
Oct 18 Python
Django实现表单验证
Sep 08 Python
python实现视频分帧效果
May 31 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
python读文件的步骤
Oct 08 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 Python
Python实现批量自动整理文件
Mar 16 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
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
php车辆违章查询数据示例
2016/10/14 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
Python实现的简单万年历例子分享
2014/04/25 Python
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
Python 多线程实例详解
2017/03/25 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
大学生毕业自荐信
2013/10/10 职场文书
保荐人的岗位职责
2013/11/19 职场文书
医学专业大学生求职的自我评价
2013/11/27 职场文书
体育教师自荐信范文
2013/12/16 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
党员党性分析材料
2014/02/17 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
教师职位说明书
2014/07/29 职场文书
高中校园广播稿
2014/10/21 职场文书