(文章复现)基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码
参考文献:
[1]高瑜,黄森,陈刘鑫等.基于改进灰狼算法的并网交流微电网经济优化调度[J].科学技术与工程, 2020,20(28):11605-11611.
[2]邓长征,冯朕,邱立等.基于混沌灰狼算法的交直流混合微网经济调度[J].电测与仪表, 2020, 57(04):99-107.
这两篇文章不管是从模型、原理、求解方法还是算例分析上看,都非常相似,鉴于文章两篇文章的作者单位没有重合,肯定是两位不同的作者在不同的时间灵感爆发,提出了相同的idea(甚至文献1中目标函数中成本只有4项,但算例分析部分和文献2一样有5项成本),证明了学术论文的可重复性。分析表明,这两篇文章绝对没有谁照搬谁的情况,也不可能是两个人抄了同一篇英文文献,更不可能是找了同一家论文代写机构然后被坑了。
综上所示,这篇博客就是对上面两篇不同文章中提到的一种相同的方法进行复现,以实现本人水一篇博客的目的。
1.基本原理
交直流混合微电网运行方式分为孤岛运行方式和并网运行方式,在本次研究中主要考虑并网情况下交直流混合微电网的经济优化调度。交直流混合微电网分为交流侧和直流侧,交流侧与外部大电网互联。交流侧包含交流母线、交流微电源和交流负荷; 直流侧包含直流母线、直流微电源和直流负荷。具体结构如图 1所示。
交直流混合微电网的主要运行方式有4种:
( 1) 满足交流侧和直流侧功率平衡,交流侧和直流侧的微电源相应满足交流负荷和直流负荷的供电需求;
( 2) 通过AC /DC 双向换流器使交流侧和直流侧功率交互,交流侧和直流侧互为补充,满足微网内交流负荷和直流负荷总的供电需求;
( 3) 直流侧储能系统参与微电网削峰填谷和平抑功率,当微网中微电源总出力大于负荷所需供电要求时; 储能系统充电,反之则储能系统放电;
( 4) 当微网中微电源和储能系统在某一时刻的出力不足以满足微网中负荷的需求时,向交流大电网购电; 反之则向大电网售电。储能系统和换流系统在以上运行方式中有重要的作用,因此在建立交直流混合微电网经济优化调度的经济模型中应考虑储能损耗和换流成本。
1.1目标函数
交流微电网内器件维修保养费用 F2 为
1.2约束条件
2.改进灰狼算法求解
2.1基本灰狼算法
来自澳大利亚的研究者 Mirjalili 于2014年提出一种新型群体智能算法——灰狼算法( grey wolf optimizer,GWO) [12]。灰狼算法通过模拟灰狼狼群在捕食过程中的特征及狼群等级制度,通过灰狼对猎物不停地搜索追寻,不断更新猎物所处的位置,最终灰狼成功捕捉猎物。在 GWO 算法中,将狼群按照等级由高到低分为 α 狼、β 狼、δ 狼和其余狼群个体 ω,灰狼的等级越高,其自身适应度越好,猎物的位置则对应全局最优解。α 狼为头狼,在狼群中起领导及决策作用; β 狼为头狼候选,在狼群中反馈信息给 α 狼; δ 狼负责对 ω 狼群的统领; ω 狼对猎物实施搜寻与追捕。狼群捕食过程首先要包围猎物,灰狼需要知道自身与猎物的距离大小,然后根据自身与猎物的距离来调整自己的位置。灰狼包围猎物的数学公式为
在狼群捕食过程中,α 狼、β 狼、δ 狼与猎物之间的距离可由式( 25) ~ 式( 27) 计算。由于 α 狼、β狼、δ 狼在狼群中等级制度,这意味着它们的适应度更好,从而离猎物的距离更近,ω 狼根据 α 狼、β 狼、 δ 狼的位置向猎物靠近,ω 狼朝向 α 狼、β 狼、δ 狼前进的方向与前进步长分别可由式( 28) ~ 式( 30) 计算。
灰狼算法的流程图如图 2 所示。
2.2改进灰狼算法
均衡 GWO 的全局搜索能力和局部搜索能力,是 GWO 能否取得高寻优性能的关键因素。当| A | > 1 时,灰狼群体将扩大包围圈,以寻找更让好的猎物,此时对应于全局搜索; 当 | A | < 1 时,灰狼群体将收缩包围圈,从而对猎物完成最后的攻击行为,此时对应于局部精确搜索[13]。因此 GWO 的全局搜索能力和局部搜索能力与 | A | 的取值之间有着极大关联,另外根据式( 23) 可知 | A| 的取值也与收敛因子 a 的取值紧密相关。由于原始 GWO 的收敛因子是线性的,且收敛因子 a 从 2 线性递减至 0,这种线性递减策略不能完全体现出实际的优化搜索过程。因此,引进一种基于非线性变化的收敛因子更新公式:
采取非线性变化的收敛因子在寻优初始阶段,a 衰减程度低,这时候,算法的全局寻优能力较强,能够搜索到更好的全局最优解;寻优末尾阶段,a 衰减程度高,这时候,算法的局部寻优能力较强,能够搜索到更好的局部最优解。这种基于非线性变化的收敛因子可以更够更好地均衡 GWO 的全局寻优能力和局部寻优能力,从而获得精度更好的解。
3.编程思路分析
3.1相关参数和决策变量定义
表1 相关参数的定义
表2 决策变量的定义
3.2编程思路
根据对文献内容的解读,可以设计下面的编程思路:
步骤1:输入所需数据
这一步比较简单。算例分析用到的大部分数据可以从原文中找到,其他数据可以自己假设一下。然后将所有需要的数据,按照表1的定义格式输入即可。
步骤2:灰狼算法的实现
实现基本的灰狼优化算法和改进灰狼优化算法,并使用文中提到的四个测试函数进行验证,两篇文章中对灰狼算法改进各不相同,一个是改进了收敛因子,一个是改进了初始化策略,这篇博客中的代码是将两种改进策略结合起来。以Sphere函数为例,基本灰狼优化算法和改进灰狼优化算法的对比如下(优化问题维度取10,种群数和最大迭代次数分别为200,100):
基本灰狼算法的运行结果:
最优解:x=1.6921e-13 9.8087e-15 -1.527e-13 -3.2711e-15 -3.2045e-14 -7.4947e-14 1.5045e-14 1.6444e-14 -2.0382e-14 2.4686e-14
最优函数值=6.0224e-26
改进灰狼算法的运行结果:
最优解:x=1.5078e-17 -1.7022e-16 1.3285e-18 3.5724e-17 2.0807e-16 3.5095e-17 -2.8155e-16 2.14e-16 1.5832e-16 -9.8643e-17
最优函数值=2.3486e-31
仅针对Sphere函数而言,改进灰狼算法的效果要更好一些。
步骤3:将灰狼算法用于微网调度问题
如表2所示,原文中共包含3个决策变量,都是1×24的变量,需要将其组合成一个1×72的变量,便于使用灰狼算法求解,也就意味中文中涉及的优化问题维度为72,具体变量设置如下:
智能优化算法中对于约束条件的处理有很多种形式,我在代码中参考这篇文章给的罚函数法进行处理:粒子群算法求解带约束优化问题 - 知乎。
另外,如果只遵循上下限约束生成初始种群,可能导致生成的种群中大部分甚至全部的个体都是不满足约束的,因此生成种群和更新种群时,还是要满足一定规则,使得生成的种群尽可能都满足约束。
步骤4:输出运行结果
参考文中的图表的格式,输出结果即可。
4.Matlab代码
%% 清除变量
clc
clear
close all
warning off%% 设置种群参数
sizepop = 200; % 初始种群个数
dim = 10; % 空间维数
ger = 100; % 最大迭代次数
x_max = 100*ones(1,dim); % 位置上限
x_min = -100*ones(1,dim); % 位置下限%% 种群初始化
pop = x_min + rand(sizepop,dim).*(x_max-x_min); % 初始化种群
fitness = zeros(1,sizepop); % 所有个体的适应度
for k = 1:sizepopfitness(k) = Sphere(pop(k,:));
end% 初始化Alpha、Beta、Delta狼群
[SortFitness,Index] = sort(fitness);
A_pop = pop(Index(1),:); % 初始化α狼群
A_fitness = SortFitness(1); % 初始化α狼群适应度
B_pop = pop(Index(2),:); % 初始化β狼群
B_fitness = SortFitness(2); % 初始化β狼群适应度
D_pop = pop(Index(3),:); % 初始化δ狼群
D_fitness = SortFitness(3); % 初始化δ狼群适应度
history = zeros(1,ger); % 历史最优适应度值
%% 迭代求最优解
iter = 1;
while iter <= gera = 2 - iter*(2/ger); % 线性调整a的值for k = 1:sizepop% 1.根据Alpha狼群更新位置X1r1 = rand;r2 = rand;A1 = 2*a*r1 - a;C1 = 2*r2;D_A = abs(C1*A_pop - pop(k,:));X1 = A_pop - A1*D_A;% 2.根据Beta狼群更新位置X2r1 = rand;r2 = rand;A2 = 2*a*r1 - a;C2 = 2*r2;D_B = abs(C2*B_pop - pop(k,:));X2 = B_pop - A2*D_B;% 3.根据Delta狼群更新位置X3r1 = rand;r2 = rand;A3 = 2*a*r1 - a;C3 = 2*r2;D_D = abs(C3*D_pop - pop(k,:));X3 = D_pop - A3*D_D;% 4.更新后的狼群位置pop(k,:) = (X1+X2+X3)/3;% 修复越限的狼群位置pop(k,pop(k,:) > x_max) = x_max(pop(k,:) > x_max);pop(k,pop(k,:) < x_min) = x_max(pop(k,:) < x_min);% 更新狼群的适应度fitness(k) = Sphere(pop(k,:));end% 更新Alpha、Beta、Delta狼群位置[SortFitness,Index] = sort(fitness);A_pop = pop(Index(1),:); % 初始化α狼群A_fitness = SortFitness(1); % 初始化α狼群适应度B_pop = pop(Index(2),:); % 初始化β狼群B_fitness = SortFitness(2); % 初始化β狼群适应度D_pop = pop(Index(3),:); % 初始化δ狼群D_fitness = SortFitness(3); % 初始化δ狼群适应度history(iter) = A_fitness;iter = iter+1;
end%% 画图
disp(['最优解:x=',num2str(A_pop)])
disp(['最优函数值=',num2str(A_fitness)])
plot(history,'linewidth',1)
ylabel('最优适应度值')
xlabel('迭代次数')
%% 适应度函数
function fitness = Sphere(pop)
fitness = sum(pop.^2);
end
运行结果如下:
最优解:x=-2.7836e-14 1.1833e-13 2.0262e-13 1.0821e-14 -2.534e-14 6.7367e-14 -7.4143e-14 -1.6845e-13 -1.5746e-13 3.9423e-14
最优函数值=1.2135e-25
以上仅为基本灰狼算法求解Sphere函数最优解的matlab代码(优化问题维度取10,种群数和最大迭代次数分别为200,100),完整论文复现的matlab代码可以从这个链接获取:
基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码
5.运行结果分析
文献结果和复现结果对比如下:
GWO算法改进前后的对比,改进GWO算法险胜:
运行结果画成条形图稍微好看一些:
相关文章:

