Python解决非线性规划中经济调度问题

目录
  • 1、概述
  • 2、scipy.optimize.minimize参数
  • 3、简单案例引出
    • (1)Scipy.optimize实现
    • (2)遗传算法包实现 (—sko.GA&sko.DE)
  • 4、电力系统中应用——经济调度
    • (1)案例
    • (2)Scipy.optimize实现
    • (3)粒子群包实现(pyswarm)

1、概述

今天重点讲非线性规划中scipy.optimize.minize库在非线性规划中的应用。Scipy 是 Python 算法库和数学工具包,包括最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号和图像处理、常微分方程求解等模块。

scipy.optimize 模块中提供了多个用于非线性规划问题的方法,适用于不同类型的问题。

brent():单变量无约束优化问题,混合使用牛顿法/二分法。

fmin():多变量无约束优化问题,使用单纯性法,只需要利用函数值,不需要函数的导数或二阶导数。

leatsq():非线性最小二乘问题,用于求解非线性最小二乘拟合问题。

minimize():约束优化问题,使用拉格朗日乘子法将约束优化转化为无约束优化问题。

2、scipy.optimize.minimize参数

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中为参数的部分进行约束限制

3、简单案例引出

(1)Scipy.optimize实现

import numpy as np
from scipy.optimize import minimize
#目标函数
def fun(args1):
    a,b,c,d=args1
    r=lambda x:(a*x[0]*x[0]+b*x[1]*x[1]+c*x[2]*x[2]+d)
    return r
def con(args2):
    x0min,x1min,x2min=args2
    cons=({'type':'eq','fun':lambda x:-x[0]-x[1]**2+2},
          {'type':'eq','fun':lambda x:x[1]+2*x[2]**2-3},
          {'type':'ineq','fun':lambda x:x[0]**2-x[1]+x[2]**2},
          {'type': 'ineq', 'fun': lambda x: -(x[0]+x[1]**2+x[2]**2-20)},
          {'type':'ineq','fun':lambda x:x[0]-x0min},
          {'type':'ineq','fun':lambda x:x[1]-x1min},
          {'type':'ineq','fun':lambda x:x[2]+x2min})
    return cons
def main():
    args1=(1,2,3,8)
    args2=(0,0,0)
    cons=con(args2)
    x0=np.array((1,2,3))    #初值
    res=minimize(fun(args1),x0,method='SLSQP',constraints=cons)
    print('minf(x):',res.fun)
    print(res.success)
    print('x:',[np.around(i) for i in res.x])
    print('x1:',res.x[0])
    print('x2:',res.x[1])
    print('x3:',res.x[2])
    #另一种表述
    print("optimization problem(res):{}".format(res.x))
    print("Xopt={}".format(res.x))
    print("minf(x)={:.4f}".format(res.fun))

if __name__ == "__main__":
    main()

输出结果

minf(x): 13.878994794551044
True
x: [1.0, 1.0, 1.0]
x1: 0.6743061260520056
x2: 1.1513878035150682
x3: 0.961408393062538
optimization problem(res):[0.67430613 1.1513878  0.96140839]
Xopt=[0.67430613 1.1513878  0.96140839]
minf(x)=13.8790
 
Process finished with exit code 0

(2)遗传算法包实现 (—sko.GA&sko.DE)

#from sko.DE import DE   #差分进化法
from sko.GA import GA   #遗传算法
def obj_func(p):
    x1, x2, x3 = p
    return x1 ** 2 + 2*x2 ** 2 + 3*x3 ** 2+8

constraint_eq = [
    lambda x: -x[0]-x[1]**2+2,
    lambda x: x[1]+2*x[2]**2-3
]

constraint_ueq = [
    lambda x: -x[0]**2+x[1]-x[2]**2,
    lambda x: x[0]+x[1]**2+x[2]**2-20
]

#de = DE(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0],constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)
ga = GA(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0],
        constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)

#best_x, best_y = de.run()
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

输出结果

best_x: [1. 1. 1.] 
 best_y: [14.]
 
Process finished with exit code 0

4、电力系统中应用——经济调度

(1)案例

(2)Scipy.optimize实现

import numpy as np
from scipy.optimize import minimize
#目标函数(FG1+FG2+FG3)
def fun(args1):
    a0,a1,a2,b0,b1,b2,c0,c1,c2=args1
    v=lambda x:(a0+a1*x[0]+a2*x[0]*x[0]
                +b0+b1*x[1]+b2*x[1]*x[1]
                +c0+c1*x[2]+c2*x[2]*x[2])
    return v
def con(args2):
    D,x0min,x0max,x1min,x1max,x2min,x2max=args2
    cons=({'type':'eq','fun':lambda x:D-x[0]-x[1]-x[2]},
          {'type':'ineq','fun':lambda x:x[0]-x0min},
          {'type':'ineq','fun':lambda x:-x[0]+x0max},
          {'type':'ineq','fun':lambda x:x[1]-x1min},
          {'type':'ineq','fun':lambda x:-x[1]+x1max},
          {'type':'ineq','fun':lambda x:x[2]-x2min},
          {'type':'ineq','fun':lambda x:-x[2]+x2max})
    return cons
