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中os.path用法分析
Jan 15 Python
详解Python迭代和迭代器
Mar 28 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
python安装本地whl的实例步骤
Oct 12 Python
python re模块匹配贪婪和非贪婪模式详解
Feb 11 Python
tensorflow 实现数据类型转换
Feb 17 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
python递归函数用法详解
Oct 26 Python
python分布式爬虫中消息队列知识点详解
Nov 26 Python
Pycharm plot独立窗口显示的操作
Dec 11 Python
python文本处理的方案(结巴分词并去除符号)
May 26 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生成随机数或者字符串的代码
2008/09/05 PHP
php 正则 过滤html 的超链接
2009/06/02 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
vuex的使用步骤
2021/01/06 Vue.js
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
Python封装shell命令实例分析
2015/05/05 Python
python复制文件的方法实例详解
2015/05/22 Python
Python处理Excel文件实例代码
2017/06/20 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
使用Pycharm分段执行代码
2020/04/15 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
电子专业自荐信
2014/07/01 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
2015年党建工作总结
2015/03/30 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
家庭经济困难证明
2015/06/23 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python