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下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
Python与R语言的简要对比
Nov 14 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
Apr 10 Python
python3之模块psutil系统性能信息使用
May 30 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
详解JS函数重载
2014/12/04 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
生产经理的自我评价分享
2013/11/07 职场文书
外贸英语专业求职信范文
2013/12/25 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
单位实习鉴定评语
2015/01/04 职场文书
助学感谢信范文
2015/01/21 职场文书
法院执行局工作总结
2015/08/11 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电