粒子群算法求解电力系统环境经济调度+微电网调度(风、光、电动车、柴油机、主网)(Python代码实现)

简介: 粒子群算法求解电力系统环境经济调度+微电网调度(风、光、电动车、柴油机、主网)(Python代码实现)

1 电力系统环境经济调度数学模型


2 改进粒子群算法解决

2.1 知识回顾

先回顾一下相关知识点:


2.2 案例1——IEEE6节点

我弄成了一个文档,对应起来:

(1)IEEE

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ~~~~~~~~~~~~~导入相关库~~~~~~~~~~·
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
import matplotlib
matplotlib.use('TkAgg')
from tqdm import tqdm  # 进度条设置
# ~~~~~~~~~~~~~~~~~~~~~读取文件~~~~~~~~~~~~~~~~~~~~~~
file=pd.read_csv('IEEE6.csv')#机组参数
P_max = file['b']  #机组上限
P_min = file['c']  # #机组下限
# ~~~~~~~~~~~~~~~~~机组特性系数~~~~~~~~~~~~~~~~~~~~~~~~·
ai = file['d']
bi=file['e']
ci=file['f']
# ~~~~~~~排放特性系数~~~~~~~~~~~~~~~~·
ali=file['g']
beti=file['h']
gari=file['i']
# ~~~~~~~~~~~~~~~~~~~~~~~粒子群算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
class Liqun:
    def __init__(self, Pload1,  P_max,P_min,ai,bi,ci,ali,beti,gari):
        self.Pload1 = Pload1  # 负荷
        self.P_max = P_max  #机组上限
        self.P_min = P_min  #机组下限
        self.ai=ai
        self.bi=bi
        self.ci=ci
        self.ali=ali
        self.beti=beti
        self.gari=gari
        # ~~~~~~~~PSO的参数~~~~~~~~~~~~~~~·
        self.w = 1  # 惯性因子,一般取1
        self.c1 = 2  # 学习因子1,一般取2
        self.c2 = 2  # 学习因子2,一般取2
        self.m = 500  # 种群大小,即种群中小鸟的个数
        self.iter_num = 100  # 算法最大迭代次数
        self.max_vel = 0.5  # 限制粒子的最大速度为0.5
        self.min_vel = -0.5  # 限制粒子的最小速度为-0.5
        self.a1= 0.7  # 总燃料约束权重
        self.a2= 0.3  # 污染排放量权重
    # ~~~~~~~~~~~~~初始化群群体~~~~~~~~~~~~~~~·
    def InitializeX(self):
        """
    :return: 群体[G1,G2,G3,G4,G5,G6]
    """
        X = np.zeros((self.m, 6))  # 初始化群体,6代表 个机组出力
        for n in range(self.m):  # 遍历每一个粒子
            X[n, 0] = np.random.uniform(10, 125, 1)[0]  # G1
            X[n, 1] = np.random.uniform(10, 150, 1)[0]  # G2
            X[n, 2] = np.random.uniform(35, 225, 1)[0]  # G3
            X[n, 3] = np.random.uniform(35, 210, 1)[0]  # G4
            X[n, 4] = np.random.uniform(130,325, 1)[0]  # G5
            X[n, 5] = np.random.uniform(125,315, 1)[0]  # G6
        return X
    # ~~~~~~~~~~~~~~~~~~~定义目标函数、和对应的惩罚项~~~~~~~~~~~~~~~~~~~·
    # ~~~~~1 目标函数:系统运行成本~~~~~
    def function1(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6]
        :return: 函数1目标函数值
        """
        SUMCOST = []  # 存储总的成本
        for i in range (5):  # 遍历每一台机组
            cost = self.ci[i] * X1[i] * X1[i] + self.bi[i]* X1[i] +self.ai[i] #
            SUMCOST.append(cost)
        return np.sum(SUMCOST)
    #~~~~~~~~~~~~~~总污染排放量~~~~~~~~~~~~··
    def function2(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6]
        :return: 函数2目标函数值
        """
        emission=[] #储存总的污染排放量
        for i in range(5):
            e=ali[i]+beti[i]*X1[i]+gari[i]*X1[i]*X1[i]
            emission.append(e)
        return np.sum(emission)
    # ~~~~平衡约束~~~~~~·
    def calc_e1(self, X1):
        """
    函数1 对应的个体惩罚项
    :param X1: (个体[G1,G2,G3,G4,G5,G6]
    :return:
    """
        cost=np.abs(X1[0]+X1[1]+X1[2]+X1[3]+X1[4]+X1[5]-self.Pload1)
        return cost
    # ~~~~~~~~~~~~~~~~粒子群速度更新公式~~~~~~~~~~~~~~~~~~~·
    def velocity_update(self, V, X, pbestX, gbestX):
        """
    :param V: 群体速度
    :param X: 群体位置[G1,G2,G3,G4,G5,G6]
    :param pbestX: 种群历史最优位置
    :param gbestX: 全局最优位置
    :return:
    """
        r1 = np.random.random((self.m, 6))
        r2 = np.random.random((self.m, 6))
        V = self.w * V + self.c1 * r1 * (pbestX - X) + self.c2 * r2 * (gbestX - X)  # 直接对照公式写就好了
        # 防止越界处理
        V[V > self.max_vel] = self.max_vel
        V[V < self.min_vel] = self.min_vel
        return V
    # ~~~~~~~粒子群位置更新公式~~~~~~~~~~~~~~~·
    def position_update(self, X, V):
        """
    根据公式更新粒子的位置
    :param X: 粒子当前的位置矩阵,维度是 (self.m, 6)
    :param V: 粒子当前的速度举着,维度是 (self.m, 6)
    """
        X = X + V  # 更新位置
        for n in range(self.m):  # 遍历每一个粒子
            if X[n, 0] < 10 or X[n, 0] > 125:  # G1
                X[n, 0] = np.random.uniform(10, 125, 1)[0]  # G1
            if X[n, 1] < 10 or X[n, 1] > 150:  # G2
                X[n, 1] = np.random.uniform(10, 150, 1)[0]  # G2
            if X[n, 2] < 35 or X[n, 2] > 225:  # G3
                X[n, 2] = np.random.uniform(35, 225, 1)[0]  # G4
            if X[n, 3] < 35 or X[n, 3] > 210:  # G5
                X[n, 3] = np.random.uniform(35, 210, 1)[0]  # G8
            if X[n, 4] < 130 or X[n, 4] > 325:  # G11
                X[n, 4] = np.random.uniform(130, 325, 1)[0]  # G1
            X[n, 5] = self.Pload1 - X[n, 0] - X[n, 1] - X[n, 2] - X[n, 3] - X[
                n, 4]  # 负荷平衡得到 G13 出力
            while (X[n, 5] < 125) or (X[n, 5] > 315):  # 如果G13 上下限违规
                X[n, 0] = np.random.uniform(10, 125, 1)[0]  # G1
                X[n, 1] = np.random.uniform(10, 150, 1)[0]  # G2
                X[n, 2] = np.random.uniform(35, 225, 1)[0]  # G3
                X[n, 3] = np.random.uniform(35, 210, 1)[0]  # G4
                X[n, 4] = np.random.uniform(130, 325, 1)[0]  # G5
                X[n, 5] = self.Pload1- X[n, 0] - X[n, 1] - X[n, 2] - X[n, 3] - X[
                    n, 4]  # 负荷平衡得到 G13 出力
        return X


