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


    目录

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

    2 改进粒子群算法解决

    2.1 知识回顾

    2.2 案例1——IEEE6节点

    2.3 案例2——IEEE10

    2.4 案例3——IEEE40 

    3 Python代码


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

     


    2 改进粒子群算法解决

    2.1 知识回顾

    先回顾一下相关知识点:

    2.2 案例1——IEEE6节点

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

    (1)IEEE

    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3. # ~~~~~~~~~~~~~导入相关库~~~~~~~~~~·
    4. import numpy as np
    5. import pandas as pd
    6. import matplotlib.pyplot as plt
    7. import matplotlib as mpl
    8. mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
    9. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    10. import matplotlib
    11. matplotlib.use('TkAgg')
    12. from tqdm import tqdm # 进度条设置
    13. # ~~~~~~~~~~~~~~~~~~~~~读取文件~~~~~~~~~~~~~~~~~~~~~~
    14. file=pd.read_csv('IEEE6.csv')#机组参数
    15. P_max = file['b'] #机组上限
    16. P_min = file['c'] # #机组下限
    17. # ~~~~~~~~~~~~~~~~~机组特性系数~~~~~~~~~~~~~~~~~~~~~~~~·
    18. ai = file['d']
    19. bi=file['e']
    20. ci=file['f']
    21. # ~~~~~~~排放特性系数~~~~~~~~~~~~~~~~·
    22. ali=file['g']
    23. beti=file['h']
    24. gari=file['i']
    25. # ~~~~~~~~~~~~~~~~~~~~~~~粒子群算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
    26. class Liqun:
    27. def __init__(self, Pload1, P_max,P_min,ai,bi,ci,ali,beti,gari):
    28. self.Pload1 = Pload1 # 负荷
    29. self.P_max = P_max #机组上限
    30. self.P_min = P_min #机组下限
    31. self.ai=ai
    32. self.bi=bi
    33. self.ci=ci
    34. self.ali=ali
    35. self.beti=beti
    36. self.gari=gari
    37. # ~~~~~~~~PSO的参数~~~~~~~~~~~~~~~·
    38. self.w = 1 # 惯性因子,一般取1
    39. self.c1 = 2 # 学习因子1,一般取2
    40. self.c2 = 2 # 学习因子2,一般取2
    41. self.m = 500 # 种群大小,即种群中小鸟的个数
    42. self.iter_num = 100 # 算法最大迭代次数
    43. self.max_vel = 0.5 # 限制粒子的最大速度为0.5
    44. self.min_vel = -0.5 # 限制粒子的最小速度为-0.5
    45. self.a1= 0.7 # 总燃料约束权重
    46. self.a2= 0.3 # 污染排放量权重
    47. # ~~~~~~~~~~~~~初始化群群体~~~~~~~~~~~~~~~·
    48. def InitializeX(self):
    49. """
    50. :return: 群体[G1,G2,G3,G4,G5,G6]
    51. """
    52. X = np.zeros((self.m, 6)) # 初始化群体,6代表 个机组出力
    53. for n in range(self.m): # 遍历每一个粒子
    54. X[n, 0] = np.random.uniform(10, 125, 1)[0] # G1
    55. X[n, 1] = np.random.uniform(10, 150, 1)[0] # G2
    56. X[n, 2] = np.random.uniform(35, 225, 1)[0] # G3
    57. X[n, 3] = np.random.uniform(35, 210, 1)[0] # G4
    58. X[n, 4] = np.random.uniform(130,325, 1)[0] # G5
    59. X[n, 5] = np.random.uniform(125,315, 1)[0] # G6
    60. return X
    61. # ~~~~~~~~~~~~~~~~~~~定义目标函数、和对应的惩罚项~~~~~~~~~~~~~~~~~~~·
    62. # ~~~~~1 目标函数:系统运行成本~~~~~
    63. def function1(self, X1):
    64. """
    65. 个体目标函数
    66. :param X1: (个体[G1,G2,G3,G4,G5,G6]
    67. :return: 函数1目标函数值
    68. """
    69. SUMCOST = [] # 存储总的成本
    70. for i in range (5): # 遍历每一台机组
    71. cost = self.ci[i] * X1[i] * X1[i] + self.bi[i]* X1[i] +self.ai[i] #
    72. SUMCOST.append(cost)
    73. return np.sum(SUMCOST)
    74. #~~~~~~~~~~~~~~总污染排放量~~~~~~~~~~~~··
    75. def function2(self, X1):
    76. """
    77. 个体目标函数
    78. :param X1: (个体[G1,G2,G3,G4,G5,G6]
    79. :return: 函数2目标函数值
    80. """
    81. emission=[] #储存总的污染排放量
    82. for i in range(5):
    83. e=ali[i]+beti[i]*X1[i]+gari[i]*X1[i]*X1[i]
    84. emission.append(e)
    85. return np.sum(emission)
    86. # ~~~~平衡约束~~~~~~·
    87. def calc_e1(self, X1):
    88. """
    89. 函数1 对应的个体惩罚项
    90. :param X1: (个体[G1,G2,G3,G4,G5,G6]
    91. :return:
    92. """
    93. cost=np.abs(X1[0]+X1[1]+X1[2]+X1[3]+X1[4]+X1[5]-self.Pload1)
    94. return cost
    95. # ~~~~~~~~~~~~~~~~粒子群速度更新公式~~~~~~~~~~~~~~~~~~~·
    96. def velocity_update(self, V, X, pbestX, gbestX):
    97. """
    98. :param V: 群体速度
    99. :param X: 群体位置[G1,G2,G3,G4,G5,G6]
    100. :param pbestX: 种群历史最优位置
    101. :param gbestX: 全局最优位置
    102. :return:
    103. """
    104. r1 = np.random.random((self.m, 6))
    105. r2 = np.random.random((self.m, 6))
    106. V = self.w * V + self.c1 * r1 * (pbestX - X) + self.c2 * r2 * (gbestX - X) # 直接对照公式写就好了
    107. # 防止越界处理
    108. V[V > self.max_vel] = self.max_vel
    109. V[V < self.min_vel] = self.min_vel
    110. return V
    111. # ~~~~~~~粒子群位置更新公式~~~~~~~~~~~~~~~·
    112. def position_update(self, X, V):
    113. """
    114. 根据公式更新粒子的位置
    115. :param X: 粒子当前的位置矩阵,维度是 (self.m, 6)
    116. :param V: 粒子当前的速度举着,维度是 (self.m, 6)
    117. """
    118. X = X + V # 更新位置
    119. for n in range(self.m): # 遍历每一个粒子
    120. if X[n, 0] < 10 or X[n, 0] > 125: # G1
    121. X[n, 0] = np.random.uniform(10, 125, 1)[0] # G1
    122. if X[n, 1] < 10 or X[n, 1] > 150: # G2
    123. X[n, 1] = np.random.uniform(10, 150, 1)[0] # G2
    124. if X[n, 2] < 35 or X[n, 2] > 225: # G3
    125. X[n, 2] = np.random.uniform(35, 225, 1)[0] # G4
    126. if X[n, 3] < 35 or X[n, 3] > 210: # G5
    127. X[n, 3] = np.random.uniform(35, 210, 1)[0] # G8
    128. if X[n, 4] < 130 or X[n, 4] > 325: # G11
    129. X[n, 4] = np.random.uniform(130, 325, 1)[0] # G1
    130. X[n, 5] = self.Pload1 - X[n, 0] - X[n, 1] - X[n, 2] - X[n, 3] - X[
    131. n, 4] # 负荷平衡得到 G13 出力
    132. while (X[n, 5] < 125) or (X[n, 5] > 315): # 如果G13 上下限违规
    133. X[n, 0] = np.random.uniform(10, 125, 1)[0] # G1
    134. X[n, 1] = np.random.uniform(10, 150, 1)[0] # G2
    135. X[n, 2] = np.random.uniform(35, 225, 1)[0] # G3
    136. X[n, 3] = np.random.uniform(35, 210, 1)[0] # G4
    137. X[n, 4] = np.random.uniform(130, 325, 1)[0] # G5
    138. X[n, 5] = self.Pload1- X[n, 0] - X[n, 1] - X[n, 2] - X[n, 3] - X[
    139. n, 4] # 负荷平衡得到 G13 出力
    140. return X

     (2)结果 

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


    2.3 案例2——IEEE10

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

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

    (1)Python代码

    1. # ~~~~~~~~~~~~~~~~~~~~~~~粒子群算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
    2. class Liqun:
    3. def __init__(self, Pload1, P_max,P_min,ai,bi,ci,di,ei,ali,beti,gari,eti,dali):
    4. self.Pload1 = Pload1 # 负荷
    5. self.P_max = P_max #机组上限
    6. self.P_min = P_min #机组下限
    7. self.ai=ai
    8. self.bi=bi
    9. self.ci=ci
    10. self.di=di
    11. self.ei=ei
    12. self.ali=ali
    13. self.beti=beti
    14. self.gari=gari
    15. self.eti=eti
    16. self.dali=dali
    17. # ~~~~~~~~PSO的参数~~~~~~~~~~~~~~~·
    18. self.w = 1 # 惯性因子,一般取1
    19. self.c1 = 2 # 学习因子1,一般取2
    20. self.c2 = 2 # 学习因子2,一般取2
    21. self.m = 500 # 种群大小,即种群中小鸟的个数
    22. self.iter_num = 100 # 算法最大迭代次数
    23. self.max_vel = 0.5 # 限制粒子的最大速度为0.5
    24. self.min_vel = -0.5 # 限制粒子的最小速度为-0.5
    25. self.a1= 0.7 # 总燃料约束权重
    26. self.a2= 0.3 # 污染排放量权重
    27. # ~~~~~~~~~~~~~初始化群群体~~~~~~~~~~~~~~~·
    28. def InitializeX(self):
    29. """
    30. :return: 群体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    31. """
    32. X = np.zeros((self.m, 10)) # 初始化群体,6代表 个机组出力
    33. for n in range(self.m): # 遍历每一个粒子
    34. X[n, 0] = np.random.uniform(10, 55, 1)[0] # G1
    35. X[n, 1] = np.random.uniform(20, 80, 1)[0] # G2
    36. X[n, 2] = np.random.uniform(47, 120, 1)[0] # G3
    37. X[n, 3] = np.random.uniform(20, 130, 1)[0] # G4
    38. X[n, 4] = np.random.uniform(50,160, 1)[0] # G5
    39. X[n, 5] = np.random.uniform(70,240, 1)[0] # G6
    40. X[n, 6] = np.random.uniform(60, 300, 1)[0] # G7
    41. X[n, 7] = np.random.uniform(70, 340, 1)[0] # G8
    42. X[n, 8] = np.random.uniform(130, 470, 1)[0] # G9
    43. X[n, 9] = np.random.uniform(150, 470, 1)[0] # G10
    44. return X
    45. # ~~~~~~~~~~~~~~~~~~~定义目标函数、和对应的惩罚项~~~~~~~~~~~~~~~~~~~·
    46. # ~~~~~1 目标函数:系统运行成本~~~~~
    47. def function1(self, X1):
    48. """
    49. 个体目标函数
    50. :param X1: (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    51. :return: 函数1目标函数值
    52. """
    53. SUMCOST = [] # 存储总的成本
    54. for i in range (9): # 遍历每一台机组,Python是从0开始索引,0-910台机组
    55. cost = self.ci[i] * X1[i] * X1[i] + self.bi[i]* X1[i] +self.ai[i]+\
    56. np.abs(self.di[i]*np.sin(ei[i]*(self.P_min[i]-X1[i]))) #考虑阀点效应
    57. SUMCOST.append(cost)
    58. return np.sum(SUMCOST)
    59. #~~~~~~~~~~~~~~总污染排放量~~~~~~~~~~~~··
    60. def function2(self, X1):
    61. """
    62. 个体目标函数
    63. :param X1: (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    64. :return: 函数2目标函数值
    65. """
    66. emission=[] #储存总的污染排放量
    67. for i in range(9):
    68. 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])
    69. emission.append(e)
    70. return np.sum(emission)
    71. # ~~~~平衡约束~~~~~~·
    72. def calc_e1(self, X1):
    73. """
    74. 函数1 对应的个体惩罚项
    75. :param X1: (个体[G1,G2,G3,G4,G5,G6,G7,G8,G9,G10]
    76. :return:
    77. """
    78. Ploss=0
    79. for i in range(9):
    80. for j in range(9):
    81. Ploss+=X1[i]*B[i][j]*X1[j]
    82. # 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)
    83. # return cost
    84. return max(0,abs(sum(X1)-Ploss-Pload1-0.1))

    (2)结果

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

    2.4 案例3——IEEE40 

    (1)代码

    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3. # ~~~~~~~~~~~~~导入相关库~~~~~~~~~~·
    4. import numpy as np
    5. import pandas as pd
    6. import matplotlib.pyplot as plt
    7. import matplotlib as mpl
    8. mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
    9. mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    10. import matplotlib
    11. matplotlib.use('TkAgg')
    12. from tqdm import tqdm # 进度条设置
    13. # ~~~~~~~~~~~~~~~~~~~~~读取文件~~~~~~~~~~~~~~~~~~~~~~
    14. file=pd.read_csv('IEEE40.csv')#机组参数
    15. P_max = file['b'] #机组上限
    16. P_min = file['c'] # #机组下限
    17. # ~~~~~~~~~~~~~~~~~机组特性系数~~~~~~~~~~~~~~~~~~~~~~~~·
    18. ai = file['d']
    19. bi=file['e']
    20. ci=file['f']
    21. di=file['g']
    22. ei=file['h']
    23. # ~~~~~~~排放特性系数~~~~~~~~~~~~~~~~·
    24. ali=file['g']
    25. beti=file['h']
    26. gari=file['i']
    27. eti=file['l']
    28. dali=file['m']
    29. # ~~~~~~~~~~~~~~~~~~~~~~~粒子群算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
    30. class Liqun:
    31. def __init__(self, Pload1, P_max,P_min,ai,bi,ci,di,ei,ali,beti,gari,eti,dali):
    32. self.Pload1 = Pload1 # 负荷
    33. self.P_max = P_max #机组上限
    34. self.P_min = P_min #机组下限
    35. self.ai = ai
    36. self.bi = bi
    37. self.ci = ci
    38. self.di = di
    39. self.ei = ei
    40. self.ali = ali
    41. self.beti = beti
    42. self.gari = gari
    43. self.eti = eti
    44. self.dali = dali
    45. # ~~~~~~~~PSO的参数~~~~~~~~~~~~~~~·
    46. self.w = 1 # 惯性因子,一般取1
    47. self.c1 = 2 # 学习因子1,一般取2
    48. self.c2 = 2 # 学习因子2,一般取2
    49. self.m = 500 # 种群大小,即种群中小鸟的个数
    50. self.iter_num = 100 # 算法最大迭代次数,机组数多,可以迭代次数加大
    51. self.max_vel = 0.5 # 限制粒子的最大速度为0.5
    52. self.min_vel = -0.5 # 限制粒子的最小速度为-0.5
    53. self.a1= 0.4 # 总燃料约束权重
    54. self.a2= 0.6 # 污染排放量权重

    #!/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)结果 

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

    3 Python代码

    回复关键字

  • 相关阅读:
    21天学习第十一天-Set集合
    STM8的C语言编程(12)--+AD转换
    分享感恩节联系客户话术
    【图形学】18 光照模型(三、镜面反射的Shader实现)
    Tomcat
    Llama2-Chinese项目:2.1-Atom-7B预训练
    关于npm/cnpm/npx/pnpm与yarn
    1033 旧键盘打字
    Crack:Aspose.CAD 22.11.0 for .NET|Aspose.CAD
    网站交换友情链接是否对SEO优化有帮助?
  • 原文地址:https://blog.csdn.net/weixin_61181717/article/details/127966850