def main():
    args1=(4,0.3,0.0007,3,0.32,0.0004,3.5,0.3,0.00045)
    args2=(700,100,200,120,250,150,300)
    cons=con(args2)
    x0=np.array((150,250,200))    #初值
    res=minimize(fun(args1),x0,method='SLSQP',constraints=cons)
    print('FGi-代价:',res.fun)
    print(res.success)
    print('PGi—解:',[np.around(i) for i in res.x])
    print('PG1:',res.x[0])
    print('PG2:',res.x[1])
    print('PG3:',res.x[2])

if __name__ == "__main__":
    main()

输出结果

FGi-代价: 305.9673913046252
True
PGi—解: [176.0, 250.0, 274.0]
PG1: 176.0874477123534
PG2: 250.0
PG3: 273.9125522876465
 
Process finished with exit code 0

(3)粒子群包实现(pyswarm)

pyswarm是一个支持带约束的粒子群优化包,sko.PSO中的pso仅支持带上下限的约束,不支持等式和不等式约束,所以不太喜欢。

from pyswarm import pso

def object_func(x):
    return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])

#不等式约束

def cons1(x):
    return [x[0]+x[1]+x[2]-700]

lb = [100, 120, 150]#
ub = [200, 250, 300]

xopt, fopt = pso(object_func,lb,ub,ieqcons=[cons1], maxiter=100,swarmsize=1000)
print(xopt)
print(fopt)

输出结果

Stopping search: Swarm best objective change less than 1e-08
[179.34039956 250.         270.65960045]
305.97956393103044
 
Process finished with exit code 0