(2)结果

100%|██████████| 100/100 [00:03<00:00, 26.09it/s]
迭代最优变量是: [ 41.42608737  36.4634904  182.18059225 134.44146782 290.55563308
 314.93272908]
迭代最优目标函数1(总燃料成本):35260.71417
迭代最优目标函数2(总污染排放量):605.34109
迭代最优的惩罚项: 0.0



2.3 案例2——IEEE10

接下来是10机组有阀点效应的,有网损的。最后再来2.4节40机组的,难度慢慢加大、第3节额外加了点餐:

多目标遗传算法NSGAII求解微电网调度(风、光、电动车、柴油机、主网)【python源码实现】

(1)Python代码

# ~~~~~~~~~~~~~~~~~~~~~~~粒子群算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
class Liqun:
    def __init__(self, Pload1,  P_max,P_min,ai,bi,ci,di,ei,ali,beti,gari,eti,dali):
        self.Pload1 = Pload1  # 负荷
        self.P_max = P_max  #机组上限
        self.P_min = P_min  #机组下限
        self.ai=ai
        self.bi=bi
        self.ci=ci
        self.di=di
        self.ei=ei
        self.ali=ali
        self.beti=beti
        self.gari=gari
        self.eti=eti
        self.dali=dali
        # ~~~~~~~~PSO的参数~~~~~~~~~~~~~~~·
        self.w = 1  # 惯性因子,一般取1
        self.c1 = 2  # 学习因子1,一般取2
        self.c2 = 2  # 学习因子2,一般取2
        self.m = 500  # 种群大小,即种群中小鸟的个数
        self.iter_num = 100  # 算法最大迭代次数
        self.max_vel = 0.5  # 限制粒子的最大速度为0.5
        self.min_vel = -0.5  # 限制粒子的最小速度为-0.5
        self.a1= 0.7  # 总燃料约束权重
        self.a2= 0.3  # 污染排放量权重
    # ~~~~~~~~~~~~~初始化群群体~~~~~~~~~~~~~~~·
    def InitializeX(self):
        """
    :return: 群体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    """
        X = np.zeros((self.m, 10))  # 初始化群体,6代表 个机组出力
        for n in range(self.m):  # 遍历每一个粒子
            X[n, 0] = np.random.uniform(10, 55, 1)[0]  # G1
            X[n, 1] = np.random.uniform(20, 80, 1)[0]  # G2
            X[n, 2] = np.random.uniform(47, 120, 1)[0]  # G3
            X[n, 3] = np.random.uniform(20, 130, 1)[0]  # G4
            X[n, 4] = np.random.uniform(50,160, 1)[0]  # G5
            X[n, 5] = np.random.uniform(70,240, 1)[0]  # G6
            X[n, 6] = np.random.uniform(60, 300, 1)[0]  # G7
            X[n, 7] = np.random.uniform(70, 340, 1)[0]  # G8
            X[n, 8] = np.random.uniform(130, 470, 1)[0]  # G9
            X[n, 9] = np.random.uniform(150, 470, 1)[0]  # G10
        return X
    # ~~~~~~~~~~~~~~~~~~~定义目标函数、和对应的惩罚项~~~~~~~~~~~~~~~~~~~·
    # ~~~~~1 目标函数:系统运行成本~~~~~
    def function1(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数1目标函数值
        """
        SUMCOST = []  # 存储总的成本
        for i in range (9):  # 遍历每一台机组,Python是从0开始索引,0-9:10台机组
            cost = self.ci[i] * X1[i] * X1[i] + self.bi[i]* X1[i] +self.ai[i]+\
                   np.abs(self.di[i]*np.sin(ei[i]*(self.P_min[i]-X1[i]))) #考虑阀点效应
            SUMCOST.append(cost)
        return np.sum(SUMCOST)
    #~~~~~~~~~~~~~~总污染排放量~~~~~~~~~~~~··
    def function2(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数2目标函数值
        """
        emission=[] #储存总的污染排放量
        for i in range(9):
            e=self.ali[i]+self.beti[i]*X1[i]+self.gari[i]*X1[i]*X1[i]+self.eti[i]*np.exp(self.dali[i]*X1[i])
            emission.append(e)
        return np.sum(emission)
    # ~~~~平衡约束~~~~~~·
    def calc_e1(self, X1):
        """
    函数1 对应的个体惩罚项
    :param X1: (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    :return:
    """
        Ploss=0
        for i in range(9):
            for j in range(9):
                Ploss+=X1[i]*B[i][j]*X1[j]
        # cost=np.abs(X1[0]+X1[1]+X1[2]+X1[3]+X1[4]+X1[5]+X1[6]+X1[7]+X1[8]+X1[9]-np.sum(Ploss)-self.Pload1)
        # return cost
        return max(0,abs(sum(X1)-Ploss-Pload1-0.1))


(2)结果

100%|██████████| 100/100 [00:15<00:00,  6.64it/s]
迭代最优变量是: [ 37.64814287  22.49213541  47.1752439   28.80811605  71.07470515
 163.16909614 103.42579949 162.7489263  158.39058084 311.7171866 ]
迭代最优目标函数1(总燃料成本):46726.82336
迭代最优目标函数2(总污染排放量):4708365.86991
Process finished with exit code 0

2.4 案例3——IEEE40

(1)代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ~~~~~~~~~~~~~导入相关库~~~~~~~~~~·
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
import matplotlib
matplotlib.use('TkAgg')
from tqdm import tqdm  # 进度条设置
# ~~~~~~~~~~~~~~~~~~~~~读取文件~~~~~~~~~~~~~~~~~~~~~~
file=pd.read_csv('IEEE40.csv')#机组参数
P_max = file['b']  #机组上限
P_min = file['c']  # #机组下限
# ~~~~~~~~~~~~~~~~~机组特性系数~~~~~~~~~~~~~~~~~~~~~~~~·
ai = file['d']
bi=file['e']
ci=file['f']
di=file['g']
ei=file['h']
# ~~~~~~~排放特性系数~~~~~~~~~~~~~~~~·
ali=file['g']
beti=file['h']
gari=file['i']
eti=file['l']
dali=file['m']
# ~~~~~~~~~~~~~~~~~~~~~~~粒子群算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
class Liqun:
    def __init__(self, Pload1,  P_max,P_min,ai,bi,ci,di,ei,ali,beti,gari,eti,dali):
        self.Pload1 = Pload1  # 负荷
        self.P_max = P_max  #机组上限
        self.P_min = P_min  #机组下限
        self.ai = ai
        self.bi = bi
        self.ci = ci
        self.di = di
        self.ei = ei
        self.ali = ali
        self.beti = beti
        self.gari = gari
        self.eti = eti
        self.dali = dali
        # ~~~~~~~~PSO的参数~~~~~~~~~~~~~~~·
        self.w = 1  # 惯性因子,一般取1
        self.c1 = 2  # 学习因子1,一般取2
        self.c2 = 2  # 学习因子2,一般取2
        self.m = 500  # 种群大小,即种群中小鸟的个数
        self.iter_num = 100  # 算法最大迭代次数,机组数多,可以迭代次数加大
        self.max_vel = 0.5  # 限制粒子的最大速度为0.5
        self.min_vel = -0.5  # 限制粒子的最小速度为-0.5
        self.a1= 0.4  # 总燃料约束权重
        self.a2= 0.6  # 污染排放量权重


(2)结果

100%|██████████| 100/100 [00:30<00:00,  3.33it/s]
迭代最优变量是: [ 30.34869396  51.10965795  98.71908161  87.97301056  70.12927254
 112.97742184 109.20125594 145.88263194 140.71615841 198.74327982
 315.80318374 301.38126233 228.79039464 265.50721731 473.09954507
 196.12949192 428.10579218 455.2538421  484.26009872 287.85042829
 500.34306436 533.88884883 526.00442712 449.67581489 359.71492346
 406.90418265 102.02746082 115.54292506  95.39280101  76.10125624
  98.90489259 137.27482259 148.20881091 165.974008   178.99502653
 165.49481492  70.68453874  48.12768985  69.87007254   1.87005299]
迭代最优目标函数1(总燃料成本):9975.28353
迭代最优目标函数2(总污染排放量):10314225.31643
Process finished with exit code 0


3 Python代码

# ~~~~~~~~~~~~~~~~~~~~~~~粒子群算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
class Liqun:
    def __init__(self, Pload1,  P_max,P_min,ai,bi,ci,di,ei,ali,beti,gari,eti,dali):
        self.Pload1 = Pload1  # 负荷
        self.P_max = P_max  #机组上限
        self.P_min = P_min  #机组下限
        self.ai=ai
        self.bi=bi
        self.ci=ci
        self.di=di
        self.ei=ei
        self.ali=ali
        self.beti=beti
        self.gari=gari
        self.eti=eti
        self.dali=dali
        # ~~~~~~~~PSO的参数~~~~~~~~~~~~~~~·
        self.w = 1  # 惯性因子,一般取1
        self.c1 = 2  # 学习因子1,一般取2
        self.c2 = 2  # 学习因子2,一般取2
        self.m = 500  # 种群大小,即种群中小鸟的个数
        self.iter_num = 100  # 算法最大迭代次数
        self.max_vel = 0.5  # 限制粒子的最大速度为0.5
        self.min_vel = -0.5  # 限制粒子的最小速度为-0.5
        self.a1= 0.7  # 总燃料约束权重
        self.a2= 0.3  # 污染排放量权重
    # ~~~~~~~~~~~~~初始化群群体~~~~~~~~~~~~~~~·
    def InitializeX(self):
        """
    :return: 群体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    """
        X = np.zeros((self.m, 10))  # 初始化群体,6代表 个机组出力
        for n in range(self.m):  # 遍历每一个粒子
            X[n, 0] = np.random.uniform(10, 55, 1)[0]  # G1
            X[n, 1] = np.random.uniform(20, 80, 1)[0]  # G2
            X[n, 2] = np.random.uniform(47, 120, 1)[0]  # G3
            X[n, 3] = np.random.uniform(20, 130, 1)[0]  # G4
            X[n, 4] = np.random.uniform(50,160, 1)[0]  # G5
            X[n, 5] = np.random.uniform(70,240, 1)[0]  # G6
            X[n, 6] = np.random.uniform(60, 300, 1)[0]  # G7
            X[n, 7] = np.random.uniform(70, 340, 1)[0]  # G8
            X[n, 8] = np.random.uniform(130, 470, 1)[0]  # G9
            X[n, 9] = np.random.uniform(150, 470, 1)[0]  # G10
        return X
    # ~~~~~~~~~~~~~~~~~~~定义目标函数、和对应的惩罚项~~~~~~~~~~~~~~~~~~~·
    # ~~~~~1 目标函数:系统运行成本~~~~~
    def function1(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数1目标函数值
        """
        SUMCOST = []  # 存储总的成本
        for i in range (9):  # 遍历每一台机组,Python是从0开始索引,0-9:10台机组
            cost = self.ci[i] * X1[i] * X1[i] + self.bi[i]* X1[i] +self.ai[i]+\
                   np.abs(self.di[i]*np.sin(ei[i]*(self.P_min[i]-X1[i]))) #考虑阀点效应
            SUMCOST.append(cost)
        return np.sum(SUMCOST)
    #~~~~~~~~~~~~~~总污染排放量~~~~~~~~~~~~··
    def function2(self, X1):
        """
        个体目标函数
        :param X1:  (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
        :return: 函数2目标函数值
        """
        emission=[] #储存总的污染排放量
        for i in range(9):
            e=self.ali[i]+self.beti[i]*X1[i]+self.gari[i]*X1[i]*X1[i]+self.eti[i]*np.exp(self.dali[i]*X1[i])
            emission.append(e)
        return np.sum(emission)
    # ~~~~平衡约束~~~~~~·
    def calc_e1(self, X1):
        """
    函数1 对应的个体惩罚项
    :param X1: (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    :return:
    """
        Ploss=0
        for i in range(9):
            for j in range(9):
                Ploss+=X1[i]*B[i][j]*X1[j]
        # cost=np.abs(X1[0]+X1[1]+X1[2]+X1[3]+X1[4]+X1[5]+X1[6]+X1[7]+X1[8]+X1[9]-np.sum(Ploss)-self.Pload1)
        # return cost
        return max(0,abs(sum(X1)-Ploss-Pload1-0.1))
相关文章
|
1天前
|
数据采集 算法 数据可视化
python实现时序平滑算法SG滤波器
python实现时序平滑算法SG滤波器
|
3天前
|
算法 关系型数据库 C语言
卡尔曼滤波简介+ 算法实现代码(转)
卡尔曼滤波简介+ 算法实现代码(转)
13 4
|
4天前
|
运维 算法
基于改进遗传算法的配电网故障定位(matlab代码)
基于改进遗传算法的配电网故障定位(matlab代码)
|
4天前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
|
4天前
|
算法
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
|
1月前
|
算法 编译器 开发者
如何提高Python代码的性能:优化技巧与实践
本文探讨了如何提高Python代码的性能,重点介绍了一些优化技巧与实践方法。通过使用适当的数据结构、算法和编程范式,以及利用Python内置的性能优化工具,可以有效地提升Python程序的执行效率,从而提升整体应用性能。本文将针对不同场景和需求,分享一些实用的优化技巧,并通过示例代码和性能测试结果加以说明。
|
6天前
|
人工智能 Python
Python中的反对称矩阵:理论、应用与代码实践
Python中的反对称矩阵:理论、应用与代码实践
24 1
|
14天前
|
存储 算法 搜索推荐
如何提升Python代码的性能:优化技巧与实践
本文将介绍如何通过优化技巧和实践方法来提升Python代码的性能。从避免不必要的循环和函数调用,到利用内置函数和库,再到使用适当的数据结构和算法,我们将深入探讨各种提升Python代码性能的方法,帮助开发者写出更高效的程序。
|
4月前
|
设计模式 缓存 数据安全/隐私保护
使用装饰器优化 Python 代码的技巧与实践
使用装饰器优化 Python 代码的技巧与实践
64 0
|
开发工具 git Python
Git:Python代码开发到服务器上测试实践
Git:Python代码开发到服务器上测试实践
138 0