(文章复现)考虑负荷满意度的微电网运行多目标优化matlab代码

参考文献:

[1]曾君,徐冬冬,刘俊峰等.考虑负荷满意度的微电网运行多目标优化方法研究[J].中国电机工程学报, 2016, 36(12): 3325 -3334.

[2] K. Deb, A. Pratap, S. Agarwal and T. Meyarivan, "A fast and elitist multiobjective genetic algorithm: NSGA-II," in IEEE Transactions on Evolutionary Computation, vol. 6, no. 2, pp. 182-197, April 2002, doi: 10.1109/4235.996017.

        这篇博客就是结合实际的算例,分析二代非支配排序遗传算法(Non-dominated Sorting Genetic Algorithm-Ⅱ, NSGA-)在求解电力系统多目标优化领域的方法。

1.基本原理

        本文在实验室已有风光互补发电系统基础上进行一定的扩展,建立的含风光柴蓄和多种负荷的微电网,结构如图1所示。从图1可以看出,该微电网系统由风力发电机组、光伏阵列、柴油发电机组、蓄电池、逆变器等实体单元以及能量管理系统构成。系统通过交流母线向负荷供电,利用各类控制器以及控制策略实现微电源的电压/电流/功率以及蓄电池的充放电控制等。能量管理系统主要负责实体结点数据和信息的监控、采集和处理,以及能量的优化与调度。

1.1目标函数

        优化目标:F1为总费用最低;F2为负荷满意度最大。以小时为单位,等时间步长优化,时间跨度为24h。

        目标函数F1:运行费用最低

        目标函数 F2:负荷满意度最大

1.2设备建模

1.3设备费用模型

        微电网中的设备费用可以分为固定投资,设备的运行维护成本,柴油发电机的燃油费用和环境成本,以及蓄电池的运行损耗。

2. NSGA-Ⅱ算法与Matlab实现 

        Kalyanmoy Deb在期刊《IEEE Transactions on Evolutionary Computation》发表的论文《A fast and elitist multiobjective genetic algorithm: NSGA-II》从快速非支配排序(fast nondominated sorting),精英保留策略(elitist-preserving),无参数的小生境算子(parameterless niching operator)等三个方面改进了初代NSGA算法,是目前使用最广泛的多目标智能优化算法之一。算法具体原理和实现方法在原文中已经网络上已有各种博客和笔记,此处不再赘述。

        Matlab中已经集成了NSGA-Ⅱ的算法实现,调用gamultiobj函数即可使用NSGA-算法,具体语法如下:

[x,fval,exitflag,output,population,scores] = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,intcon,options)

        其中黑色字体的为必要输入/输出参数,红色字体的是可选输入/输出参数,各个参数的具体用法如下:

2.1 输入参数

        1)必要输入参数fun和nvars

        fun表示适应度函数,可以是函数名称,也可以是函数句柄,nvars表示变量的维度。需要注意的是,gamultiobj函数使用时默认目标函数的优化方向都是min,如果原目标函数是max,在函数前加一个负号即可。下面是一个只使用两个输入参数的代码示例:

clc
clear
 
fitnessfcn = @(x)[norm(x)^2,0.5*norm(x(:)-[2;-1])^2+2];
 
x = gamultiobj(fitnessfcn,2);
plot(x(:,1),x(:,2),'ko')
xlabel('x(1)')
ylabel('x(2)')
title('Pareto Points in Parameter Space')

        2)线性不等式约束矩阵A和b

        假设决策变量为x,参数A和b表示表示变量x满足约束A*x≤b。例如下面这一组约束:

x1 + 2x2 ≤ 10

3x1 + 4x2 ≤ 20

5x1 + 6x2 ≤ 30.

        用矩阵A和向量b表示为:A = [1,2;3,4;5,6];b = [10;20;30]

        3)线性等式约束矩阵Aeq和beq

        假设决策变量为x,参数Aeq和beq表示表示变量x满足约束Aeq*x≤beq。例如下面这一组约束:

x1 + 2x2 +3x3 = 10

4x1 + 5x2 + 6 x3 = 20

        用矩阵Aeq和向量beq表示为:Aeq = [1,2,3;4,5,6];b = [10;20]

        4)变量的上下界ub和lb

        参数ub和lb分别表示变量的上限和下限,两者的数据维度都应小于等于nvars。当数据维度等于nvars,表示x(i)满足约束x(i) ≤ ub(i),i=1,2,...,nvars;当数据维度为k<nvars,表示x(i) ≤ ub(i),i=1,2,...,k。

        5)非线性约束nonlcon

        参数nonlcon表示优化问题的非线性约束,其中nonlcon为函数句柄或者函数名称。非线性约束的函数需要包含两个输出参数,c和ceq,两者均为行向量,分别表示约束c(x)<=0和约束ceq(x)=0。假设决策变量需要满足下列非线性约束:

        首先应把约束写成c(x)<=0和ceq(x)=0的形式:

        然后写出非线性约束的定义函数:

