改进的多目标差分进化算法不仅可以应用在电力系统环境经济调度,换其他多目标函数和约束条件依然适用。主要是把这个工具用好,用在其他多目标经典问题上,然后就可以写一篇期刊论文。
下面是运行结果:
迭代一千次:
1 电力系统环境经济调度数学模型
2 改进的多目标差分进化算法
3 Python代码实现
3.1 结果
迭代500次:
迭代一千次:
3.2 Python代码
(1)数据
(2)读取数据然后书写目标函数和约束条件
#!/usr/bin/env python # coding:utf-8 import numpy as np import math # from DE.initial import create_child, initialize from constraint import constraints """=============读取data.txt数据===================""" def inital_model(file): #file:data.txt这个文件 data = open(file, 'r').readlines() #读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素 num = int(data[0].split()[-1]) #切割字符串,结果返回由字符串元素组成的一个列表,得到num=6(机组个数) C = np.zeros([num, 5]) #存放煤耗特性系数 E = np.zeros([num, 5]) #存放排放特性系数 P = np.zeros([num, 2]) #存放机组最大出力与最小出力 B = np.zeros([num, num]) #存放B矩阵 parameters = len(data[3].split()) - 3 #第3行开始,到3+6=9行(Python从0开始计数) for i in range(2, 2 + num): raw_data = data[i].split()[1:] for j in range(parameters): C[i - 2][j] = float(raw_data[j]) #读取煤耗特性系数 P[i - 2][0] = float(raw_data[-2]) #读取机组下限 P[i - 2][1] = float(raw_data[-1]) #读取机组上限 length = len(data[2 + num].split()) - 1 for i in range(3 + num, 3 + 2 * num): #读取排放特性系数 raw_data = data[i].split()[1:] for j in range(length): E[i - 3 - num][j] = float(raw_data[j]) #排放特性系数 for i in range(4 + 2 * num, 4 + 3 * num): #读取B矩阵 raw_data = data[i].split() B[i - 4 - 2 * num] = np.array(list(map(float, raw_data))) B_0 = np.array(list(map(float, data[5 + 3 * num].split()))) B_00 = float(data[7 + 3 * num]) return num, C, E, P, B, B_0, B_00 """=====总燃料成本===========""" def costfun(uid, load, C, P=None): if P is not None: #如果满足机组上下限 return load * (C[uid][2] * load + C[uid][1]) + C[uid][0] + math.fabs(C[uid][3] * math.sin(C[uid][4] * (P[uid][0] - load))) return load * (C[uid][2] * load + C[uid][1]) + C[uid][0] """======总污染排放量==========""" def emission(uid, load, E, flag=True): if E[0][3] != 0 and flag: return (E[uid][0] + (E[uid][1] + E[uid][2] * load) * load) + E[uid][3] * math.exp(E[uid][4] * load) else: return load * (E[uid][2] * load + E[uid][1]) + E[uid][0] class Model: def __init__(self, file): self.nGen, self.C, self.E, self.P, self.B, self.B_0, self.B_00 = inital_model(file) def constraint(self): return constraints ""'======运行====================' if __name__ == '__main__': demand = 2.834 #负荷需求 model = Model('../data.txt') print("===============排放系数===============") print(model.E) exit(0) pop = np.array([0.1917, 0.3804, 0.5603, 0.7154, 0.6009, 0.3804]) #六个机组出力 fuel = 0 emis = 0 for i in range(len(pop)): #遍历六个机组 fuel += costfun(i, pop[i], model.C, model.P) emis += emission(i, pop[i], model.E, flag=True) print(fuel, emis) print(constraints(pop, model, demand)) exit(0)
(3)主函数,运行
"""========开始运行=============""" if __name__ == '__main__': demand = 2.834 model = Model('../data.txt') arguments = {'nIter': 1000, 'nPop': 200, 'nArc': 100, 'nGen': 6, 'F': 0.6, 'CR': 0, 'init': 1, 'mutation': 0} DE = MMODE(model=model, **arguments) DE.solve(demand) print(DE.finalY.shape) n = range(DE.nIter) fig, ax1 = plt.subplots() color = 'tab:red' ax1.set_xlabel('迭代次数') ax1.set_ylabel('最佳燃料成本($/h)', color=color) ax1.plot(n, DE.bestC, color=color) ax1.tick_params(axis='y', labelcolor=color) ax2 = ax1.twinx() # second y axis color = 'tab:blue' ax2.set_ylabel('最佳污染排放量(t/h)', color=color) ax2.plot(n, DE.bestE, color=color) ax2.tick_params(axis='y', labelcolor=color) plt.title('最佳成本和排放') fig.tight_layout() plt.show()