#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date : 2021/10/4
#@email:1344732766@qq.com
import numpy as np
from tqdm import tqdm#进度条设置
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
import time
#===============水电站初始条件========================
#水电站1
Vmax1=9250*1e4 #水库容量上限(m3)
Vmin1=7000*1e4 #水库容量下限(m3)
H1=640 #水库容量初始值水位(m)
V1=(25*(H1-550)+7000)*1e4 #水库库容与水位的关系(简化:假设水库是一个标准长方体)
h1=91# #初始水库水头(m)
qr1=[20.4,25.2,22.1,19.3,16.4,23.3,28.6]; #水库来水流量(m3/s)
qmax1=44 #水库引用流量上限(m3/s)
qmin1=0 #水库引用流量下限(m3/s)
A1=9.8*1e3 #水库出力系数
k1=0.65 #发电效率
t=8.64*1e4 #水库发电引用流量时间段(s) =24小时
#水电站2
Vmax2=3500*1e4 #水库容量上限(m3)
Vmin2=1530*1e4 #水库容量下限(m3)
H2=540 #水库容量初始值水位(m)
V2=(20*(H2-483)+1530)*1e4 #水库库容与水位的关系(简化:假设水库是一个标准长方体)
h2=57 #初始水库水头(m)
qr2=[22.4,18.3,26.4,25.2,17.6,24.6,27.2] #水库来水流量(m3/s)
qmax2=32 #水库引用流量上限(m3/s)
qmin2=0 #水库引用流量下限(m3/s)
A2=9.8*1e3 #水库出力系数
k2=0.6 #发电效率
#
#=========================粒子群算法初始化=================
#给定粒子群计算初始化条件
T=7 #周期
c1=2 #学习因子1
c2=2 #学习因子2
w1=0.9 #惯性权重1
w2=0.4 #惯性权重2
MaxIter=200 #最大迭代次数
vmax=2 #最大运动速度
vmin=0 #最小运动速度
N=20 #初始化群体个体数目
qr=np.zeros(shape=(N,2*T))#初始化种群 水库来水流量
qr[:,0:7]=qr1
qr[:,7:14]=qr2
#初始化种群的个体(可以在这里限定位置和速度的范围)
q=np.zeros(shape=(N,2*T)) #位置随机初始化位置(位置为水电站发电尾水流量) 即发电用水流量
v=np.random.random((N,2*T)) #速度随机初始化速度
#适应度函数源程序(fitness)
Fx1=np.sum(k1*A1*q[:,0:7]*h1*t/3.6e10,axis=1) #水库1总发电量(万kWh)=发电效率*水库出力系数*用水流量*水头高度*水库发电引用流量时间 3.6e10 换算由来 秒换算成h 需要3.6e3, w换算成万kw 需要1e7
Fx2=np.sum(k2*A2*q[:,7:14]*h2*t/3.6e10,axis=1) #水库2总发电量(万kWh)shape=(N,)
Fx=Fx1+Fx2 #水库总发电量(万kWh)
#===设置当前粒子的最好位置
Pbest=q#最好粒子种群
FPbest=Fx#最好粒子种群对应的适应度
#找到初始粒子的最好粒子
r=np.argmax(FPbest)#种群中 最好的粒子索引
Fgbest=FPbest[r]#记录当前全局最优适应度值
Best=Pbest[r,:] #用于保存最优粒子位置
Bestfitness=[]#存储最优适应度
start_time=time.time()#开始时间计时
#------------------------------循环-----------------------------
for Iter in tqdm(range(MaxIter)):
#更新惯性权重和速度
w = ((w1 - w2) * (MaxIter - Iter) / MaxIter) + w2 #典型的线性递减策略
R1 = np.random.random((N, 2 * T))#速度更新公式中的R1
R2 = np.random.random((N, 2 * T))#速度更新公式中的R2
#粒子速度更新
B=np.zeros(shape=(N,2*T))
B[:]=q[r,:]
v = w * v + c1 * R1* (Pbest - q) + c2 * R2* (B - q)#V.shape=(20,14)
#粒子速度约束
v[v>vmax]=vmax
v[v < vmin] = vmin
#粒子发电用水流量更新
q = q + 1 * v#shape=(20,14)
#各时段引用流量约束
q1 = q[:, 0:7]# 水电站1 shape=(20,7)
q1[q1>qmax1]=qmax1
q1[q1 < qmin1] = qmin1
q[:,0:7]=q1
q2 = q[:, 7:14] # 水电站2 shape=(20,7)
q2[q2 > qmax2] = qmax2
q2[q2 < qmin2] = qmin2
q[:, 7:14] = q2
#======各时段库容大小(m3) ==============
Qr1 = qr[:, 0: 7]#种群 水库1 各时段的来水流量
Qr2 = qr[:, 7: 14]#种群 水库2 各时段的来水流量
Vs1 =np.zeros(shape=(N, T + 1)) #水库1 各时段初始库容大小 (相邻两个库容之间的差值 为一个调度周期,库容变化量)
Vj1 = np.zeros(shape=(N, T)) #水库1 各时段库容大小(首末平均值)
quit1 = np.zeros(shape=(N, T)) #水库1 各时段弃水大小
Vs2 = np.zeros(shape=(N, T + 1)) # 水库2 各时段初始库容大小 (相邻两个库容之间的差值 为一个调度周期,库容变化量)
Vj2 = np.zeros(shape=(N, T)) # 水库2 各时段库容大小(首末平均值)
quit2 = np.zeros(shape=(N, T)) # 水库2 各时段弃水大小
#===各时段水库 库容大小===
for i in range(N):#遍历每一个个体
Vs1[i, 0] = V1 #水库1初始时间的水位
Vs2[i, 0] = V2 #水库2初始时间的水位
for i in range(N): # 遍历每一个个体
for j in range(1,T+1):#从第2个时间开始遍历
#===水库1
q1=q[:,0:7]#水库1发电用水量
Vs1[i, j] = Vs1[i,j - 1] + (Qr1[i,j - 1] - q1[i, j - 1]) * t# 当前时刻库容 = 上一时刻库容 +(来水量 - 发电尾水流量)*t
if Vs1[i, j] >= Vmax1:
quit1[i, j - 1] = Vs1[i, j] - Vmax1 #弃水量 = 当前库容 - 最高库容
Vs1[i, j] = Vmax1 #当前库容等于最大库容
if Vs1[i, j] <= Vmin1:# 如果当前库容小于最低库容
q1[i, j - 1] = (Vs1[i, j] - Vmin1 + Qr1[i, j - 1] * t) / (t) #发电尾水流量 = (来水量 * t -(最低库容-当前库容)) / t
Vs1[i, j] = Vmin1 #当前时刻库容 = 最低库容
#==水库2
q2 = q[:, 7:14] # 水库2发电用水量
#%当前时刻库容=上一时刻库容+(来水量-发电尾水流量)*t+水电站1弃水量+(水电站1发电尾水量)*t
Vs2[i, j] = Vs2[i, j - 1] + (Qr2[i, j - 1] - q2[i, j - 1]) * t + quit1[i, j - 1] + q1[i, j - 1] * t
if Vs2[i, j] >= Vmax2:#如果水库2库容大于最高库容
quit2[i, j - 1] = Vs2[i, j] - Vmax2 #弃水量 = 当前库容 - 最高库容
Vs2[i, j] = Vmax2 #当前库容=最高库容
if Vs2[i, j] <= Vmin2: #如果当前库容小于最低库容
q2[i, j - 1] = (Vs2[i, j] - Vmin2 + Qr2[i, j - 1] * t)/t#% 发电尾水流量 = (来水量 * t -(最低库容-当前库容)) / t
Vs2[i, j] = Vmin2 # 当前时刻库容 = 最低库容
#各时段水库 库容平均值
for i in range(N):#遍历每一个样本
for j in range(T):#遍历每一个时段
Vj1[i, j] = (Vs1[i, j] + Vs1[i, j + 1]) / 2 #水库1 各时段平均库容
Vj2[i, j] = (Vs2[i, j] + Vs2[i, j + 1]) / 2 #水库2 各时段平均库容
#====各时段水位大小===
Hj1=np.zeros(shape=(N,T)) #水库1 各时段水位大小(平均)
Hs1=np.zeros(shape=(N,T+1))#水库1 各时段初始水位大小
Hj2=np.zeros(shape=(N,T))#水库2 各时段水位大小(平均)
Hs2=np.zeros(shape=(N,T+1))#水库2 各时段初始水位大小
for i in range(N):#遍历每一个样本
for j in range(T+1):#遍历每一个时段
Hs1[i, j]= ((Vs1[i, j] / 1e4) - 7000) / 25 + 550 #水库1(各时段初始水位与库容的关系)
Hs2[i, j] = ((Vs2[i, j] / 1e4) - 1530)
总裁余(余登武)
- 粉丝: 7w+
- 资源: 62
最新资源
- (源码)基于Spring Boot和MyBatis的社区问答系统.zip
- (源码)基于Spring Boot和WebSocket的人事管理系统.zip
- (源码)基于Spring Boot框架的云网页管理系统.zip
- (源码)基于Maude和深度强化学习的智能体验证系统.zip
- (源码)基于C语言的Papageno字符序列处理系统.zip
- (源码)基于Arduino的水质监测与控制系统.zip
- (源码)基于物联网的智能家居门锁系统.zip
- (源码)基于Python和FastAPI的Squint数据检索系统.zip
- (源码)基于Arduino的图片绘制系统.zip
- (源码)基于C++的ARMA53贪吃蛇游戏系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页