(MATLAB代码分享、可运行)基于NSGA-2算法的多目标水电站电力调度优化

问题描述

光伏发电的随机性、波动性和间歇性限制了电网对光伏发电的接纳能力,随着光伏发电的快速发展,提高光伏的消纳能力是一个亟待解决的大问题。利用水电和光伏进行联合发电是一条提高光伏消纳能力新的途径。本文建立了短期的优化调度模型,以调度期内调峰能力最大和互补系统的出力和负荷需求的偏差最小为目标函数,采用模拟退火粒子群算法进行求解,处理多目标问题时采用拥挤距离排序,并采用外部档案的方法进行数据维护,最终得出水光互补可以明显提高系统的调峰能力。

建模分析

1.Pw:水电出力 约束:0Mw≤Pw≤891Mw 单位:Mw

2.Pp:光伏出力 约束:0≤Pp≤277(已知值) 单位:Mw

时间/h123456789101112
水电出力(Mw)00000023197169192258
时间/h131415161718192021222324
光伏出力(Mw)274277266226176793890000

3.水电电量约束:个人感觉应该为24个小时,水电所发的电量之和为定值
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

具体数值:24个小时水电出力Pw相加17803Mwh

∆t=1h,单位一个小时

4. 功率平衡约束:Pp+pw≤Pd

其中:

(1)Pp:光伏出力,即24个小时的光伏 单位:Mw

时间/h123456789101112
水电出力(Mw)00000023197169192258
时间/h131415161718192021222324
光伏出力(Mw)274277266226176793890000

(2)Pd :发电计划,即24个小时所对应的发电计划 单位:Mw

时间/h123456789101112
发电计划(Mw)7507807707887567288678991098125613401250
时间/h131415161718192021222324
发电计划(Mw)988580572601656782890850760750768729

(3)Pw:水电出力 单位:Mw

由发电的流量决定,而发电流量由水位决定,水头和水位不是同一概念。(仅供参考)我认为决策变量只有水位。在粒子群算法中首先生成水位序列(随机位置),然后生成水位变化序列(进化的速度)。进而由水位所对应的发电流量求出水电的出力,就可以计算出两个目标函数)(仅供参考)

5. Vt:水量 单位亿m³ 这个理论上就是库容约束,可忽略。
在这里插入图片描述
6. Vt:库容 约束:0亿m³-----2862.8亿m³

7.Zt:水位 约束:2242m-----2469.15m 单位米

8.Qt:发电流量 约束:200m/s-----7000m/s 单位米/秒

9. Ht:水头高度 约束:99.5m-------150m 单位米(计算时用算术平均值124.75米)

MATLAB程序

代码运行过程示意图

在这里插入图片描述

在这里插入图片描述

结果示意图

在这里插入图片描述

main.m主程序如下:(完整代码可评论私信留邮箱)


clc;
clear;
close all;

%% Problem Definition

CostFunction=@(x) myfun(x);      % Cost Function

nVar=24;             % 时间段

VarSize=[1 nVar];   % Size of Decision Variables Matrix

VarMin= 2451.5.*ones(1,24);        % 水位下界 %这里为了产生初始解做了相关调整
VarMax= 2455.*ones(1,24);          % 水位上界

% Number of Objective Functions
% nObj=numel(CostFunction(unifrnd(VarMin,VarMax,VarSize)));
nObj = 2;

%% NSGA-II Parameters

MaxIt=70;      % Maximum Number of Iterations

nPop=80;        % Population Size

pCrossover=0.7;                         % Crossover Percentage
nCrossover=2*round(pCrossover*nPop/2);  % Number of Parnets (Offsprings)

pMutation=0.4;                          % Mutation Percentage
nMutation=round(pMutation*nPop);        % Number of Mutants

mu=0.02;                    % Mutation Rate

sigma=0.1*(VarMax-VarMin);  % Mutation Step Size


%% Initialization

empty_individual.Position=[];
empty_individual.Cost=[];
empty_individual.Rank=[];
empty_individual.DominationSet=[];
empty_individual.DominatedCount=[];
empty_individual.CrowdingDistance=[];

pop=repmat(empty_individual,nPop,1);

disp('产生初始可行解...')
for i=1:nPop
    
    flag=0;
    while flag==0
        tmp=[];
        for j=1:1:nVar
            tmp = [tmp unifrnd(VarMin(j),VarMax(j),1)];
        end
        flag = test(tmp); % 检查约束 约束不满足就重新生成解
    end
    pop(i).Position=tmp;
    
    pop(i).Cost=CostFunction(pop(i).Position);
    
end

% pause

% Non-Dominated Sorting
[pop, F]=NonDominatedSorting(pop);

% Calculate Crowding Distance
pop=CalcCrowdingDistance(pop,F);

% Sort Population
[pop, F]=SortPopulation(pop);


%% NSGA-II Main Loop

for it=1:MaxIt
    
    % 交叉
    popc=repmat(empty_individual,nCrossover/2,2);
    for k=1:nCrossover/2
        
        i1=randi([1 nPop]);
        p1=pop(i1);
        
        i2=randi([1 nPop]);
        p2=pop(i2);
        
        [popc(k,1).Position, popc(k,2).Position]=Crossover(p1.Position,p2.Position,VarMin,VarMax);
        if test(popc(k,1).Position)+test(popc(k,2).Position)==2
            popc(k,1).Cost=CostFunction(popc(k,1).Position);
            popc(k,2).Cost=CostFunction(popc(k,2).Position);
        else
            popc(k,1)=p1;
            popc(k,2)=p2;
        end
        
    end
    popc=popc(:);
    
    % 变异
    popm=repmat(empty_individual,nMutation,1);
    for k=1:nMutation
        
        i=randi([1 nPop]);
        p=pop(i);
        
        popm(k).Position=Mutate(p.Position,mu,sigma,VarMin,VarMax);
        
        %% 越界处理
%         chrom=[popm(k).Position];
%         chrom(find(chrom<VarMin(1)))=VarMin(1);
%         chrom(find(chrom>VarMax(1)))=VarMax(1);
%         popm(k).Position=chrom;
        
        if test(popm(k).Position)
            
            popm(k).Cost=CostFunction(popm(k).Position);
        else
            popm(k)=p;
        end
        
    end
    
    % 合并父代和子代
    pop=[pop
        popc
        popm]; %#ok
    
    % Non-Dominated Sorting
    [pop, F]=NonDominatedSorting(pop);
    
    % Calculate Crowding Distance
    pop=CalcCrowdingDistance(pop,F);
    
    % Sort Population
    pop=SortPopulation(pop);
    
    % 截取前n个解
    pop=pop(1:nPop);
    
    % Non-Dominated Sorting
    [pop, F]=NonDominatedSorting(pop);
    
    % Calculate Crowding Distance
    pop=CalcCrowdingDistance(pop,F);
    
    % Sort Population
    [pop, F]=SortPopulation(pop);
    
    % Store F1
    F1=pop(F{1});
    
    % Show Iteration Information
    disp(['Iteration ' num2str(it) ': Number of F1 Members = ' num2str(numel(F1))]);
    
    % Plot F1 Costs
    figure(1);
    PlotCosts(F1);
    pause(0.01);
    
end

%% Results
result

最后,博主专注于论文的复现工作,有兴趣的同学可以私信共同探讨。相关代码已经上传到资源共享,点击我的空间查看分享代码。

  • 28
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 55
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运筹不帷幄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值