function [c,ceq] = nonlcon(x)
c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1;
c(2) = x(1)^2 - x(2) - 1;
ceq = x(1) - x(2)^5 - 1;
end

        6)整数变量的定义intcon

        如果要将决策变量x中第k维度限定为整数,则令intcon = k即可。如果是0-1变量,在定义为整数变量的基础上,再将其上下限约束为0和1即可。

        7)优化选项options

        options是算法的相关选项,为结构体的形式。最常用的选项包括种群规模“PopulationSize”以及最大迭代次数“Generations”,其他选项非常多,这里不再详细介绍,感兴趣的话可以去查看官方文档。

2.2 输出参数

        1)必要输出参数x

        x表示优化得到的Pareto最优解集,是决策变量的取值,而不是目标函数的取值。

        2)最优的目标函数集合fval

        fval表示优化得到的最优目标函数集合。

        3)算法终止原因exitflag

        exitflag表示算法终止的原因,其中:

0表示达到最大迭代次数

1表示连续几次迭代时种群变化比较小,因此算法终止。

-1表示被画图函数或者输出函数终止

-2表示没有找到可行解

-5表示算法运行超过最大时间限制

        4)优化过程的信息output

        output表示优化过程的信息,内容比较多,感兴趣可以去官网了解具体的信息。

        5)种群population和适应度scores

        population表示最后一次迭代时的种群,scores表示最后一次迭代时的种群适应度。

2.3 编程实例

        调用gamultiobj函数并使用NSGA-求解上述优化问题的代码为:

clc
clear

fitnessfcn = @my_first_multi;   % 适应度函数句柄
nvars = 2;                      % 决策变量维度
lb = [-5,-5];                   % 变量下限
ub = [5,5];                     % 变量上限
A = []; b = [];                 % 没有线性不等式约束
Aeq = []; beq = [];             % 没有线性等式约束
options = gaoptimset('ParetoFraction',0.3,'PopulationSize',100,'Generations',200,'StallGenLimit',200,'TolFun',1e-100,'PlotFcns',@gaplotpareto);
 
[x,fval] = gamultiobj(fitnessfcn,nvars, A,b,Aeq,beq,lb,ub,options);
 
function f = my_first_multi(x)
 
    f(1) = x(1)^4 - 10*x(1)^2+x(1)*x(2) + x(2)^4 - (x(1)^2)*(x(2)^2);
    f(2) = x(2)^4 - (x(1)^2)*(x(2)^2) + x(1)^4 + x(1)*x(2);
end

        运行结果如下:

3.复现思路分析

3.1相关参数和决策变量定义

表1 相关参数

表2 决策变量

        3.2编程思路

        根据对文献内容的解读,可以设计下面的编程思路:

        步骤1:输入所需数据

        这一步比较简单。算例分析用到的部分数据可以从原文中找到,其他数据可以自己假设一下。然后将所有需要的数据,按照表1的定义格式输入即可。

        步骤2对文章描述模糊之处的分析

        1)文中并没有设定蓄电池的初始荷电状态,但从算例分析的图11中可以看出初始时刻荷电状态大约为60%的荷电状态,也就是:

        2)按文中理论部分的描述,柴油发电机的成本应包括燃油成本、运行维护成本和环境成本,式(10)中CDG只包括燃油成本,但式(16)中又说CDG是柴油发电机总费用,存在矛盾。

        3)文中提到了可中断负荷,但是并没有列出可中断负荷的具体模型,也就是负荷最大削减量为多少,负荷削减是否有补偿,另外文献中对比了是否考虑负荷可转移的情况,但文中都未给出数学模型,我在此补充一下模型:

        步骤3决策变量的设定

        如表2所示,原文中共包含6个决策变量,除了柴油发电机输出功率之外都是1×24的变量,需要将其组合成一个1×192的变量,便于使用NSGA-Ⅱ算法求解,也就意味中文中涉及的优化问题维度为192,具体变量设置如下:

        步骤4:决策变量的上下界设定

        按照步骤3中设定的决策变量,给定各个决策变量的上界UB和下界LB,如下所示:

        步骤5:设定约束条件

        除了决策变量的上下限约束之外,这个多目标优化问题就只剩下了蓄电池充放电功率与容量约束,其中线性约束需要写成矩阵形式。

线性等式约束:

非线性不等式约束:

非线性等式约束:

        步骤6:设定目标函数

        优化问题中包含两个目标函数,其中F1为min,F2为max,因为默认是求min,所以求解时需要在F2前添加负号。

        步骤7:应用NSGA-Ⅱ算法求解

        设定好算法的决策变量维度、种群规模,最大迭代次数等其他参数,然后调用gamultiobj函数求解上述优化问题。

        步骤8输出运行结果

参考文中的图表的格式,输出结果即可。

4.Matlab代码

        (注意,这篇文献模型问题比较大,除了我上面提到的问题之外,还有很多问题,可用来学习非支配遗传算法的使用,微电网调度模型仅供参考)完整论文复现的matlab代码可以从这个链接获取:

(文章复现)考虑负荷满意度的微电网运行多目标优化matlab代码

5.运行结果分析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

配电网和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值