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入门之modf()方法的使用
May 15 Python
Python使用剪切板的方法
Jun 06 Python
Python读取properties配置文件操作示例
Mar 29 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
python实现粒子群算法
Oct 15 Python
手把手教你实现PyTorch的MNIST数据集
Jun 28 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
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JS数组的赋值介绍
2014/03/10 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
JavaScript程序中实现继承特性的方式总结
2016/06/24 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
Python实现读取并保存文件的类
2017/05/11 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python排序算法实例代码
2017/08/10 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
浅谈python写入大量文件的问题
2018/11/09 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
环境工程大学生个人的自我评价
2013/10/08 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
经济管理自荐书
2014/06/09 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
求职自我评价范文100字
2014/09/23 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
离婚协议书怎么写
2015/01/26 职场文书
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技