Python非线性规划经济调度实战:scipy.optimize与智能算法对比

一只小鹿
一只小鹿
发布时间:2026-10-15| 5人浏览过
原创

本文深入解析Python中scipy.optimize.minimize库在非线性规划经济调度中的应用,详细讲解参数设置与约束处理。通过对比scipy、遗传算法(sko.GA)及粒子群优化(pyswarm)三种方法的实现代码与输出结果,展示不同算法在求解电力经济调度问题时的性能差异与适用场景。

1、概述

本文重点探讨非线性规划中scipy.optimize.minimize库的实际应用。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:常数值参数。在后续示例中会看到,若目标函数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 非线性规划的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。