以上就是Python解决非线性规划中经济调度问题的详细内容,更多关于Python 非线性规划的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python+PuLP实现线性规划的求解

    目录 1.PuLP 库的安装 2.线性规划简介 2.1 线性规划 2.2 整数规划 3.求解过程 3.1 定义模型 3.2 定义决策变量 3.3 添加约束条件 3.4 添加目标函数 3.5 模型求解 3.6 打印结果 4.示例代码 4.1 高考题代码 4.2 汽车厂代码 简洁是智慧的灵魂,冗长是肤浅的藻饰.——莎士比亚<哈姆雷特> 1.PuLP 库的安装 如果您使用的是 Anaconda的话(事实上我也更推荐这样做),需要先激活你想要安装的虚拟环境,之后在 Prompt 输入 pip inst

  • 浅谈Python数学建模之线性规划

    目录 一.求解方法.算法和编程方案 1.1.线性规划问题的求解方法 1.2.线性规划的最快算法 1.3.选择适合自己的编程方案 二.PuLP库求解线性规划问题 2.1.线性规划问题的描述 2.2.PuLP 求解线性规划问题的步骤 2.3.Python例程:线性规划问题 三.小结 一.求解方法.算法和编程方案 线性规划 (Linear Programming,LP) 是很多数模培训讲的第一个算法,算法很简单,思想很深刻. 线性规划问题是中学数学的内容,鸡兔同笼就是一个线性规划问题.数学规划的题目在

  • Python二次规划和线性规划使用实例

    这篇文章主要介绍了Python二次规划和线性规划使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于二次规划(quadratic programming)和线性规划(Linear Programming)问题 MATLAB里是有quadprog函数可以直接用来解决二次规划问题的,linprog函数来解决线性规划问题.Python中也有很多库用来解决,对于二次规划有CVXOPT, CVXPY, Gurobi, MOSEK, qpOASES

  • python 非线性规划方式(scipy.optimize.minimize)

    一.背景: 现在项目上有一个用python 实现非线性规划的需求.非线性规划可以简单分两种,目标函数为凸函数 or 非凸函数. 凸函数的 非线性规划,比如fun=x^2+y^2+x*y,有很多常用的python库来完成,网上也有很多资料,比如CVXPY 非凸函数的 非线性规划(求极值),从处理方法来说,可以尝试以下几种: 1.纯数学方法,求导求极值: 2.使用神经网络,深度学习来处理,可参考反向传播算法中链式求导的过程: 3.寻找一些python库来做,本文介绍scipy.optimize.mi

  • Python解决非线性规划中经济调度问题

    目录 1.概述 2.scipy.optimize.minimize参数 3.简单案例引出 (1)Scipy.optimize实现 (2)遗传算法包实现 (—sko.GA&sko.DE) 4.电力系统中应用——经济调度 (1)案例 (2)Scipy.optimize实现 (3)粒子群包实现(pyswarm) 1.概述 今天重点讲非线性规划中scipy.optimize.minize库在非线性规划中的应用.Scipy 是 Python 算法库和数学工具包,包括最优化.线性代数.积分.插值.特殊函数.

  • python 解决selenium 中的 .clear()方法失效问题

    最近在使用selenium做一个数字货币的自动化脚本时,遇到一个问题就是okex网站的input使用clear()方法居然无法清空,但是后来试了好多次发现方法是可以使用的,而且这个网站修改input的value也没用,必须在文本框里修改才行,本次的目的就是要清除输入框的默认值,然而clear()没有反应,最后还是用了别的方法解决了问题,那就是使用鼠标双击事件,全选后输入内容. from selenium.webdriver.common.action_chains import ActionCh

  • python解决字典中的值是列表问题的方法

    问题:查找一些英文词在哪些小句中出现了,当然是用python来实现,当然是用字典,但是怎么让一个key对应一个 类型为列表的value,直接用列表的append()是不行的,比如dic[key].append(value),因为解释器并不知道 dic[key]的类型,当时赶时间,用了一个折衷的方案,就是先用value连成一个str,最后用str.split()作一个转换,生成一个列表. 看了python cookbook,上面正好有一个recipe讲到如何处理这样的问题,好了,揭晓答案吧! (1

  • 解决Python 爬虫URL中存在中文或特殊符号无法请求的问题

    这种问题,初学者应该都会遇到,分享给大家做个参考! from urllib.parse import quote import string #解决请求路径中含义中文或特殊字符 url_ = quote(new_url, safe=string.printable); 以上这篇解决Python 爬虫URL中存在中文或特殊符号无法请求的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 解决在Python编辑器pycharm中程序run正常debug错误的问题

    初学Python,写了一小段程序,在pycharm中debug一直报错,在网上搜了很久,尝试多种方法后还是没有用. 尝试了很久之后,发现这个问题是由于: 1.程序中有中文注释. 2.程序保存路径有中文. 最终我的解决方法是设置pycharm的编码方式.进入file>setting,在输入框搜索encoding 把GBK设置成UTF-8,再重启软件就OK了! 以上这篇解决在Python编辑器pycharm中程序run正常debug错误的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希

  • 解决python写入mysql中datetime类型遇到的问题

    刚开始使用python,还不太熟练,遇到一个datetime数据类型的问题: 在mysql数据库中,有一个datetime类型的字段用于存储记录的日期时间值.python程序中有对应的一个datetime变量dt. 现在需要往mysql数据库中添加记录,每次添加时,将datetime型变量dt写入mysql数据库tablename表中exTime字段里. 问题,如何写入?调试时,总是无法写入. 运行环境:windows10 python 3.6 mysql5.6.38 运行结果提示: Proce

  • Python读取excel中的图片完美解决方法

    excel中有图片是很常见的,但是通过python读取excel中的图片没有很好的解决办法. 网上找了一种很聪明的方法,原理是这样的: 1.将待读取的excel文件后缀名改成zip,变成压缩文件. 2.再解压这个文件. 3.在解压后的文件夹中,就有excel中的图片. 4.这样读excel中的图片,就变成了读文件夹中的图片了,和普通文件一样,可以做各种处理. 解压后的压缩包如下: python脚本如下: ''' File Name: readexcelimg Author: tim Date:

  • 解决Python图形界面中设置尺寸的问题

    Python有自己内置的标准GUI库--Tkinter,只要安装好Python就可以调用. 今天学习到了图形界面设计的问题,刚开始就卡住了.为啥呢?就是用geometry(size)设置窗口尺寸大小,如800X600,"X"从哪里来成了问题. 首先想到,这是个乘号,但是在程序中没有插入特殊符号这一说啊.所以,插入特殊符号的方法肯定不行了. 然后我心血来潮,从word的公式里复制了一个乘号过来(我也是服了我自己了),运行程序,可想而知,报错没商量. 看来求助外面是没用了.必须在Pytho

  • Python统计列表中的重复项出现的次数的方法

    本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴.具体方法如下: 对一个列表,比如[1,2,2,2,2,3,3,3,4,4,4,4],现在我们需要统计这个列表里的重复项,并且重复了几次也要统计出来. 方法1: mylist = [1,2,2,2,2,3,3,3,4,4,4,4] myset = set(mylist) #myset是另外一个列表,里面的内容是mylist里面的无重复 项 for item in myset: prin

  • 解决pyqt中ui编译成窗体.py中文乱码的问题

    我在Eric工具下编译的 解决办法: 1.打开 C:\Python27\Lib\site-packages\eric4\i18n,将中文资源包的名称"GB2312."去掉,变成eric4_zh_CN.qm: 2. 启动 eric,找到"设置"-"参数设置"-"python"选项,将编码都设置为"utf-8",重启eric4. 以上就是小编为大家带来的解决pyqt中ui编译成窗体.py中文乱码的问题全部内容了

随机推荐