(文章复现)基于灰狼算法(GWO)的交直流混合微网经济调度matlab代码
参考文献: [1]高瑜,黄森,陈刘鑫等.基于改进灰狼算法的并网交流微电网经济优化调度[J].科学技术与工程, 2020,20(28):11605-11611. [2]邓长征,冯朕,邱立等.基于混沌灰狼算法的交直流混合微网经济调度[J].电测与仪表, 2020, 57(04):99-107. 这两篇文章不管是从模型、…...

【Kubernetes】Kubernetes的调度
K8S调度 一、Kubernetes 调度1. Pod 调度介绍2. Pod 启动创建过程3. Kubernetes 的调度过程3.1 调度需要考虑的问题3.2 具体调度过程 二、影响kubernetes调度的因素1. nodeName2. nodeSelector3. 亲和性3.1 三种亲和性的区别3.2 键值运算关系3.3 节点亲和性3.4 Pod 亲和性3.5 P…...
题目:2511.最多可以摧毁的敌人城堡数量
题目来源: leetcode题目,网址:2511. 最多可以摧毁的敌人城堡数目 - 力扣(LeetCode) 解题思路: 顺序遍历数组,记录上一个我军城堡和没有城堡的位置。当碰到空位置时,若上一次更新的…...
22 | 书籍推荐数据分析
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn import neighbors from sklearn.model_selection import train_test_split from sklearn.preprocessing import...

