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使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
利用Python如何批量更新服务器文件
Jul 29 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Django利用cookie保存用户登录信息的简单实现方法
May 27 Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
python中round函数保留两位小数的方法
Dec 04 Python
用python批量移动文件
Jan 14 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
php 表单验证实现代码
2009/03/10 PHP
php基础学习之变量的使用
2011/06/09 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
Python读取Excel的方法实例分析
2015/07/11 Python
python中子类继承父类的__init__方法实例
2016/12/15 Python
Django进阶之CSRF的解决
2018/08/01 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
ubuntu上安装python的实例方法
2019/09/30 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
大学班长的职责
2014/01/27 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android