vscode extension 怎么区分dev prod
开发模式注入环境变量 使用vsode 提供的api...

Java学习手册——第一篇Java简介
今后Java学习手册就来给大家梳理JavaSE的基础知识啦, 除了这个专栏我们还有其他专栏:前端、安全、后端等。 希望大家可以在这里一起讨论学习哟~ Java学习手册——第一篇Java简介 1. Java基础知识2. Java能干嘛3. Java基础环境搭建 1. Java基础知识 出生…...

Prometheus流程图(自绘)-核心组件-流程详解
阿丹手绘流程图:图片可能有点小查看的时候放大看看哈! prometheus核心组件 prometheus server Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。Prometheus Server可以通过静态配置管理…...
回归模型常见评估指标mae,mse,rmse
文章目录 MAE(平均绝对误差)计算公式sklearn实现numpy实现mse(均方误差)计算公式sklearn实现numpy实现rmse(均方根误差)计算公式sklearn实现MAE(平均绝对误差) 计算公式 MAE ( y ,...

服务器数据恢复-断电导致ext4文件系统文件丢失的数据恢复案例
服务器数据恢复环境: 一台服务器挂载一台存储设备,存储中划分一个Lun;服务器操作系统是Linux centos,EXT4文件系统。 服务器故障&分析: 意外断电导致服务器操作系统无法启动,系统在修复后可以正常启动&…...

链表(基础详解、实现、OJ笔试题)
文章目录 🧚什么是链表(链表概念及分类)链表分类单链表和双链表的区别 🚴♂️单链表、双向链表的实现单链表的实现双向链表的实现 🍉链表经典OJ笔试题反转单链表移除链表元素合并两个有序链表链表分割链表的中间结点…...

W5100S-EVB-PICO作为TCP Client 进行数据回环测试(五)
前言 上一章我们用W5100S-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务…...

大数据-玩转数据-Redis 安装与使用
一、说明 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址:http://download.redis.io/releases 二、下载 m…...
实时指标-1日留存率
2个DWD层 登录→kafka注册→kafka1个DWS 弄2条流,从kafka读取数据将昨日注册数据存到状态中,TTL为2天,存到map状态中,key为注册日期,value为set,存储注册的uid将登录流和注册流进行连接来一条登录数据&…...
【玩转23种Java设计模式】行为型模式篇:责任链模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
【C#】获取电脑CPU、内存、屏幕、磁盘等信息
通过WMI类来获取电脑各种信息,参考文章:WMI_04_常见的WMI类的属性_wmi scsilogicalunit_fantongl的博客-CSDN博客 自己整理了获取电脑CPU、内存、屏幕、磁盘等信息的代码 #region 系统信息/// <summary>/// 电脑信息/// </summary>public p…...

途乐证券-最准确的KDJ改良指标?
KDJ目标是技术剖析的一种重要目标之一,它是利用随机目标(%R)发展而来的,是一种反映商场超买和超卖状况的买卖目标。KDJ目标由快线(K线)、慢线(D线)和随机值(J线ÿ…...

数据结构——线性表
文章目录 线性表的定义和基本操作顺序表线性表的链式表示 线性表的定义和基本操作 线性表是具有相同数据类型的(n≥0)个数据元素的有限序列,其中n为表长,当n0时线性表是一个空表。若用L命名线性表,则其中一般表示为:L(a1,a2,a3, …...

SpringBoot系列之基于Jersey实现文件上传API
前言 JAX-RS:JAX-RS是可以用可以用于实现RESTFul应用程序的JAVA API,给开发者提供了一系列的RESTFul注解Jersey:是基于JAX-RX API的实现框架,用于实现RESTful Web 服务的开源框架。 JAX-RX常用的注解: javax.ws.rs.Pa…...
【LangChain】Prompts之示例选择器
LangChain学习文档 【LangChain】向量存储(Vector stores)【LangChain】向量存储之FAISS【LangChain】Prompts之Prompt templates【LangChain】Prompts之自定义提示模板【LangChain】Prompts之示例选择器 概要 如果您有大量示例,您可能需要选择要包含在提示中的哪…...
Neo4j之CREATE基础
在 Neo4j 中,CREATE 语句用于创建节点、关系以及节点属性。 创建节点: CREATE (p:Person {name: John, age: 30});这个查询会创建一个具有 "Person" 标签的节点,节点属性包括 "name" 和 "age"。 创建带有关…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...