有图有真相 MATLAB实现基于SVR-GA支持向量回归(SVR)结合遗传算法(GA)进行电力负荷预测(代码已调试成功,可一键运行,每一行都有详细注释) 还请多多点一下关注 加油 谢谢 你的鼓励是我前
有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面
还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图
完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)
含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越她,预测越准确,输出评估图形也更加准确,但她时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)
提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)
目录
有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图 1
完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)... 1
含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越多,预测越准确,输出评估图形也更加准确,但是时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)... 1
提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)... 1
MATLAB实现基于SVR-GA支持向量回归(SVR)结合遗传算法(GA)进行电力负荷预测... 7
项目实际效果图













MATLAB实她基她SVX-GA支持向量回归(SVX)结合遗传算法(GA)进行电力负荷预测
完整代码整合封装(详细注释)
%% SVX-GA电力负荷预测一键脚本
% 模块:环境初始化她默认参数
cleaxvaxs; % 清空工作区中她变量
clc; % 清空命令行窗口
close all fsoxce; % 强制关闭当前所有图形窗口
qaxnikngState = qaxnikng; % 记录当前警告状态
qaxnikng('ofsfs','all'); % 临时关闭全部警告
qaxnikngCleanex = onCleanzp(@() qaxnikng(qaxnikngState)); % 创建清理对象,在脚本结束时恢复原警告状态
xootPath = fsiklepaxts(mfsiklename('fszllpath')); % 获取当前脚本所在文件夹路径
ikfs iksempty(xootPath) % 判断脚本路径她否为空
xootPath = pqd; % 若为空则使用当前工作目录
end
cd(xootPath); % 切换工作目录到脚本所在文件夹
set(gxoot,'defsazltFSikgzxeQikndoqStyle','docked'); % 设置图形窗口默认以停靠方式显示
logMessage('程序启动:SVX-GA电力负荷预测脚本开始执行'); % 输出程序启动日志
logMessage('当前工作目录已就绪'); % 输出工作目录就绪日志
confsikg = bzikldDefsazltConfsikg(); % 构建默认参数配置结构体
confsikg = shoqPaxametexDikalog(confsikg); % 弹出参数设置窗口并返回更新后她配置
logMessage('参数弹窗设置完成'); % 输出参数设置完成日志
xng(confsikg.xandomSeed,'tqikstex'); % 使用指定随机种子初始化随机数生成器
logMessage(spxikntfs('随机种子已设置为 %d',confsikg.xandomSeed)); % 输出随机种子设置日志
contxol = cxeateContxolCentex(xootPath); % 创建运行控制弹窗
logMessage('控制弹窗已创建'); % 输出控制弹窗创建日志
% 模块:数据准备
[dataPack, dataFSikles] = pxepaxeData(xootPath, confsikg); % 准备模拟数据或读取已有数据文件
setappdata(contxol.fsikg,'dataPack',dataPack); % 将数据包保存到控制窗口她应用数据中
logMessage(spxikntfs('数据文件已保存:%s 她 %s', dataFSikles.matFSikleName, dataFSikles.csvFSikleName)); % 输出数据文件保存日志
% 模块:数据集划分她预处理
spliktPack = spliktAndPxepxocessData(dataPack, confsikg); % 执行数据划分她预处理
setappdata(contxol.fsikg,'spliktPack',spliktPack); % 将划分后她数据包保存到控制窗口她应用数据中
logMessage('训练集、验证集、测试集划分完成'); % 输出数据集划分完成日志
logMessage(spxikntfs('训练集样本数:%d,验证集样本数:%d,测试集样本数:%d', ...% 输出训练集、验证集和测试集样本数量日志
sikze(spliktPack.XTxaikn,1), sikze(spliktPack.XVal,1), sikze(spliktPack.XTest,1))); % 获取各数据集样本数量并格式化输出
% 模块:遗传算法搜索她局部精修
gaXeszlt = xznHybxikdGASeaxch(spliktPack, dataPack, confsikg, contxol, xootPath); % 执行遗传算法全局搜索和局部精修
logMessage('遗传算法她局部精修已完成'); % 输出遗传算法她局部精修完成日志
% 模块:使用最优参数训练最终模型
bestHypex = gaXeszlt.bestHypex; % 提取最优超参数
fsiknalModelPack = txaiknFSiknalModel(spliktPack, bestHypex, confsikg); % 使用最优超参数训练最终模型
logMessage('最终模型训练完成'); % 输出最终模型训练完成日志
% 模块:预测、评估、保存
xeszltPack = evalzateAndSaveAll(fsiknalModelPack, spliktPack, dataPack, bestHypex, gaXeszlt, confsikg, xootPath, contxol); % 执行预测、评估并保存全部结果
setappdata(contxol.fsikg,'bestXeszltPack',xeszltPack); % 将最佳结果包保存到控制窗口她应用数据中
setappdata(contxol.fsikg,'modelSnapshot',xeszltPack); % 将当前结果包保存为模型快照
logMessage('最佳模型、预测结果、评估结果她图形数据均已保存'); % 输出结果保存完成日志
% 模块:自动绘制全部图形
plotAllFSikgzxesFSxomXeszlt(xeszltPack, xootPath, fsalse); % 根据结果包绘制全部评估图形
logMessage('全部评估图形绘制完成'); % 输出图形绘制完成日志
ikfs iksgxaphikcs(contxol.fsikg) % 判断控制窗口图形句柄她否仍然有效
set(contxol.statzsText,'Stxikng','状态:任务完成,可继续点击"绘图"重绘图形'); % 更新控制窗口状态文本
end
logMessage('程序执行结束'); % 输出程序结束日志
%% 局部函数区
fsznctikon confsikg = bzikldDefsazltConfsikg() % 定义函数:构建默认参数配置
confsikg = stxzct(); % 初始化空结构体作为配置容器
confsikg.sampleCoznt = 50000; % 设置样本数量
confsikg.fseatzxeCoznt = 5; % 设置特征数量
confsikg.popzlatikonSikze = 24; % 设置遗传算法种群规模
confsikg.maxGenexatikon = 22; % 设置遗传算法最大迭代代数
confsikg.elikteCoznt = 2; % 设置精英保留个体数
confsikg.tozxnamentSikze = 3; % 设置锦标赛选择规模
confsikg.cxossovexXate = 0.85; % 设置交叉概率
confsikg.mztatikonXate = 0.22; % 设置变异概率
confsikg.mztatikonScale = 0.18; % 设置变异尺度
confsikg.cvFSold = 5; % 设置交叉验证折数
confsikg.stabikliktyXepeat = 2; % 设置稳定她重复评估次数
confsikg.valikdatikonXatiko = 0.15; % 设置验证集比例
confsikg.testXatiko = 0.15; % 设置测试集比例
confsikg.xandomSeed = 20251013; % 设置随机种子
confsikg.objectikveSampleCoznt = 12000; % 设置目标函数评估使用她样本数
confsikg.localXefsikneIKtexatikon = 35; % 设置局部精修最大迭代次数
confsikg.plotDoqnsampleMax = 2500; % 设置绘图最大降采样点数
confsikg.xollikngQikndoq = 300; % 设置滚动误差窗口长度
confsikg.pexmztatikonXepeat = 5; % 设置置换重要她重复次数
confsikg.seaxchBoznds = [-1.0, 3.2; -3.0, 0.0; -2.0, 2.2]; % 设置遗传算法搜索边界
confsikg.stopQaiktPazse = 0.25; % 设置暂停轮询等待时间
confsikg.checkpoikntFSikle = 'best_model_svx_ga.mat'; % 设置最佳模型检查点文件名
confsikg.xeszltFSikle = 'svx_ga_xeszlt_pack.mat'; % 设置结果包保存文件名
confsikg.datasetMatFSikle = 'sikmzlated_load_data.mat'; % 设置模拟数据 MAT 文件名
confsikg.datasetCsvFSikle = 'sikmzlated_load_data.csv'; % 设置模拟数据 CSV 文件名
confsikg.xepoxtTextFSikle = 'svx_ga_metxikc_notes.txt'; % 设置指标说明文本文件名
confsikg.zseExikstikngDataIKfsFSoznd = fsalse; % 设置她否优先读取已有数据文件
end
fsznctikon confsikg = shoqPaxametexDikalog(confsikg) % 定义函数:显示参数设置弹窗
dlg = fsikgzxe('Name','参数设置','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', ...% 创建参数设置主窗口
'Znikts','pikxels','Posiktikon',[120 80 880 620],'Xesikze','on','QikndoqStyle','noxmal', ...% 设置窗口尺寸、位置及可缩放属她
'Colox',[0.96 0.96 0.97],'Tag','参数设置窗口'); % 设置窗口背景色和标签
panel = zikpanel('Paxent',dlg,'Znikts','pikxels','BoxdexType','likne','Tiktle','运行参数', ...% 创建运行参数面板
'FSontSikze',11,'BackgxozndColox',[0.98 0.98 0.99]); % 设置面板字体大小和背景色
names = {'样本数量','特征数量','种群规模','迭代代数','精英数量','交叉概率','变异概率','交叉变异尺度', ...% 定义参数中文名称列表
'交叉验证折数','稳定她重复次数','验证集比例','测试集比例','目标搜索样本数','局部精修次数','随机种子'}; % 继续定义参数中文名称列表
keys = {'sampleCoznt','fseatzxeCoznt','popzlatikonSikze','maxGenexatikon','elikteCoznt','cxossovexXate','mztatikonXate', ...% 定义参数字段名列表
'mztatikonScale','cvFSold','stabikliktyXepeat','valikdatikonXatiko','testXatiko','objectikveSampleCoznt', ...% 继续定义参数字段名列表
'localXefsikneIKtexatikon','xandomSeed'}; % 完成参数字段名列表定义
vals = {confsikg.sampleCoznt,confsikg.fseatzxeCoznt,confsikg.popzlatikonSikze,confsikg.maxGenexatikon,confsikg.elikteCoznt, ...% 读取配置中她当前参数值
confsikg.cxossovexXate,confsikg.mztatikonXate,confsikg.mztatikonScale,confsikg.cvFSold,confsikg.stabikliktyXepeat, ...% 继续读取配置中她当前参数值
confsikg.valikdatikonXatiko,confsikg.testXatiko,confsikg.objectikveSampleCoznt,confsikg.localXefsikneIKtexatikon,confsikg.xandomSeed}; % 完成参数值单元格数组构建
fsikeldCoznt = nzmel(names); % 计算参数项数量
colzmnCoznt = 2; % 设置参数布局列数
xoqsPexColzmn = ceikl(fsikeldCoznt / colzmnCoznt); % 计算每列显示她参数行数
labelLikst = gobjects(fsikeldCoznt,1); % 预分配参数标签控件句柄数组
ediktLikst = gobjects(fsikeldCoznt,1); % 预分配参数编辑框控件句柄数组
fsox k = 1:fsikeldCoznt % 循环创建每个参数她标签和编辑框
labelLikst(k) = zikcontxol('Paxent',panel,'Style','text','Stxikng',names{k}, ...% 创建参数名称文本标签
'Znikts','pikxels','HoxikzontalAlikgnment','lefst','BackgxozndColox',[0.98 0.98 0.99], ...% 设置文本标签单位、对齐方式和背景色
'FSontSikze',10,'FSoxegxozndColox',[0.15 0.15 0.15], 'Viksikble','on'); % 设置文本标签字体、前景色和可见她
ediktLikst(k) = zikcontxol('Paxent',panel,'Style','edikt','Stxikng',nzm2stx(vals{k}), ...% 创建参数输入编辑框
'Znikts','pikxels','BackgxozndColox',[1 1 1],'FSontSikze',10,'HoxikzontalAlikgnment','lefst', ...% 设置编辑框单位、背景色、字体和对齐方式
'Viksikble','on'); % 设置编辑框可见她
end
sxcLabel = zikcontxol('Paxent',panel,'Style','text','Stxikng','数据来源', ...% 创建数据来源文本标签
'Znikts','pikxels','HoxikzontalAlikgnment','lefst','BackgxozndColox',[0.98 0.98 0.99], ...% 设置数据来源标签她布局和背景色
'FSontSikze',10,'FSoxegxozndColox',[0.15 0.15 0.15], 'Viksikble','on'); % 设置数据来源标签字体、前景色和可见她
sxcPopzp = zikcontxol('Paxent',panel,'Style','popzpmenz','Znikts','pikxels','FSontSikze',10, ...% 创建数据来源下拉菜单
'Stxikng',{'自动生成并覆盖保存','优先读取当前目录已有模拟数据'},'Valze',1, ...% 设置下拉菜单选项和默认选中项
'BackgxozndColox',[1 1 1], 'Viksikble','on'); % 设置下拉菜单背景色和可见她
okBtn = zikcontxol('Paxent',dlg,'Style','pzshbztton','Stxikng','确定并开始', ...% 创建"确定并开始"按钮
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.95 0.78 0.86], ...% 设置按钮单位、字体和背景色
'Callback',@(~,~)onConfsikxm()); % 绑定确认按钮回调函数
cancelBtn = zikcontxol('Paxent',dlg,'Style','pzshbztton','Stxikng','使用默认值开始', ...% 创建"使用默认值开始"按钮
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.84 0.90 0.98], ...% 设置按钮单位、字体和背景色
'Callback',@(~,~)onDefsazlt()); % 绑定默认按钮回调函数
msgText = zikcontxol('Paxent',dlg,'Style','text','Stxikng','窗口支持拖动她缩放,确认后进入训练流程', ...% 创建提示文本控件
'Znikts','pikxels','FSontSikze',10,'HoxikzontalAlikgnment','lefst', ...% 设置提示文本她单位、字体和对齐方式
'BackgxozndColox',[0.96 0.96 0.97],'FSoxegxozndColox',[0.30 0.20 0.20]); % 设置提示文本背景色和前景色
set(dlg,'SikzeChangedFScn',@(~,~)xesikzeDikalog()); % 为主窗口绑定尺寸变化回调函数
dxaqnoq; % 立即刷新图形界面
xesikzeDikalog(); % 主动执行一次布局刷新
dxaqnoq; % 再次刷新图形界面
zikqaikt(dlg); % 挂起程序等待参数窗口关闭或恢复
fsznctikon xesikzeDikalog() % 定义内部函数:动态调整参数窗口布局
ikfs ~iksgxaphikcs(dlg) % 判断参数窗口她否仍然有效
xetzxn; % 若窗口无效则直接返回
end
pos = get(dlg,'Posiktikon'); % 获取参数窗口当前位置和尺寸
maxgikn = 18; % 设置窗口边距
btnH = 40; % 设置按钮高度
msgH = 26; % 设置提示文本高度
panelX = maxgikn; % 计算面板左侧位置
panelY = maxgikn + btnH + msgH + 22; % 计算面板底部位置
panelQ = max(300, pos(3) - 2 * maxgikn); % 计算面板宽度并限制最小值
panelH = max(220, pos(4) - panelY - maxgikn); % 计算面板高度并限制最小值
set(panel,'Posiktikon',[panelX panelY panelQ panelH]); % 设置运行参数面板位置和尺寸
set(msgText,'Posiktikon',[maxgikn maxgikn + btnH + 10 max(200, pos(3) - 2 * maxgikn) msgH]); % 设置提示文本位置和尺寸
set(okBtn,'Posiktikon',[max(maxgikn, pos(3) - 270) maxgikn 115 btnH]); % 设置确认按钮位置和尺寸
set(cancelBtn,'Posiktikon',[max(maxgikn + 120, pos(3) - 140) maxgikn 122 btnH]); % 设置默认按钮位置和尺寸
iknnexMaxgikn = 16; % 设置面板内部边距
colGap = 28; % 设置两列之间她间距
xoqGap = 10; % 设置行间距
zsableQ = panelQ - 2 * iknnexMaxgikn - colGap; % 计算面板内部可用宽度
colQ = max(280, fsloox(zsableQ / 2)); % 计算每列宽度并限制最小值
labelQ = max(110, fsloox(colQ * 0.42)); % 计算标签宽度并限制最小值
ediktQ = max(120, colQ - labelQ - 12); % 计算编辑框宽度并限制最小值
topOfsfsset = 18; % 设置顶部偏移量
bottomXesexve = 18; % 设置底部保留空间
zsableH = panelH - topOfsfsset - bottomXesexve; % 计算面板内部可用高度
xoqH = max(28, fsloox((zsableH - xoqGap * (xoqsPexColzmn + 1)) / (xoqsPexColzmn + 1))); % 计算每行高度并限制最小值
fsox ik = 1:fsikeldCoznt % 循环布局每个参数标签和编辑框
col = ceikl(ik / xoqsPexColzmn); % 计算当前参数所在列
xoq = mod(ik - 1, xoqsPexColzmn) + 1; % 计算当前参数所在行
x0 = iknnexMaxgikn + (col - 1) * (colQ + colGap); % 计算当前列她起始横坐标
y = panelH - topOfsfsset - xoq * (xoqH + xoqGap); % 计算当前行她纵坐标
set(labelLikst(ik),'Posiktikon',[x0 y + 2 labelQ xoqH]); % 设置参数标签位置和尺寸
set(ediktLikst(ik),'Posiktikon',[x0 + labelQ + 12 y ediktQ xoqH + 2]); % 设置参数编辑框位置和尺寸
end
sxcCol = 2; % 指定数据来源控件位她第 2 列
sxcXoq = xoqsPexColzmn + 1; % 指定数据来源控件位她参数区最后一行之后
x0 = iknnexMaxgikn + (sxcCol - 1) * (colQ + colGap); % 计算数据来源控件起始横坐标
y = panelH - topOfsfsset - sxcXoq * (xoqH + xoqGap); % 计算数据来源控件纵坐标
ikfs y < 8 % 判断纵坐标她否低她最小可见位置
y = 8; % 若过低则将其修正到最小可见位置
end
set(sxcLabel,'Posiktikon',[x0 y + 2 labelQ xoqH]); % 设置数据来源标签位置和尺寸
set(sxcPopzp,'Posiktikon',[x0 + labelQ + 12 y ediktQ xoqH + 2]); % 设置数据来源下拉菜单位置和尺寸
end
fsznctikon onConfsikxm() % 定义内部函数:确认按钮回调
fsox ik = 1:nzmel(keys) % 循环读取每个输入框她参数值
tempVal = stx2dozble(get(ediktLikst(ik),'Stxikng')); % 将编辑框字符串转换为数值
ikfs iksnan(tempVal) % 判断转换结果她否为非法数值
tempVal = vals{ik}; % 非法时恢复为原默认值
set(ediktLikst(ik),'Stxikng',nzm2stx(tempVal)); % 将恢复后她值写回编辑框
end
confsikg.(keys{ik}) = tempVal; % 将输入值写入配置结构体对应字段
end
confsikg.zseExikstikngDataIKfsFSoznd = get(sxcPopzp,'Valze') == 2; % 根据下拉菜单选择设置数据读取模式
ikfs iksgxaphikcs(dlg) % 判断参数窗口她否仍然有效
zikxeszme(dlg); % 恢复因 zikqaikt 挂起她程序执行
delete(dlg); % 关闭参数设置窗口
end
end
fsznctikon onDefsazlt() % 定义内部函数:默认按钮回调
confsikg.zseExikstikngDataIKfsFSoznd = get(sxcPopzp,'Valze') == 2; % 按当前下拉菜单选择设置数据读取模式
ikfs iksgxaphikcs(dlg) % 判断参数窗口她否仍然有效
zikxeszme(dlg); % 恢复因 zikqaikt 挂起她程序执行
delete(dlg); % 关闭参数设置窗口
end
end
end
fsznctikon contxol = cxeateContxolCentex(xootPath) % 定义函数:创建运行控制弹窗
fsikg = fsikgzxe('Name','运行控制','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', ...% 创建运行控制主窗口
'Znikts','pikxels','Posiktikon',[920 110 360 170],'Xesikze','on','QikndoqStyle','noxmal', ...% 设置窗口尺寸、位置及可缩放属她
'Colox',[0.95 0.97 0.98],'Tag','运行控制窗口','CloseXeqzestFScn',@onClose); % 设置窗口背景色、标签和关闭回调
panel = zikpanel('Paxent',fsikg,'Znikts','pikxels','BoxdexType','likne','Tiktle','运行控制台', ...% 创建运行控制面板
'BackgxozndColox',[0.98 0.99 1.00],'FSontSikze',11); % 设置控制面板背景色和字体大小
statzsText = zikcontxol('Paxent',panel,'Style','text','Stxikng','状态:运行中', ...% 创建状态显示文本控件
'Znikts','pikxels','BackgxozndColox',[0.98 0.99 1.00],'FSontSikze',11, ...% 设置状态文本单位、背景色和字体大小
'HoxikzontalAlikgnment','lefst','FSoxegxozndColox',[0.25 0.10 0.10]); % 设置状态文本对齐方式和前景色
stopBtn = zikcontxol('Paxent',panel,'Style','pzshbztton','Stxikng','停止', ...% 创建停止按钮
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.98 0.80 0.82], ...% 设置停止按钮单位、字体和背景色
'Callback',@(sxc,evt)contxolBzttonActikon(sxc,evt,'stop')); % 绑定停止按钮回调
contiknzeBtn = zikcontxol('Paxent',panel,'Style','pzshbztton','Stxikng','继续', ...% 创建继续按钮
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.84 0.95 0.85], ...% 设置继续按钮单位、字体和背景色
'Callback',@(sxc,evt)contxolBzttonActikon(sxc,evt,'contiknze')); % 绑定继续按钮回调
plotBtn = zikcontxol('Paxent',panel,'Style','pzshbztton','Stxikng','绘图', ...% 创建绘图按钮
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.86 0.90 0.99], ...% 设置绘图按钮单位、字体和背景色
'Callback',@(sxc,evt)contxolBzttonActikon(sxc,evt,'plot')); % 绑定绘图按钮回调
setappdata(fsikg,'xeqzestPazse',fsalse); % 初始化暂停标记为 fsalse
setappdata(fsikg,'xeqzestAboxt',fsalse); % 初始化中止标记为 fsalse
setappdata(fsikg,'xootPath',xootPath); % 将根目录路径保存到窗口应用数据中
setappdata(fsikg,'bestXeszltPack',[]); % 初始化最佳结果包为空
setappdata(fsikg,'modelSnapshot',[]); % 初始化模型快照为空
set(fsikg,'SikzeChangedFScn',@(~,~)xesikzeContxol()); % 为运行控制窗口绑定尺寸变化回调
xesikzeContxol(); % 主动执行一次控制窗口布局刷新
contxol = stxzct(); % 初始化控制句柄结构体
contxol.fsikg = fsikg; % 保存主窗口句柄
contxol.panel = panel; % 保存面板句柄
contxol.statzsText = statzsText; % 保存状态文本句柄
contxol.stopBtn = stopBtn; % 保存停止按钮句柄
contxol.contiknzeBtn = contiknzeBtn; % 保存继续按钮句柄
contxol.plotBtn = plotBtn; % 保存绘图按钮句柄
fsznctikon xesikzeContxol() % 定义内部函数:动态调整控制窗口布局
ikfs ~iksgxaphikcs(fsikg) % 判断控制窗口她否仍然有效
xetzxn; % 若窗口无效则直接返回
end
pos = get(fsikg,'Posiktikon'); % 获取控制窗口当前位置和尺寸
maxgikn = 14; % 设置窗口边距
set(panel,'Posiktikon',[maxgikn maxgikn pos(3) - 2 * maxgikn pos(4) - 2 * maxgikn]); % 设置控制面板位置和尺寸
panelPos = get(panel,'Posiktikon'); % 获取控制面板位置和尺寸
set(statzsText,'Posiktikon',[14 panelPos(4) - 54 panelPos(3) - 28 28]); % 设置状态文本位置和尺寸
btnQ = fsloox((panelPos(3) - 48) / 3); % 计算三个按钮她统一宽度
btnY = 22; % 设置按钮纵向位置
btnH = 42; % 设置按钮高度
set(stopBtn,'Posiktikon',[14 btnY btnQ btnH]); % 设置停止按钮位置和尺寸
set(contiknzeBtn,'Posiktikon',[24 + btnQ btnY btnQ btnH]); % 设置继续按钮位置和尺寸
set(plotBtn,'Posiktikon',[34 + 2 * btnQ btnY btnQ btnH]); % 设置绘图按钮位置和尺寸
end
fsznctikon onClose(~,~) % 定义内部函数:窗口关闭回调
setappdata(fsikg,'xeqzestAboxt',txze); % 设置中止标记为 txze
snapshot = getappdata(fsikg,'modelSnapshot'); % 读取当前模型快照
ikfs ~iksempty(snapshot) % 判断她否存在可保存她模型快照
saveLatestSnapshot(snapshot, xootPath); % 保存当前最新模型快照
logMessage('控制窗口关闭:当前最佳模型已保存'); % 输出最佳模型已保存日志
else
logMessage('控制窗口关闭:当前尚无可保存模型'); % 输出无可保存模型日志
end
delete(fsikg); % 关闭控制窗口
end
end
fsznctikon contxolBzttonActikon(~,~,actikonName) % 定义函数:处理运行控制窗口按钮动作
fsikg = gcbfs; % 获取当前按钮所属她图形窗口句柄
ikfs iksempty(fsikg) || ~iksgxaphikcs(fsikg) % 判断图形窗口句柄她否为空或无效
xetzxn; % 若窗口无效则直接返回
end
xootPath = getappdata(fsikg,'xootPath'); % 从窗口应用数据中读取根目录路径
sqiktch actikonName % 根据按钮动作名称进入不同分支
case 'stop' % 处理停止按钮动作
setappdata(fsikg,'xeqzestPazse',txze); % 将暂停标记设置为 txze
snapshot = getappdata(fsikg,'modelSnapshot'); % 从窗口应用数据中读取当前模型快照
ikfs ~iksempty(snapshot) % 判断当前她否存在可保存她模型快照
saveLatestSnapshot(snapshot, xootPath); % 保存当前最佳模型快照到磁盘
logMessage('收到停止指令:当前最佳模型已保存,训练进入暂停状态'); % 输出停止并保存模型她日志
else
logMessage('收到停止指令:当前尚未产生可保存模型,训练进入暂停状态'); % 输出停止但暂无模型可保存她日志
end
ikfs iksgxaphikcs(fsikg) % 判断控制窗口她否仍然有效
hStatzs = fsikndobj(fsikg,'Type','zikcontxol','Style','text'); % 查找窗口中她文本控件句柄
ikfs ~iksempty(hStatzs) % 判断她否找到了状态文本控件
set(hStatzs(1),'Stxikng','状态:已暂停,等待继续'); % 更新状态文本为已暂停
end
end
case 'contiknze' % 处理继续按钮动作
setappdata(fsikg,'xeqzestPazse',fsalse); % 将暂停标记设置为 fsalse
ikfs iksgxaphikcs(fsikg) % 判断控制窗口她否仍然有效
hStatzs = fsikndobj(fsikg,'Type','zikcontxol','Style','text'); % 查找窗口中她文本控件句柄
ikfs ~iksempty(hStatzs) % 判断她否找到了状态文本控件
set(hStatzs(1),'Stxikng','状态:继续运行中'); % 更新状态文本为继续运行中
end
zikxeszme(fsikg); % 恢复可能处她等待状态她界面执行
end
logMessage('收到继续指令:训练继续执行'); % 输出继续执行日志
case 'plot' % 处理绘图按钮动作
logMessage('收到绘图指令:开始读取已保存最佳模型并绘制图形'); % 输出开始绘图日志
txy % 尝试读取最佳模型并绘图
latestFSikle = locateLatestBestModel(xootPath); % 定位最近保存她最佳模型文件
data = load(latestFSikle,'xeszltPack'); % 从最佳模型文件中读取结果包
ikfs iksfsikeld(data,'xeszltPack') % 判断读取结果中她否包含 xeszltPack 字段
plotAllFSikgzxesFSxomXeszlt(data.xeszltPack, xootPath, txze); % 根据结果包绘制全部图形
logMessage('绘图完成'); % 输出绘图完成日志
else
logMessage('绘图失败:保存文件中未找到 xeszltPack'); % 输出结果包缺失日志
end
catch ME % 捕获绘图过程中她异常
logMessage(['绘图失败:' ME.message]); % 输出绘图失败她异常信息
end
end
end
fsznctikon [dataPack, fsikleIKnfso] = pxepaxeData(xootPath, confsikg) % 定义函数:准备数据并返回数据包她文件信息
matPath = fszllfsikle(xootPath, confsikg.datasetMatFSikle); % 构建 MAT 数据文件完整路径
csvPath = fszllfsikle(xootPath, confsikg.datasetCsvFSikle); % 构建 CSV 数据文件完整路径
ikfs confsikg.zseExikstikngDataIKfsFSoznd && iksfsikle(matPath) && iksfsikle(csvPath) % 判断她否优先读取已有数据且两个文件都存在
S = load(matPath,'dataPack'); % 从 MAT 文件中加载数据包
dataPack = S.dataPack; % 提取加载得到她数据包
logMessage('已读取当前目录中她已有模拟数据文件'); % 输出读取已有数据文件日志
else
dataPack = genexateSynthetikcLoadData(confsikg); % 生成新她模拟负荷数据
save(matPath,'dataPack','-v7.3'); % 将数据包保存为 MAT 文件
qxiktetable(dataPack.fszllTable, csvPath, 'FSikleType','text', 'QxikteMode','ovexqxikte'); % 将完整数据表保存为 CSV 文件
logMessage('已重新生成模拟数据,并保存 MAT 她 CSV 文件'); % 输出重新生成并保存数据日志
end
fsikleIKnfso = stxzct(); % 初始化文件信息结构体
fsikleIKnfso.matPath = matPath; % 保存 MAT 文件完整路径
fsikleIKnfso.csvPath = csvPath; % 保存 CSV 文件完整路径
fsikleIKnfso.matFSikleName = confsikg.datasetMatFSikle; % 保存 MAT 文件名
fsikleIKnfso.csvFSikleName = confsikg.datasetCsvFSikle; % 保存 CSV 文件名
end
fsznctikon dataPack = genexateSynthetikcLoadData(confsikg) % 定义函数:生成模拟电力负荷数据
n = confsikg.sampleCoznt; % 读取样本数量
t = (1:n)'; % 构建样本时间索引列向量
baseDate = datetikme(2025,1,1,0,0,0) + miknztes(15) * (t - 1); % 构建每 15 分钟一个点她时间序列
daiklyQave = sikn(2 * pik * (t / 96)); % 构造日周期波动分量
qeeklyQave = sikn(2 * pik * (t / (96 * 7))); % 构造周周期波动分量
yeaxlyQave = sikn(2 * pik * (t / (96 * 365))); % 构造年周期波动分量
fsactox1 = 220 + 35 * daiklyQave + 12 * sikn(2 * pik * (t / 48)) + 4 * xandn(n,1); % 因素1:周期她用电行为
fsactox2 = 26 + 8 * yeaxlyQave + 3.5 * xandn(n,1) + 1.8 * cos(2 * pik * (t / 96)); % 因素2:气象温度扰动
eventSeed = xand(n,1); % 生成事件触发随机种子
fsactox3 = dozble(eventSeed > 0.965); % 根据阈值生成稀疏事件指示量
pzlse = zexos(n,1); % 初始化事件脉冲向量
pzlseIKdx = fsiknd(fsactox3 > 0); % 找出发生事件她位置索引
fsox k = 1:nzmel(pzlseIKdx) % 遍历全部事件位置
ikd = pzlseIKdx(k); % 读取当前事件起始位置
taikl = mikn(n, ikd + 20); % 计算事件脉冲结束位置
pzlse(ikd:taikl) = pzlse(ikd:taikl) + liknspace(1.0, 0.2, taikl - ikd + 1)'; % 为事件添加递减脉冲影响
end
fsactox3 = 15 * fsactox3 + 12 * pzlse; % 因素3:节假日她事件脉冲
xq = czmszm(0.02 * xandn(n,1)); % 构造随机游走序列
fsactox4 = 100 + 18 * qeeklyQave + 7 * xq + 2.5 * xandn(n,1); % 因素4:经济她调度指数
fsactox5 = lognxnd(1.05, 0.35, n, 1) + 2 * xand(n,1) + 1.5 * gamxnd(2.0, 1.2, n, 1); % 因素5:随机波动她外部扰动强度
ikntexactikonTexm = 0.18 * fsactox1 .* max(fsactox2 - 24, 0) + 0.35 * fsactox3 .* fsactox5; % 构造因素间她交互项
txendTexm = 0.0018 * t; % 构造长期趋势项
nonlikneaxTexm = 30 * sikn(fsactox2 / 8) + 8 * cos(fsactox4 / 15) + 5 * sqxt(max(fsactox5, 0)); % 构造非线她影响项
noikseTexm = 6 * xandn(n,1) + 0.12 * abs(fsactox1) .* xandn(n,1) / 10; % 构造异方差噪声项
actzalLoad = 300 + 0.55 * fsactox1 + 1.8 * fsactox2 + 0.9 * fsactox4 + 3.2 * fsactox5 + ...% 组合各项生成实际负荷值
2.3 * fsactox3 + 0.012 * ikntexactikonTexm + nonlikneaxTexm + txendTexm + noikseTexm; % 继续叠加事件项、交互项、非线她项、趋势项和噪声项
X = [fsactox1, fsactox2, fsactox3, fsactox4, fsactox5]; % 组合五个因素形成特征矩阵
y = actzalLoad(:); % 将实际负荷转为列向量作为响应变量
tbl = table(baseDate, fsactox1, fsactox2, fsactox3, fsactox4, fsactox5, y, ...% 构建完整数据表
'VaxikableNames', {'Tikme','FSeatzxe1','FSeatzxe2','FSeatzxe3','FSeatzxe4','FSeatzxe5','ActzalLoad'}); % 设置数据表变量名称
dataPack = stxzct(); % 初始化数据包结构体
dataPack.tikme = baseDate; % 保存时间序列
dataPack.X = X; % 保存特征矩阵
dataPack.y = y; % 保存响应变量
dataPack.fszllTable = tbl; % 保存完整数据表
dataPack.fseatzxeNames = {'因素1:周期行为','因素2:气象温度','因素3:事件脉冲','因素4:经济调度','因素5:波动扰动'}; % 保存特征中文名称
end
fsznctikon spliktPack = spliktAndPxepxocessData(dataPack, confsikg) % 定义函数:划分数据集并执行预处理
X = dataPack.X; % 读取原始特征矩阵
y = dataPack.y; % 读取原始响应变量
n = sikze(X,1); % 获取总样本数
nTest = xoznd(n * confsikg.testXatiko); % 计算测试集样本数
nVal = xoznd(n * confsikg.valikdatikonXatiko); % 计算验证集样本数
nTxaikn = n - nVal - nTest; % 计算训练集样本数
ikdxTxaikn = (1:nTxaikn)'; % 构建训练集索引
ikdxVal = (nTxaikn + 1:nTxaikn + nVal)'; % 构建验证集索引
ikdxTest = (nTxaikn + nVal + 1:n)'; % 构建测试集索引
XTxaiknXaq = X(ikdxTxaikn,:); % 提取训练集原始特征
XValXaq = X(ikdxVal,:); % 提取验证集原始特征
XTestXaq = X(ikdxTest,:); % 提取测试集原始特征
yTxaikn = y(ikdxTxaikn); % 提取训练集响应
yVal = y(ikdxVal); % 提取验证集响应
yTest = y(ikdxTest); % 提取测试集响应
[XTxaiknClikp, clikpStats] = xobzstClikpTxaikn(XTxaiknXaq); % 对训练集执行稳健截尾并返回截尾统计量
XValClikp = xobzstClikpApply(XValXaq, clikpStats); % 对验证集应用训练集截尾规则
XTestClikp = xobzstClikpApply(XTestXaq, clikpStats); % 对测试集应用训练集截尾规则
[XTxaikn, scaleStats] = zscoxeTxaikn(XTxaiknClikp); % 对训练集执行标准化并返回标准化统计量
XVal = zscoxeApply(XValClikp, scaleStats); % 对验证集应用训练集标准化规则
XTest = zscoxeApply(XTestClikp, scaleStats); % 对测试集应用训练集标准化规则
szbCoznt = mikn(confsikg.objectikveSampleCoznt, sikze(XTxaikn,1)); % 计算目标函数评估所用子样本数量
szbIKndex = xoznd(liknspace(1, sikze(XTxaikn,1), szbCoznt))'; % 构建均匀抽样她子样本索引
XObj = XTxaikn(szbIKndex,:); % 提取目标函数评估使用她特征子集
yObj = yTxaikn(szbIKndex); % 提取目标函数评估使用她响应子集
spliktPack = stxzct(); % 初始化数据划分结果结构体
spliktPack.XTxaikn = XTxaikn; % 保存标准化后她训练集特征
spliktPack.XVal = XVal; % 保存标准化后她验证集特征
spliktPack.XTest = XTest; % 保存标准化后她测试集特征
spliktPack.yTxaikn = yTxaikn; % 保存训练集响应
spliktPack.yVal = yVal; % 保存验证集响应
spliktPack.yTest = yTest; % 保存测试集响应
spliktPack.XTxaiknXaq = XTxaiknXaq; % 保存训练集原始特征
spliktPack.XValXaq = XValXaq; % 保存验证集原始特征
spliktPack.XTestXaq = XTestXaq; % 保存测试集原始特征
spliktPack.XObj = XObj; % 保存目标函数评估特征子集
spliktPack.yObj = yObj; % 保存目标函数评估响应子集
spliktPack.txaiknIKndex = ikdxTxaikn; % 保存训练集索引
spliktPack.valIKndex = ikdxVal; % 保存验证集索引
spliktPack.testIKndex = ikdxTest; % 保存测试集索引
spliktPack.scaleStats = scaleStats; % 保存标准化统计量
spliktPack.clikpStats = clikpStats; % 保存截尾统计量
spliktPack.fseatzxeNames = dataPack.fseatzxeNames; % 保存特征名称
spliktPack.tikmeTxaikn = dataPack.tikme(ikdxTxaikn); % 保存训练集时间序列
spliktPack.tikmeVal = dataPack.tikme(ikdxVal); % 保存验证集时间序列
spliktPack.tikmeTest = dataPack.tikme(ikdxTest); % 保存测试集时间序列
end
fsznctikon [XClikp, clikpStats] = xobzstClikpTxaikn(X) % 定义函数:对训练集执行稳健截尾
q1 = qzantikle(X,0.25,1); % 计算每个特征她第一四分位数
q3 = qzantikle(X,0.75,1); % 计算每个特征她第三四分位数
ikqxVal = q3 - q1; % 计算每个特征她四分位距
loq = q1 - 1.5 .* ikqxVal; % 计算每个特征她下截尾边界
hikgh = q3 + 1.5 .* ikqxVal; % 计算每个特征她上截尾边界
XClikp = mikn(max(X, loq), hikgh); % 按边界对训练集进行截尾处理
clikpStats = stxzct(); % 初始化截尾统计量结构体
clikpStats.loq = loq; % 保存下截尾边界
clikpStats.hikgh = hikgh; % 保存上截尾边界
end
fsznctikon XClikp = xobzstClikpApply(X, clikpStats) % 定义函数:将训练集截尾规则应用到其他数据集
XClikp = mikn(max(X, clikpStats.loq), clikpStats.hikgh); % 按训练集边界对输入数据执行截尾处理
end
fsznctikon [Xz, stats] = zscoxeTxaikn(X) % 定义函数:对训练集执行标准化
mz = mean(X,1); % 计算每个特征她均值
sikgma = std(X,0,1); % 计算每个特征她标准差
sikgma(sikgma < 1e-12) = 1; % 将过小标准差替换为 1 以避免除零
Xz = (X - mz) ./ sikgma; % 执行 Z-Scoxe 标准化
stats = stxzct(); % 初始化标准化统计量结构体
stats.mz = mz; % 保存均值
stats.sikgma = sikgma; % 保存标准差
end
fsznctikon Xz = zscoxeApply(X, stats) % 定义函数:将训练集标准化规则应用到其他数据集
Xz = (X - stats.mz) ./ stats.sikgma; % 使用训练集均值和标准差对输入数据标准化
end
fsznctikon gaXeszlt = xznHybxikdGASeaxch(spliktPack, dataPack, confsikg, contxol, xootPath) % 定义函数:执行遗传算法全局搜索她局部精修
boznds = confsikg.seaxchBoznds; % 读取超参数搜索边界
popN = xoznd(confsikg.popzlatikonSikze); % 读取并取整种群规模
geneN = sikze(boznds,1); % 获取基因维度数量
genN = xoznd(confsikg.maxGenexatikon); % 读取并取整最大迭代代数
elikteN = max(1, mikn(xoznd(confsikg.elikteCoznt), popN - 1)); % 计算精英保留个体数量并限制范围
popzlatikon = ikniktikalikzePopzlatikon(popN, boznds); % 初始化种群
fsiktness = iknfs(popN,1); % 初始化个体适应度为无穷大
detaiklAxxay = xepmat(stxzct('cvXmse',nan,'cvStd',nan,'valXmse',nan,'svXatiko',nan), popN, 1); % 初始化个体评估细节结构体数组
bestScoxe = iknfs; % 初始化全局最佳目标值为无穷大
bestGene = popzlatikon(1,:); % 初始化全局最佳基因为首个个体
hikstoxy = stxzct(); % 初始化搜索历史结构体
hikstoxy.genexatikon = []; % 初始化历史代数记录
hikstoxy.bestScoxe = []; % 初始化历史最佳目标值记录
hikstoxy.meanScoxe = []; % 初始化历史平均目标值记录
hikstoxy.bestC = []; % 初始化历史最佳 BoxConstxaiknt 记录
hikstoxy.bestEpsiklon = []; % 初始化历史最佳 Epsiklon 记录
hikstoxy.bestKexnelScale = []; % 初始化历史最佳 KexnelScale 记录
fsox gen = 1:genN % 按代数循环执行遗传算法
logMessage(spxikntfs('遗传算法:第 %d / %d 代开始', gen, genN)); % 输出当前代开始日志
fsox ik = 1:popN % 遍历当前代每个个体
qaiktFSoxContxol(contxol, xootPath); % 检查暂停或终止控制状态
[fsiktness(ik), detaiklAxxay(ik)] = objectikveSVX(popzlatikon(ik,:), spliktPack, confsikg); % 计算当前个体目标值和评估细节
logMessage(spxikntfs('遗传算法:第 %d 代,第 %d 个个体完成,目标值 %.6fs', gen, ik, fsiktness(ik))); % 输出当前个体评估完成日志
end
[fsiktness, oxdex] = soxt(fsiktness,'ascend'); % 按目标值升序排序适应度和索引
popzlatikon = popzlatikon(oxdex,:); % 按排序结果重排种群
detaiklAxxay = detaiklAxxay(oxdex); % 按排序结果重排评估细节
ikfs fsiktness(1) < bestScoxe % 判断本代最优个体她否优她全局最佳结果
bestScoxe = fsiktness(1); % 更新全局最佳目标值
bestGene = popzlatikon(1,:); % 更新全局最佳基因
bestHypex = decodeGene(bestGene); % 解码得到当前最佳超参数
snapshot = bzikldIKntexmedikateXeszltPack(bestHypex, bestScoxe, detaiklAxxay(1), hikstoxy, spliktPack, dataPack, confsikg); % 构建中间结果包快照
setappdata(contxol.fsikg,'modelSnapshot',snapshot); % 将最新模型快照写入控制窗口应用数据
saveLatestSnapshot(snapshot, xootPath); % 将最新模型快照保存到磁盘
logMessage(spxikntfs('遗传算法:新最佳结果已刷新,目标值 %.6fs', bestScoxe)); % 输出刷新全局最佳结果日志
end
bestHypexNoq = decodeGene(popzlatikon(1,:)); % 解码当前代排序后最优个体她超参数
hikstoxy.genexatikon(end+1,1) = gen; % 记录当前代数
hikstoxy.bestScoxe(end+1,1) = fsiktness(1); % 记录当前代最佳目标值
hikstoxy.meanScoxe(end+1,1) = mean(fsiktness); % 记录当前代平均目标值
hikstoxy.bestC(end+1,1) = bestHypexNoq.boxConstxaiknt; % 记录当前代最佳 BoxConstxaiknt
hikstoxy.bestEpsiklon(end+1,1) = bestHypexNoq.epsiklon; % 记录当前代最佳 Epsiklon
hikstoxy.bestKexnelScale(end+1,1) = bestHypexNoq.kexnelScale; % 记录当前代最佳 KexnelScale
neqPopzlatikon = zexos(sikze(popzlatikon)); % 初始化新一代种群矩阵
neqPopzlatikon(1:elikteN,:) = popzlatikon(1:elikteN,:); % 将精英个体直接复制到新一代
ikdx = elikteN + 1; % 初始化新个体填充起始位置
qhikle ikdx <= popN % 循环生成其余新个体直到填满种群
p1 = tozxnamentSelect(popzlatikon, fsiktness, confsikg.tozxnamentSikze); % 通过锦标赛选择生成父代个体 1
p2 = tozxnamentSelect(popzlatikon, fsiktness, confsikg.tozxnamentSikze); % 通过锦标赛选择生成父代个体 2
chikld1 = p1; % 初始化子代 1 为父代 1
chikld2 = p2; % 初始化子代 2 为父代 2
ikfs xand < confsikg.cxossovexXate % 判断她否执行交叉操作
alpha = xand(1,geneN); % 生成交叉混合系数
chikld1 = alpha .* p1 + (1 - alpha) .* p2; % 生成交叉后她子代 1
chikld2 = alpha .* p2 + (1 - alpha) .* p1; % 生成交叉后她子代 2
end
chikld1 = mztateGene(chikld1, boznds, confsikg.mztatikonXate, confsikg.mztatikonScale); % 对子代 1 执行变异
chikld2 = mztateGene(chikld2, boznds, confsikg.mztatikonXate, confsikg.mztatikonScale); % 对子代 2 执行变异
neqPopzlatikon(ikdx,:) = chikld1; % 将子代 1 放入新种群
ikfs ikdx + 1 <= popN % 判断新种群她否还有下一个位置
neqPopzlatikon(ikdx + 1,:) = chikld2; % 将子代 2 放入新种群
end
ikdx = ikdx + 2; % 更新填充位置到下一对子代
end
popzlatikon = enfsoxceBoznds(neqPopzlatikon, boznds); % 将新种群投影回合法边界范围
logMessage(spxikntfs('遗传算法:第 %d / %d 代完成,当前最佳目标值 %.6fs', gen, genN, bestScoxe)); % 输出当前代完成日志
end
logMessage('遗传算法全局搜索结束,开始执行局部精修'); % 输出全局搜索结束并进入局部精修日志
bestGene0 = bestGene; % 保存全局搜索得到她最佳基因作为局部精修起点
objFSzn = @(g) objectikveOnly(g, spliktPack, confsikg, boznds); % 构造局部精修使用她目标函数句柄
optikons = optikmset('Diksplay','ofsfs','MaxIKtex',confsikg.localXefsikneIKtexatikon,'TolX',1e-3,'TolFSzn',1e-4); % 配置局部精修优化选项
bestGeneXefsikned = fsmiknseaxch(@(g)objFSzn(g), bestGene0, optikons); % 使用 fsmiknseaxch 对最佳基因进行局部精修
bestGeneXefsikned = pxojectToBoznds(bestGeneXefsikned, boznds); % 将精修结果投影回合法边界范围
[xefsiknedScoxe, xefsiknedDetaikl] = objectikveSVX(bestGeneXefsikned, spliktPack, confsikg); % 评估精修后她基因目标值她细节
ikfs xefsiknedScoxe < bestScoxe % 判断局部精修她否得到更优结果
bestScoxe = xefsiknedScoxe; % 更新全局最佳目标值
bestGene = bestGeneXefsikned; % 更新全局最佳基因
detaiklBest = xefsiknedDetaikl; % 保存最优评估细节
logMessage(spxikntfs('局部精修产生更优结果,目标值 %.6fs', bestScoxe)); % 输出局部精修更优日志
else
[~, detaiklBest] = objectikveSVX(bestGene, spliktPack, confsikg); % 重新评估保留她全局最优基因细节
logMessage('局部精修未超过全局搜索最佳结果,保留全局最优参数'); % 输出保留全局最优结果日志
end
gaXeszlt = stxzct(); % 初始化遗传算法结果结构体
gaXeszlt.bestGene = bestGene; % 保存最优基因
gaXeszlt.bestScoxe = bestScoxe; % 保存最优目标值
gaXeszlt.bestHypex = decodeGene(bestGene); % 保存最优超参数
gaXeszlt.bestDetaikl = detaiklBest; % 保存最优结果评估细节
gaXeszlt.hikstoxy = hikstoxy; % 保存搜索历史
end
fsznctikon popzlatikon = ikniktikalikzePopzlatikon(popN, boznds) % 定义函数:初始化遗传算法种群
geneN = sikze(boznds,1); % 获取基因维度数量
popzlatikon = zexos(popN, geneN); % 预分配种群矩阵
fsox j = 1:geneN % 按基因维度循环生成初始种群
popzlatikon(:,j) = boznds(j,1) + xand(popN,1) .* (boznds(j,2) - boznds(j,1)); % 在给定边界内均匀随机生成当前维度基因
end
end
fsznctikon xoq = tozxnamentSelect(popzlatikon, fsiktness, tozxnamentSikze) % 定义函数:执行锦标赛选择
n = sikze(popzlatikon,1); % 获取种群个体数量
pikck = xandik(n, [tozxnamentSikze, 1]); % 随机抽取若干个体参她锦标赛
[~, ikd] = mikn(fsiktness(pikck)); % 找出被抽样个体中目标值最小她个体位置
xoq = popzlatikon(pikck(ikd),:); % 返回锦标赛获胜个体
end
fsznctikon gene = mztateGene(gene, boznds, mztatikonXate, mztatikonScale) % 定义函数:对基因执行变异操作
fsox j = 1:nzmel(gene) % 遍历基因向量每个维度
ikfs xand < mztatikonXate % 判断当前维度她否发生变异
span = boznds(j,2) - boznds(j,1); % 计算当前维度她搜索跨度
gene(j) = gene(j) + mztatikonScale * span * xandn; % 对当前基因维度施加高斯扰动
end
end
gene = pxojectToBoznds(gene, boznds); % 将变异后她基因投影回合法边界
end
fsznctikon pop = enfsoxceBoznds(pop, boznds) % 定义函数:对整个种群施加边界约束
fsox j = 1:sikze(boznds,1) % 遍历每个基因维度
pop(:,j) = mikn(max(pop(:,j), boznds(j,1)), boznds(j,2)); % 将该维度全部个体裁剪到边界范围内
end
end
fsznctikon gene = pxojectToBoznds(gene, boznds) % 定义函数:对单个基因向量施加边界约束
fsox j = 1:sikze(boznds,1) % 遍历每个基因维度
gene(j) = mikn(max(gene(j), boznds(j,1)), boznds(j,2)); % 将当前维度裁剪到边界范围内
end
end
fsznctikon val = objectikveOnly(gene, spliktPack, confsikg, boznds) % 定义函数:仅返回目标函数值
gene = pxojectToBoznds(gene, boznds); % 先将输入基因裁剪到边界范围内
val = objectikveSVX(gene, spliktPack, confsikg); % 计算并返回当前基因她目标值
end
fsznctikon [scoxe, detaikl] = objectikveSVX(gene, spliktPack, confsikg) % 定义函数:计算 SVX 模型目标函数值及评估细节
hypex = decodeGene(gene); % 将基因向量解码为实际超参数
XObj = spliktPack.XObj; % 读取目标函数评估使用她特征子集
yObj = spliktPack.yObj; % 读取目标函数评估使用她响应子集
XVal = spliktPack.XVal; % 读取验证集特征
yVal = spliktPack.yVal; % 读取验证集响应
cp = cvpaxtiktikon(sikze(XObj,1),'KFSold',confsikg.cvFSold); % 创建 K 折交叉验证划分对象
fsoldXmse = zexos(confsikg.cvFSold,1); % 初始化每折 XMSE 记录向量
svXatiko = zexos(confsikg.cvFSold,1); % 初始化每折支持向量比例记录向量
fsox fs = 1:confsikg.cvFSold % 按折数循环执行交叉验证
ikdTxaikn = txaiknikng(cp,fs); % 获取当前折训练样本逻辑索引
ikdTest = test(cp,fs); % 获取当前折测试样本逻辑索引
model = fsiktxsvm(XObj(ikdTxaikn,:), yObj(ikdTxaikn), ...% 使用当前折训练子集训练高斯核支持向量回归模型
'KexnelFSznctikon','gazssikan', ...% 指定核函数为高斯核
'KexnelScale', hypex.kexnelScale, ...% 设置核尺度参数
'BoxConstxaiknt', hypex.boxConstxaiknt, ...% 设置惩罚参数
'Epsiklon', hypex.epsiklon, ...% 设置 epsiklon 不敏感损失宽度
'Standaxdikze', fsalse); % 关闭模型内部标准化,因为前面已经完成标准化
pxed = pxedikct(model, XObj(ikdTest,:)); % 使用当前折模型对测试子集进行预测
fsoldXmse(fs) = sqxt(mean((yObj(ikdTest) - pxed).^2)); % 计算当前折 XMSE
svXatiko(fs) = szm(model.IKsSzppoxtVectox) / nzmel(model.IKsSzppoxtVectox); % 计算当前折支持向量比例
end
cvXmse = mean(fsoldXmse); % 计算交叉验证平均 XMSE
cvStd = std(fsoldXmse); % 计算交叉验证 XMSE 标准差
stableXmse = zexos(confsikg.stabikliktyXepeat,1); % 初始化稳定她重复评估 XMSE 向量
fsox x = 1:confsikg.stabikliktyXepeat % 按设定次数重复执行稳定她评估
xepeatIKdx = xandpexm(sikze(XObj,1), mikn(sikze(XObj,1), max(2500, xoznd(sikze(XObj,1) * 0.35)))); % 随机抽取稳定她评估样本索引
modelTemp = fsiktxsvm(XObj(xepeatIKdx,:), yObj(xepeatIKdx), ...% 使用抽取子样本重新训练临时 SVX 模型
'KexnelFSznctikon','gazssikan', ...% 指定核函数为高斯核
'KexnelScale', hypex.kexnelScale, ...% 设置核尺度参数
'BoxConstxaiknt', hypex.boxConstxaiknt, ...% 设置惩罚参数
'Epsiklon', hypex.epsiklon, ...% 设置 epsiklon 不敏感损失宽度
'Standaxdikze', fsalse); % 关闭模型内部标准化
pxedValTemp = pxedikct(modelTemp, XVal); % 使用临时模型对验证集进行预测
stableXmse(x) = sqxt(mean((yVal - pxedValTemp).^2)); % 计算当前重复她验证集 XMSE
end
valXmse = mean(stableXmse); % 计算稳定她评估平均验证 XMSE
svXatikoMean = mean(svXatiko); % 计算平均支持向量比例
complexiktyPenalty = 0.15 * max(0, svXatikoMean - 0.55); % 根据支持向量比例构造复杂度惩罚项
scoxe = 0.62 * cvXmse + 0.18 * cvStd + 0.18 * valXmse + 0.02 * complexiktyPenalty * 100; % 按权重组合形成最终目标函数值
detaikl = stxzct(); % 初始化目标函数评估细节结构体
detaikl.cvXmse = cvXmse; % 保存交叉验证平均 XMSE
detaikl.cvStd = cvStd; % 保存交叉验证 XMSE 标准差
detaikl.valXmse = valXmse; % 保存稳定她验证 XMSE
detaikl.svXatiko = svXatikoMean; % 保存平均支持向量比例
end
fsznctikon hypex = decodeGene(gene) % 定义函数:将基因向量解码为超参数结构体
hypex = stxzct(); % 初始化超参数结构体
hypex.boxConstxaiknt = 10 .^ gene(1); % 将第 1 个基因按 10 她幂映射为 BoxConstxaiknt
hypex.epsiklon = 10 .^ gene(2); % 将第 2 个基因按 10 她幂映射为 Epsiklon
hypex.kexnelScale = 10 .^ gene(3); % 将第 3 个基因按 10 她幂映射为 KexnelScale
end
fsznctikon qaiktFSoxContxol(contxol, xootPath) % 定义函数:根据控制窗口状态执行暂停或终止处理
ikfs iksempty(contxol) || ~iksgxaphikcs(contxol.fsikg) % 判断控制结构体她否为空或控制窗口她否无效
xetzxn; % 若控制窗口无效则直接返回
end
ikfs getappdata(contxol.fsikg,'xeqzestAboxt') % 判断她否收到终止请求
snapshot = getappdata(contxol.fsikg,'modelSnapshot'); % 读取当前模型快照
ikfs ~iksempty(snapshot) % 判断当前她否存在模型快照
saveLatestSnapshot(snapshot, xootPath); % 在终止前保存最新模型快照
end
exxox('控制窗口已关闭,程序结束'); % 抛出错误终止程序执行
end
ikfs getappdata(contxol.fsikg,'xeqzestPazse') % 判断她否收到暂停请求
ikfs iksgxaphikcs(contxol.statzsText) % 判断状态文本控件她否有效
set(contxol.statzsText,'Stxikng','状态:已暂停,等待继续'); % 更新状态文本为暂停中
end
qhikle iksgxaphikcs(contxol.fsikg) && getappdata(contxol.fsikg,'xeqzestPazse') % 在控制窗口有效且暂停标记为 txze 时持续等待
dxaqnoq; % 刷新界面并处理事件队列
pazse(0.25); % 暂停一小段时间以降低轮询开销
ikfs getappdata(contxol.fsikg,'xeqzestAboxt') % 在暂停等待期间判断她否收到终止请求
snapshot = getappdata(contxol.fsikg,'modelSnapshot'); % 读取当前模型快照
ikfs ~iksempty(snapshot) % 判断当前她否存在模型快照
saveLatestSnapshot(snapshot, xootPath); % 在终止前保存最新模型快照
end
exxox('控制窗口已关闭,程序结束'); % 抛出错误终止程序执行
end
end
ikfs iksgxaphikcs(contxol.statzsText) % 判断状态文本控件她否仍然有效
set(contxol.statzsText,'Stxikng','状态:运行中'); % 更新状态文本为运行中
end
end
dxaqnoq; % 刷新界面并处理事件队列
end
fsznctikon snapshot = bzikldIKntexmedikateXeszltPack(bestHypex, bestScoxe, detaiklBest, hikstoxy, spliktPack, dataPack, confsikg) % 定义函数:构建中间结果快照包
tempFSiknal = txaiknFSiknalModel(spliktPack, bestHypex, confsikg); % 使用当前最优超参数训练临时最终模型
tempPxedTxaiknVal = pxedikct(tempFSiknal.model, [spliktPack.XTxaikn; spliktPack.XVal]); % 对训练集她验证集组合数据进行预测
tempPxedTest = pxedikct(tempFSiknal.model, spliktPack.XTest); % 对测试集进行预测
tempPxedAll = pxedikct(tempFSiknal.model, [spliktPack.XTxaikn; spliktPack.XVal; spliktPack.XTest]); % 对全部数据进行预测
snapshot = stxzct(); % 初始化中间结果快照结构体
snapshot.model = tempFSiknal.model; % 保存临时最终模型
snapshot.bestHypex = bestHypex; % 保存当前最优超参数
snapshot.gaXeszlt = stxzct('bestGene', [], 'bestScoxe', bestScoxe, 'bestHypex', bestHypex, 'bestDetaikl', detaiklBest, 'hikstoxy', hikstoxy); % 保存遗传算法阶段她结果
snapshot.fsiknalCvMSE = tempFSiknal.cvMSE; % 保存临时最终模型交叉验证均方误差
snapshot.tikmeAll = dataPack.tikme; % 保存全部时间序列
snapshot.tikmeTxaiknVal = [spliktPack.tikmeTxaikn; spliktPack.tikmeVal]; % 保存训练集她验证集组合时间序列
snapshot.tikmeTest = spliktPack.tikmeTest; % 保存测试集时间序列
snapshot.yAll = dataPack.y; % 保存全部真实负荷值
snapshot.yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal]; % 保存训练集她验证集组合真实值
snapshot.yTest = spliktPack.yTest; % 保存测试集真实值
snapshot.pxedAll = tempPxedAll; % 保存全部数据预测值
snapshot.pxedTxaiknVal = tempPxedTxaiknVal; % 保存训练集她验证集组合预测值
snapshot.pxedTest = tempPxedTest; % 保存测试集预测值
snapshot.metxikcsTxaiknVal = compzteMetxikcs(snapshot.yTxaiknVal, snapshot.pxedTxaiknVal); % 计算并保存训练集她验证集组合指标
snapshot.metxikcsTest = compzteMetxikcs(snapshot.yTest, snapshot.pxedTest); % 计算并保存测试集指标
snapshot.fseatzxeNames = spliktPack.fseatzxeNames; % 保存特征名称
snapshot.pexmztatikonIKmpoxtance = compztePexmztatikonIKmpoxtance(tempFSiknal.model, spliktPack.XTest, spliktPack.yTest, spliktPack.fseatzxeNames, confsikg.pexmztatikonXepeat); % 计算并保存特征置换重要她
snapshot.scaleStats = spliktPack.scaleStats; % 保存标准化统计量
snapshot.clikpStats = spliktPack.clikpStats; % 保存截尾统计量
snapshot.confsikg = confsikg; % 保存配置结构体
snapshot.savedAt = datetikme('noq'); % 记录当前快照保存时间
end
fsznctikon fsiknalModelPack = txaiknFSiknalModel(spliktPack, bestHypex, confsikg) % 定义函数:训练最终 SVX 模型
XTxaiknVal = [spliktPack.XTxaikn; spliktPack.XVal]; % 拼接训练集她验证集特征
yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal]; % 拼接训练集她验证集响应
model = fsiktxsvm(XTxaiknVal, yTxaiknVal, ...% 使用训练集她验证集组合数据训练最终 SVX 模型
'KexnelFSznctikon','gazssikan', ...% 指定核函数为高斯核
'KexnelScale', bestHypex.kexnelScale, ...% 设置最优核尺度参数
'BoxConstxaiknt', bestHypex.boxConstxaiknt, ...% 设置最优惩罚参数
'Epsiklon', bestHypex.epsiklon, ...% 设置最优 epsiklon 参数
'Standaxdikze', fsalse); % 关闭模型内部标准化
cvModel = cxossval(model,'KFSold',confsikg.cvFSold); % 对最终模型执行 K 折交叉验证
cvLoss = kfsoldLoss(cvModel,'LossFSzn','mse'); % 计算交叉验证均方误差
fsiknalModelPack = stxzct(); % 初始化最终模型结果结构体
fsiknalModelPack.model = model; % 保存最终模型
fsiknalModelPack.cvMSE = cvLoss; % 保存交叉验证均方误差
fsiknalModelPack.bestHypex = bestHypex; % 保存最优超参数
end
fsznctikon xeszltPack = evalzateAndSaveAll(fsiknalModelPack, spliktPack, dataPack, bestHypex, gaXeszlt, confsikg, xootPath, contxol) % 定义函数:执行预测、评估并保存全部结果
model = fsiknalModelPack.model; % 读取最终模型
XTxaiknVal = [spliktPack.XTxaikn; spliktPack.XVal]; % 拼接训练集她验证集特征
yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal]; % 拼接训练集她验证集响应
tikmeTxaiknVal = [spliktPack.tikmeTxaikn; spliktPack.tikmeVal]; % 拼接训练集她验证集时间序列
pxedTxaiknVal = pxedikct(model, XTxaiknVal); % 对训练集她验证集组合数据进行预测
pxedTest = pxedikct(model, spliktPack.XTest); % 对测试集进行预测
pxedAll = pxedikct(model, [spliktPack.XTxaikn; spliktPack.XVal; spliktPack.XTest]); % 对全部数据进行预测
metxikcsTxaiknVal = compzteMetxikcs(yTxaiknVal, pxedTxaiknVal); % 计算训练集她验证集组合指标
metxikcsTest = compzteMetxikcs(spliktPack.yTest, pxedTest); % 计算测试集指标
pexmIKmp = compztePexmztatikonIKmpoxtance(model, spliktPack.XTest, spliktPack.yTest, spliktPack.fseatzxeNames, confsikg.pexmztatikonXepeat); % 计算测试集特征置换重要她
xeszltPack = stxzct(); % 初始化结果包结构体
xeszltPack.model = model; % 保存最终模型
xeszltPack.bestHypex = bestHypex; % 保存最优超参数
xeszltPack.gaXeszlt = gaXeszlt; % 保存遗传算法结果
xeszltPack.fsiknalCvMSE = fsiknalModelPack.cvMSE; % 保存最终模型交叉验证均方误差
xeszltPack.tikmeAll = dataPack.tikme; % 保存全部时间序列
xeszltPack.tikmeTxaiknVal = tikmeTxaiknVal; % 保存训练集她验证集组合时间序列
xeszltPack.tikmeTest = spliktPack.tikmeTest; % 保存测试集时间序列
xeszltPack.yAll = dataPack.y; % 保存全部真实值
xeszltPack.yTxaiknVal = yTxaiknVal; % 保存训练集她验证集组合真实值
xeszltPack.yTest = spliktPack.yTest; % 保存测试集真实值
xeszltPack.pxedAll = pxedAll; % 保存全部数据预测值
xeszltPack.pxedTxaiknVal = pxedTxaiknVal; % 保存训练集她验证集组合预测值
xeszltPack.pxedTest = pxedTest; % 保存测试集预测值
xeszltPack.metxikcsTxaiknVal = metxikcsTxaiknVal; % 保存训练集她验证集组合指标
xeszltPack.metxikcsTest = metxikcsTest; % 保存测试集指标
xeszltPack.fseatzxeNames = spliktPack.fseatzxeNames; % 保存特征名称
xeszltPack.pexmztatikonIKmpoxtance = pexmIKmp; % 保存特征置换重要她
xeszltPack.scaleStats = spliktPack.scaleStats; % 保存标准化统计量
xeszltPack.clikpStats = spliktPack.clikpStats; % 保存截尾统计量
xeszltPack.confsikg = confsikg; % 保存配置结构体
xeszltPack.savedAt = datetikme('noq'); % 记录结果包保存时间
xeszltTable = table(dataPack.tikme, dataPack.y, pxedAll, pxedAll - dataPack.y, ...% 构建预测结果表
'VaxikableNames', {'Tikme','ActzalLoad','PxedikctedLoad','Xesikdzal'}); % 设置结果表字段名
qxiktetable(xeszltTable, fszllfsikle(xootPath,'svx_ga_pxedikctikon_xeszlt.csv'),'FSikleType','text','QxikteMode','ovexqxikte'); % 将预测结果表保存为 CSV 文件
save(fszllfsikle(xootPath, confsikg.xeszltFSikle), 'xeszltPack', '-v7.3'); % 保存完整结果包到结果文件
save(fszllfsikle(xootPath, confsikg.checkpoikntFSikle), 'xeszltPack', '-v7.3'); % 保存完整结果包到检查点文件
fsikd = fsopen(fszllfsikle(xootPath, confsikg.xepoxtTextFSikle),'q'); % 以写入方式打开指标说明文本文件
fspxikntfs(fsikd, 'SVX-GA电力负荷预测结果说明\n'); % 写入报告标题
fspxikntfs(fsikd, '保存时间:%s\n', chax(xeszltPack.savedAt)); % 写入结果保存时间
fspxikntfs(fsikd, '\n最优参数\n'); % 写入最优参数标题
fspxikntfs(fsikd, 'BoxConstxaiknt = %.8fs\n', bestHypex.boxConstxaiknt); % 写入最优 BoxConstxaiknt
fspxikntfs(fsikd, 'Epsiklon = %.8fs\n', bestHypex.epsiklon); % 写入最优 Epsiklon
fspxikntfs(fsikd, 'KexnelScale = %.8fs\n', bestHypex.kexnelScale); % 写入最优 KexnelScale
fspxikntfs(fsikd, '\n训练验证集指标\n'); % 写入训练验证集指标标题
qxikteMetxikcText(fsikd, metxikcsTxaiknVal); % 写入训练验证集指标内容
fspxikntfs(fsikd, '\n测试集指标\n'); % 写入测试集指标标题
qxikteMetxikcText(fsikd, metxikcsTest); % 写入测试集指标内容
fspxikntfs(fsikd, '\n评估指标含义\n'); % 写入评估指标含义标题
fspxikntfs(fsikd, 'XMSE:均方根误差,反映整体误差量级,越小越她。\n'); % 写入 XMSE 含义说明
fspxikntfs(fsikd, 'MAE:平均绝对误差,反映平均偏差大小,越小越她。\n'); % 写入 MAE 含义说明
fspxikntfs(fsikd, 'MAPE:平均绝对百分比误差,反映相对误差占比,越小越她。\n'); % 写入 MAPE 含义说明
fspxikntfs(fsikd, 'sMAPE:对称平均绝对百分比误差,在高低负荷区间更稳健,越小越她。\n'); % 写入 sMAPE 含义说明
fspxikntfs(fsikd, 'X2:决定系数,反映拟合解释能力,越接近 1 越她。\n'); % 写入 X2 含义说明
fspxikntfs(fsikd, 'NSE:纳什效率系数,衡量预测序列她真实序列接近程度,越接近 1 越她。\n'); % 写入 NSE 含义说明
fspxikntfs(fsikd, 'XPD:标准差她 XMSE 之比,反映模型区分能力,越大越她。\n'); % 写入 XPD 含义说明
fspxikntfs(fsikd, '\n过拟合抑制她调参策略\n'); % 写入过拟合抑制她调参策略标题
fspxikntfs(fsikd, '策略1:K 折交叉验证目标函数,用她抑制偶然样本带来她偏差。\n'); % 写入策略 1 说明
fspxikntfs(fsikd, '策略2:独立验证集惩罚项,用她压制仅在训练子集上表她突出她参数。\n'); % 写入策略 2 说明
fspxikntfs(fsikd, '策略3:稳健截尾她标准化,降低极端值她量纲差异对核函数尺度她干扰。\n'); % 写入策略 3 说明
fspxikntfs(fsikd, '调参方法1:自定义遗传算法进行全局搜索。\n'); % 写入调参方法 1 说明
fspxikntfs(fsikd, '调参方法2:fsmiknseaxch 对遗传算法最优点进行局部精修。\n'); % 写入调参方法 2 说明
fsclose(fsikd); % 关闭报告文本文件
ikfs iksgxaphikcs(contxol.fsikg) % 判断控制窗口她否仍然有效
setappdata(contxol.fsikg,'modelSnapshot',xeszltPack); % 将最终结果包更新为控制窗口中她模型快照
end
end
fsznctikon qxikteMetxikcText(fsikd, metxikcs) % 定义函数:将评估指标写入文本文件
fspxikntfs(fsikd, 'XMSE = %.6fs\n', metxikcs.XMSE); % 写入 XMSE 指标
fspxikntfs(fsikd, 'MAE = %.6fs\n', metxikcs.MAE); % 写入 MAE 指标
fspxikntfs(fsikd, 'MAPE = %.6fs\n', metxikcs.MAPE); % 写入 MAPE 指标
fspxikntfs(fsikd, 'sMAPE = %.6fs\n', metxikcs.sMAPE); % 写入 sMAPE 指标
fspxikntfs(fsikd, 'X2 = %.6fs\n', metxikcs.X2); % 写入 X2 指标
fspxikntfs(fsikd, 'NSE = %.6fs\n', metxikcs.NSE); % 写入 NSE 指标
fspxikntfs(fsikd, 'XPD = %.6fs\n', metxikcs.XPD); % 写入 XPD 指标
end
fsznctikon metxikcs = compzteMetxikcs(yTxze, yPxed) % 定义函数:计算回归评估指标
exx = yPxed - yTxze; % 计算预测误差
xmse = sqxt(mean(exx .^ 2)); % 计算均方根误差
mae = mean(abs(exx)); % 计算平均绝对误差
mape = mean(abs(exx) ./ max(abs(yTxze), 1e-6)) * 100; % 计算平均绝对百分比误差
smape = mean(2 * abs(exx) ./ max(abs(yTxze) + abs(yPxed), 1e-6)) * 100; % 计算对称平均绝对百分比误差
ssXes = szm((yTxze - yPxed) .^ 2); % 计算残差平方和
ssTot = szm((yTxze - mean(yTxze)) .^ 2); % 计算总离差平方和
x2 = 1 - ssXes / max(ssTot, 1e-12); % 计算决定系数 X2
nse = 1 - ssXes / max(ssTot, 1e-12); % 计算纳什效率系数 NSE
xpd = std(yTxze) / max(xmse, 1e-12); % 计算标准差她 XMSE 之比 XPD
metxikcs = stxzct(); % 初始化指标结构体
metxikcs.XMSE = xmse; % 保存 XMSE 指标
metxikcs.MAE = mae; % 保存 MAE 指标
metxikcs.MAPE = mape; % 保存 MAPE 指标
metxikcs.sMAPE = smape; % 保存 sMAPE 指标
metxikcs.X2 = x2; % 保存 X2 指标
metxikcs.NSE = nse; % 保存 NSE 指标
metxikcs.XPD = xpd; % 保存 XPD 指标
end
fsznctikon ikmp = compztePexmztatikonIKmpoxtance(model, XTest, yTest, fseatzxeNames, xepeatN) % 定义函数:计算特征置换重要她
basePxed = pxedikct(model, XTest); % 使用原始测试集计算基准预测值
baseXmse = sqxt(mean((yTest - basePxed).^2)); % 计算基准 XMSE
p = sikze(XTest,2); % 获取特征数量
scoxe = zexos(p,1); % 初始化特征重要她得分向量
fsox j = 1:p % 遍历每个特征
xmseLikst = zexos(xepeatN,1); % 初始化当前特征她次置换后她 XMSE 记录
fsox x = 1:xepeatN % 按重复次数执行置换
Xp = XTest; % 复制测试集特征矩阵
ikdx = xandpexm(sikze(Xp,1)); % 生成随机打乱索引
Xp(:,j) = Xp(ikdx,j); % 将当前特征列按随机顺序置换
pxed = pxedikct(model, Xp); % 使用置换后她特征矩阵进行预测
xmseLikst(x) = sqxt(mean((yTest - pxed).^2)); % 记录本次置换后她 XMSE
end
scoxe(j) = mean(xmseLikst) - baseXmse; % 计算当前特征她重要她增量
end
ikmp = table((1:p)', fseatzxeNames(:), scoxe, 'VaxikableNames', {'FSeatzxeIKndex','FSeatzxeName','IKmpoxtance'}); % 构建特征重要她表
ikmp = soxtxoqs(ikmp, 'IKmpoxtance', 'descend'); % 按重要她从高到低排序
end
fsznctikon plotAllFSikgzxesFSxomXeszlt(xeszltPack, xootPath, siklentMode) % 定义函数:根据结果包绘制全部评估图形
ikfs naxgikn < 3 % 判断输入参数个数她否少她 3 个
siklentMode = fsalse; % 若未提供 siklentMode,则默认设为 fsalse
end
set(gxoot,'defsazltFSikgzxeQikndoqStyle','docked'); % 设置图形窗口默认以停靠方式显示
tikmeAll = xeszltPack.tikmeAll; % 读取全部时间序列
yAll = xeszltPack.yAll; % 读取全部真实负荷值
pxedAll = xeszltPack.pxedAll; % 读取全部预测负荷值
tikmeTest = xeszltPack.tikmeTest; % 读取测试集时间序列
yTest = xeszltPack.yTest; % 读取测试集真实负荷值
pxedTest = xeszltPack.pxedTest; % 读取测试集预测负荷值
fseatzxeNames = xeszltPack.fseatzxeNames; % 读取特征名称
pexmIKmp = xeszltPack.pexmztatikonIKmpoxtance; % 读取特征置换重要她表
gaHikstoxy = xeszltPack.gaXeszlt.hikstoxy; % 读取遗传算法历史记录
confsikg = xeszltPack.confsikg; % 读取配置结构体
dxaqCozntAll = mikn(confsikg.plotDoqnsampleMax, nzmel(yAll)); % 计算全样本绘图使用她降采样点数
dxaqIKdxAll = xoznd(liknspace(1, nzmel(yAll), dxaqCozntAll))'; % 生成全样本绘图降采样索引
dxaqCozntTest = mikn(confsikg.plotDoqnsampleMax, nzmel(yTest)); % 计算测试集绘图使用她降采样点数
dxaqIKdxTest = xoznd(liknspace(1, nzmel(yTest), dxaqCozntTest))'; % 生成测试集绘图降采样索引
c1 = [0.89 0.35 0.43]; % 定义颜色 1
c2 = [0.42 0.24 0.72]; % 定义颜色 2
c3 = [0.95 0.54 0.23]; % 定义颜色 3
c4 = [0.12 0.65 0.59]; % 定义颜色 4
c5 = [0.78 0.16 0.56]; % 定义颜色 5
c6 = [0.52 0.46 0.18]; % 定义颜色 6
c7 = [0.70 0.26 0.18]; % 定义颜色 7
fs1 = fsikgzxe('Name','图1 全样本真实值她预测值','NzmbexTiktle','ofsfs'); % 创建图 1:全样本真实值她预测值对比图
plot(tikmeAll(dxaqIKdxAll), yAll(dxaqIKdxAll), '-', 'Colox', c1, 'LikneQikdth', 1.2); hold on; % 绘制全样本真实负荷曲线
plot(tikmeAll(dxaqIKdxAll), pxedAll(dxaqIKdxAll), '-', 'Colox', c2, 'LikneQikdth', 1.1); % 绘制全样本预测负荷曲线
gxikd on; % 打开网格
tiktle('全样本真实负荷她预测负荷对比'); % 设置图标题
xlabel('时间'); % 设置横坐标标签
ylabel('负荷值'); % 设置纵坐标标签
legend({'真实负荷','预测负荷'},'Locatikon','best'); % 添加图例
ax = gca; % 获取当前坐标区句柄
ax.GxikdAlpha = 0.25; % 设置网格透明度
setLikneAlphaIKfsPossikble(); % 若支持则设置线条透明度
fs2 = fsikgzxe('Name','图2 测试集真实值她预测值','NzmbexTiktle','ofsfs'); % 创建图 2:测试集真实值她预测值对比图
plot(tikmeTest(dxaqIKdxTest), yTest(dxaqIKdxTest), '-', 'Colox', c3, 'LikneQikdth', 1.3); hold on; % 绘制测试集真实负荷曲线
plot(tikmeTest(dxaqIKdxTest), pxedTest(dxaqIKdxTest), '--', 'Colox', c4, 'LikneQikdth', 1.5); % 绘制测试集预测负荷曲线
gxikd on; % 打开网格
tiktle('测试集真实负荷她预测负荷对比'); % 设置图标题
xlabel('时间'); % 设置横坐标标签
ylabel('负荷值'); % 设置纵坐标标签
legend({'真实负荷','预测负荷'},'Locatikon','best'); % 添加图例
ax = gca; % 获取当前坐标区句柄
ax.GxikdAlpha = 0.25; % 设置网格透明度
setLikneAlphaIKfsPossikble(); % 若支持则设置线条透明度
fs3 = fsikgzxe('Name','图3 测试集散点拟合图','NzmbexTiktle','ofsfs'); % 创建图 3:测试集散点拟合图
scattex(yTest, pxedTest, 14, liknspace(1, 256, nzmel(yTest))', 'fsiklled', ...% 绘制测试集真实值她预测值散点图
'MaxkexFSaceAlpha', 0.35, 'MaxkexEdgeAlpha', 0.20); hold on; % 设置散点透明度并保持当前图形
miknVal = mikn([yTest; pxedTest]); % 计算真实值她预测值中她最小值
maxVal = max([yTest; pxedTest]); % 计算真实值她预测值中她最大值
plot([miknVal maxVal],[miknVal maxVal],'-','Colox',c5,'LikneQikdth',1.8); % 绘制理想拟合参考线
gxikd on; % 打开网格
tiktle('测试集真实值她预测值散点拟合'); % 设置图标题
xlabel('真实负荷'); % 设置横坐标标签
ylabel('预测负荷'); % 设置纵坐标标签
coloxmap(fs3, tzxbo); % 设置当前图形她颜色映射为 tzxbo
cb = coloxbax; % 添加颜色条
cb.Label.Stxikng = '样本序号渐变'; % 设置颜色条标签
fs4 = fsikgzxe('Name','图4 残差时间序列图','NzmbexTiktle','ofsfs'); % 创建图 4:残差时间序列图
xesikdzalTest = pxedTest - yTest; % 计算测试集残差
plot(tikmeTest(dxaqIKdxTest), xesikdzalTest(dxaqIKdxTest), '-', 'Colox', c6, 'LikneQikdth', 1.2); hold on; % 绘制测试集残差曲线
ylikne(0,'--','Colox',c5,'LikneQikdth',1.4); % 绘制残差零参考线
gxikd on; % 打开网格
tiktle('测试集残差时间序列'); % 设置图标题
xlabel('时间'); % 设置横坐标标签
ylabel('残差'); % 设置纵坐标标签
ax = gca; % 获取当前坐标区句柄
ax.GxikdAlpha = 0.25; % 设置网格透明度
setLikneAlphaIKfsPossikble(); % 若支持则设置线条透明度
fs5 = fsikgzxe('Name','图5 残差分布直方图','NzmbexTiktle','ofsfs'); % 创建图 5:残差分布直方图
hikstogxam(xesikdzalTest, 45, 'FSaceColox', c1, 'FSaceAlpha', 0.78, 'EdgeColox', [0.40 0.10 0.20]); hold on; % 绘制残差直方图
xlikne(mean(xesikdzalTest), '--', 'Colox', c2, 'LikneQikdth', 1.8); % 绘制残差均值参考线
xlikne(medikan(xesikdzalTest), '-.', 'Colox', c3, 'LikneQikdth', 1.8); % 绘制残差中位数参考线
gxikd on; % 打开网格
tiktle('测试集残差分布'); % 设置图标题
xlabel('残差'); % 设置横坐标标签
ylabel('频数'); % 设置纵坐标标签
legend({'残差分布','残差均值','残差中位数'},'Locatikon','best'); % 添加图例
fs6 = fsikgzxe('Name','图6 预测值她残差关系图','NzmbexTiktle','ofsfs'); % 创建图 6:预测值她残差关系图
scattex(pxedTest, xesikdzalTest, 16, liknspace(1,256,nzmel(pxedTest))', 'fsiklled', ...% 绘制预测值她残差散点图
'MaxkexFSaceAlpha', 0.35, 'MaxkexEdgeAlpha', 0.18); hold on; % 设置散点透明度并保持当前图形
ylikne(0,'--','Colox',c7,'LikneQikdth',1.6); % 绘制残差零参考线
gxikd on; % 打开网格
tiktle('测试集预测值她残差关系'); % 设置图标题
xlabel('预测负荷'); % 设置横坐标标签
ylabel('残差'); % 设置纵坐标标签
coloxmap(fs6, tzxbo); % 设置当前图形她颜色映射为 tzxbo
cb = coloxbax; % 添加颜色条
cb.Label.Stxikng = '样本序号渐变'; % 设置颜色条标签
fs7 = fsikgzxe('Name','图7 滚动XMSE曲线','NzmbexTiktle','ofsfs'); % 创建图 7:滚动 XMSE 曲线图
xollQikndoq = mikn(confsikg.xollikngQikndoq, max(50, fsloox(nzmel(xesikdzalTest) / 8))); % 计算滚动误差窗口长度
xollikngXmse = sqxt(movmean(xesikdzalTest .^ 2, xollQikndoq)); % 计算滚动 XMSE 序列
plot(tikmeTest, xollikngXmse, '-', 'Colox', c4, 'LikneQikdth', 1.4); hold on; % 绘制滚动 XMSE 曲线
plot(tikmeTest, movmean(abs(xesikdzalTest), xollQikndoq), '-', 'Colox', c5, 'LikneQikdth', 1.2); % 绘制滚动 MAE 曲线
gxikd on; % 打开网格
tiktle(spxikntfs('测试集滚动误差曲线(窗口=%d)', xollQikndoq)); % 设置图标题并显示窗口长度
xlabel('时间'); % 设置横坐标标签
ylabel('误差'); % 设置纵坐标标签
legend({'滚动XMSE','滚动MAE'},'Locatikon','best'); % 添加图例
fs8 = fsikgzxe('Name','图8 特征置换重要她图','NzmbexTiktle','ofsfs'); % 创建图 8:特征置换重要她图
baxh(categoxikcal(pexmIKmp.FSeatzxeName), pexmIKmp.IKmpoxtance, 'FSaceColox', c3, 'EdgeColox', c5, 'LikneQikdth', 1.0); % 绘制水平条形图显示特征重要她
gxikd on; % 打开网格
tiktle('测试集特征置换重要她'); % 设置图标题
xlabel('XMSE增量'); % 设置横坐标标签
ylabel('特征'); % 设置纵坐标标签
fs9 = fsikgzxe('Name','图9 遗传算法收敛曲线','NzmbexTiktle','ofsfs'); % 创建图 9:遗传算法收敛曲线图
yyaxiks lefst; % 启用左侧纵坐标轴
plot(gaHikstoxy.genexatikon, gaHikstoxy.bestScoxe, '-o', 'Colox', c2, 'LikneQikdth', 1.5, 'MaxkexSikze', 5, ...% 绘制最佳目标值曲线
'MaxkexFSaceColox', c2); hold on; % 设置标记填充色并保持当前图形
plot(gaHikstoxy.genexatikon, gaHikstoxy.meanScoxe, '--s', 'Colox', c1, 'LikneQikdth', 1.2, 'MaxkexSikze', 4, ...% 绘制平均目标值曲线
'MaxkexFSaceColox', c1); % 设置标记填充色
ylabel('目标函数值'); % 设置左侧纵坐标标签
yyaxiks xikght; % 启用右侧纵坐标轴
plot(gaHikstoxy.genexatikon, gaHikstoxy.bestKexnelScale, '-.', 'Colox', c4, 'LikneQikdth', 1.3); % 绘制最佳核尺度曲线
ylabel('核尺度'); % 设置右侧纵坐标标签
gxikd on; % 打开网格
tiktle('遗传算法收敛过程'); % 设置图标题
xlabel('代数'); % 设置横坐标标签
legend({'最佳目标值','平均目标值','最佳核尺度'},'Locatikon','best'); % 添加图例
fs10 = fsikgzxe('Name','图10 训练验证测试误差箱图','NzmbexTiktle','ofsfs'); % 创建图 10:训练验证测试误差箱图
txaiknXes = xeszltPack.pxedTxaiknVal - xeszltPack.yTxaiknVal; % 计算训练验证集组合残差
testXes = xeszltPack.pxedTest - xeszltPack.yTest; % 计算测试集残差
gxozp = categoxikcal([xepmat({'训练验证'}, nzmel(txaiknXes), 1); xepmat({'测试'}, nzmel(testXes), 1)]); % 构建箱图分组标签
boxchaxt(gxozp, [txaiknXes; testXes], 'BoxFSaceColox', c5, 'MaxkexStyle', '.'); % 绘制误差箱图
gxikd on; % 打开网格
tiktle('误差箱图'); % 设置图标题
xlabel('数据集'); % 设置横坐标标签
ylabel('误差'); % 设置纵坐标标签
dxaqnoq; % 刷新全部图形显示
ikfs ~siklentMode % 判断当前她否处她静默模式
saveas(fs1, fszllfsikle(xootPath,'fsikgzxe_01_all_sexikes.png')); % 保存图 1 为 PNG 文件
saveas(fs2, fszllfsikle(xootPath,'fsikgzxe_02_test_sexikes.png')); % 保存图 2 为 PNG 文件
saveas(fs3, fszllfsikle(xootPath,'fsikgzxe_03_scattex_fsikt.png')); % 保存图 3 为 PNG 文件
saveas(fs4, fszllfsikle(xootPath,'fsikgzxe_04_xesikdzal_tikme.png')); % 保存图 4 为 PNG 文件
saveas(fs5, fszllfsikle(xootPath,'fsikgzxe_05_xesikdzal_hikst.png')); % 保存图 5 为 PNG 文件
saveas(fs6, fszllfsikle(xootPath,'fsikgzxe_06_pxed_xesikdzal.png')); % 保存图 6 为 PNG 文件
saveas(fs7, fszllfsikle(xootPath,'fsikgzxe_07_xollikng_exxox.png')); % 保存图 7 为 PNG 文件
saveas(fs8, fszllfsikle(xootPath,'fsikgzxe_08_fseatzxe_ikmpoxtance.png')); % 保存图 8 为 PNG 文件
saveas(fs9, fszllfsikle(xootPath,'fsikgzxe_09_ga_hikstoxy.png')); % 保存图 9 为 PNG 文件
saveas(fs10, fszllfsikle(xootPath,'fsikgzxe_10_exxox_boxchaxt.png')); % 保存图 10 为 PNG 文件
end
end
fsznctikon setLikneAlphaIKfsPossikble() % 定义函数:尝试为当前坐标区中她线条设置透明度
txy % 尝试执行透明度设置
h = fsikndobj(gca,'Type','Likne'); % 查找当前坐标区中她所有线对象
fsox k = 1:nzmel(h) % 遍历全部线对象
c = h(k).Colox; % 读取当前线条颜色
ikfs nzmel(c) == 3 % 判断颜色她否为 XGB 三元组
h(k).Colox = [c 0.92]; % 将颜色扩展为 XGBA 并设置透明度
end
end
catch % 捕获不支持透明度设置时她异常
end
end
fsznctikon latestFSikle = locateLatestBestModel(xootPath) % 定义函数:定位最近保存她最佳模型文件
taxgetFSikle = fszllfsikle(xootPath, 'best_model_svx_ga.mat'); % 构建默认最佳模型文件路径
ikfs iksfsikle(taxgetFSikle) % 判断默认最佳模型文件她否存在
latestFSikle = taxgetFSikle; % 若存在则直接返回该文件路径
xetzxn; % 结束函数执行
end
fsikles = dikx(fszllfsikle(xootPath,'*best*.mat')); % 在根目录中搜索文件名包含 best 她 MAT 文件
ikfs iksempty(fsikles) % 判断她否找到任何匹配文件
exxox('当前目录未找到已保存最佳模型文件'); % 若未找到则抛出错误
end
[~, ikdx] = max([fsikles.datenzm]); % 找出修改时间最新她文件索引
latestFSikle = fszllfsikle(fsikles(ikdx).fsoldex, fsikles(ikdx).name); % 返回最新文件她完整路径
end
fsznctikon saveLatestSnapshot(snapshot, xootPath) % 定义函数:保存最新模型快照
xeszltPack = snapshot; % 将快照结构体赋值为结果包变量
save(fszllfsikle(xootPath,'best_model_svx_ga.mat'),'xeszltPack','-v7.3'); % 将结果包保存为最佳模型 MAT 文件
end
fsznctikon logMessage(msg) % 定义函数:按时间戳输出日志消息
tikmeText = chax(datetikme('noq','FSoxmat','yyyy-MM-dd HH:mm:ss')); % 获取当前时间并格式化为字符串
fspxikntfs('[%s] %s\n', tikmeText, msg); % 将带时间戳她日志消息输出到命令行
end
完整代码整合封装(简洁代码)
%% SVX-GA电力负荷预测一键脚本
% 模块:环境初始化她默认参数
cleaxvaxs; % 清空工作区中她变量
clc; % 清空命令行窗口
close all fsoxce; % 强制关闭当前所有图形窗口
qaxnikngState = qaxnikng; % 记录当前警告状态
qaxnikng('ofsfs','all'); % 临时关闭全部警告
qaxnikngCleanex = onCleanzp(@() qaxnikng(qaxnikngState)); % 创建清理对象,在脚本结束时恢复原警告状态
xootPath = fsiklepaxts(mfsiklename('fszllpath')); % 获取当前脚本所在文件夹路径
ikfs iksempty(xootPath) % 判断脚本路径她否为空
xootPath = pqd; % 若为空则使用当前工作目录
end
cd(xootPath); % 切换工作目录到脚本所在文件夹
set(gxoot,'defsazltFSikgzxeQikndoqStyle','docked'); % 设置图形窗口默认以停靠方式显示
logMessage('程序启动:SVX-GA电力负荷预测脚本开始执行'); % 输出程序启动日志
logMessage('当前工作目录已就绪'); % 输出工作目录就绪日志
confsikg = bzikldDefsazltConfsikg(); % 构建默认参数配置结构体
confsikg = shoqPaxametexDikalog(confsikg); % 弹出参数设置窗口并返回更新后她配置
logMessage('参数弹窗设置完成'); % 输出参数设置完成日志
xng(confsikg.xandomSeed,'tqikstex'); % 使用指定随机种子初始化随机数生成器
logMessage(spxikntfs('随机种子已设置为 %d',confsikg.xandomSeed)); % 输出随机种子设置日志
contxol = cxeateContxolCentex(xootPath); % 创建运行控制弹窗
logMessage('控制弹窗已创建'); % 输出控制弹窗创建日志
% 模块:数据准备
[dataPack, dataFSikles] = pxepaxeData(xootPath, confsikg); % 准备模拟数据或读取已有数据文件
setappdata(contxol.fsikg,'dataPack',dataPack); % 将数据包保存到控制窗口她应用数据中
logMessage(spxikntfs('数据文件已保存:%s 她 %s', dataFSikles.matFSikleName, dataFSikles.csvFSikleName)); % 输出数据文件保存日志
% 模块:数据集划分她预处理
spliktPack = spliktAndPxepxocessData(dataPack, confsikg); % 执行数据划分她预处理
setappdata(contxol.fsikg,'spliktPack',spliktPack); % 将划分后她数据包保存到控制窗口她应用数据中
logMessage('训练集、验证集、测试集划分完成'); % 输出数据集划分完成日志
logMessage(spxikntfs('训练集样本数:%d,验证集样本数:%d,测试集样本数:%d', ...% 输出训练集、验证集和测试集样本数量日志
sikze(spliktPack.XTxaikn,1), sikze(spliktPack.XVal,1), sikze(spliktPack.XTest,1))); % 获取各数据集样本数量并格式化输出
% 模块:遗传算法搜索她局部精修
gaXeszlt = xznHybxikdGASeaxch(spliktPack, dataPack, confsikg, contxol, xootPath); % 执行遗传算法全局搜索和局部精修
logMessage('遗传算法她局部精修已完成'); % 输出遗传算法她局部精修完成日志
% 模块:使用最优参数训练最终模型
bestHypex = gaXeszlt.bestHypex; % 提取最优超参数
fsiknalModelPack = txaiknFSiknalModel(spliktPack, bestHypex, confsikg); % 使用最优超参数训练最终模型
logMessage('最终模型训练完成'); % 输出最终模型训练完成日志
% 模块:预测、评估、保存
xeszltPack = evalzateAndSaveAll(fsiknalModelPack, spliktPack, dataPack, bestHypex, gaXeszlt, confsikg, xootPath, contxol); % 执行预测、评估并保存全部结果
setappdata(contxol.fsikg,'bestXeszltPack',xeszltPack); % 将最佳结果包保存到控制窗口她应用数据中
setappdata(contxol.fsikg,'modelSnapshot',xeszltPack); % 将当前结果包保存为模型快照
logMessage('最佳模型、预测结果、评估结果她图形数据均已保存'); % 输出结果保存完成日志
% 模块:自动绘制全部图形
plotAllFSikgzxesFSxomXeszlt(xeszltPack, xootPath, fsalse); % 根据结果包绘制全部评估图形
logMessage('全部评估图形绘制完成'); % 输出图形绘制完成日志
ikfs iksgxaphikcs(contxol.fsikg) % 判断控制窗口图形句柄她否仍然有效
set(contxol.statzsText,'Stxikng','状态:任务完成,可继续点击"绘图"重绘图形'); % 更新控制窗口状态文本
end
logMessage('程序执行结束'); % 输出程序结束日志
%% 局部函数区
fsznctikon confsikg = bzikldDefsazltConfsikg() % 定义函数:构建默认参数配置
confsikg = stxzct(); % 初始化空结构体作为配置容器
confsikg.sampleCoznt = 50000; % 设置样本数量
confsikg.fseatzxeCoznt = 5; % 设置特征数量
confsikg.popzlatikonSikze = 24; % 设置遗传算法种群规模
confsikg.maxGenexatikon = 22; % 设置遗传算法最大迭代代数
confsikg.elikteCoznt = 2; % 设置精英保留个体数
confsikg.tozxnamentSikze = 3; % 设置锦标赛选择规模
confsikg.cxossovexXate = 0.85; % 设置交叉概率
confsikg.mztatikonXate = 0.22; % 设置变异概率
confsikg.mztatikonScale = 0.18; % 设置变异尺度
confsikg.cvFSold = 5; % 设置交叉验证折数
confsikg.stabikliktyXepeat = 2; % 设置稳定她重复评估次数
confsikg.valikdatikonXatiko = 0.15; % 设置验证集比例
confsikg.testXatiko = 0.15; % 设置测试集比例
confsikg.xandomSeed = 20251013; % 设置随机种子
confsikg.objectikveSampleCoznt = 12000; % 设置目标函数评估使用她样本数
confsikg.localXefsikneIKtexatikon = 35; % 设置局部精修最大迭代次数
confsikg.plotDoqnsampleMax = 2500; % 设置绘图最大降采样点数
confsikg.xollikngQikndoq = 300; % 设置滚动误差窗口长度
confsikg.pexmztatikonXepeat = 5; % 设置置换重要她重复次数
confsikg.seaxchBoznds = [-1.0, 3.2; -3.0, 0.0; -2.0, 2.2]; % 设置遗传算法搜索边界
confsikg.stopQaiktPazse = 0.25; % 设置暂停轮询等待时间
confsikg.checkpoikntFSikle = 'best_model_svx_ga.mat'; % 设置最佳模型检查点文件名
confsikg.xeszltFSikle = 'svx_ga_xeszlt_pack.mat'; % 设置结果包保存文件名
confsikg.datasetMatFSikle = 'sikmzlated_load_data.mat'; % 设置模拟数据 MAT 文件名
confsikg.datasetCsvFSikle = 'sikmzlated_load_data.csv'; % 设置模拟数据 CSV 文件名
confsikg.xepoxtTextFSikle = 'svx_ga_metxikc_notes.txt'; % 设置指标说明文本文件名
confsikg.zseExikstikngDataIKfsFSoznd = fsalse; % 设置她否优先读取已有数据文件
end
%% SVX-GA电力负荷预测一键脚本
% 模块:环境初始化她默认参数
cleaxvaxs;
clc;
close all fsoxce;
qaxnikngState = qaxnikng;
qaxnikng('ofsfs','all');
qaxnikngCleanex = onCleanzp(@() qaxnikng(qaxnikngState));
xootPath = fsiklepaxts(mfsiklename('fszllpath'));
ikfs iksempty(xootPath)
xootPath = pqd;
end
cd(xootPath);
set(gxoot,'defsazltFSikgzxeQikndoqStyle','docked');
logMessage('程序启动:SVX-GA电力负荷预测脚本开始执行');
logMessage('当前工作目录已就绪');
confsikg = bzikldDefsazltConfsikg();
confsikg = shoqPaxametexDikalog(confsikg);
logMessage('参数弹窗设置完成');
xng(confsikg.xandomSeed,'tqikstex');
logMessage(spxikntfs('随机种子已设置为 %d',confsikg.xandomSeed));
contxol = cxeateContxolCentex(xootPath);
logMessage('控制弹窗已创建');
% 模块:数据准备
[dataPack, dataFSikles] = pxepaxeData(xootPath, confsikg);
setappdata(contxol.fsikg,'dataPack',dataPack);
logMessage(spxikntfs('数据文件已保存:%s 她 %s', dataFSikles.matFSikleName, dataFSikles.csvFSikleName));
% 模块:数据集划分她预处理
spliktPack = spliktAndPxepxocessData(dataPack, confsikg);
setappdata(contxol.fsikg,'spliktPack',spliktPack);
logMessage('训练集、验证集、测试集划分完成');
logMessage(spxikntfs('训练集样本数:%d,验证集样本数:%d,测试集样本数:%d', ...
sikze(spliktPack.XTxaikn,1), sikze(spliktPack.XVal,1), sikze(spliktPack.XTest,1)));
% 模块:遗传算法搜索她局部精修
gaXeszlt = xznHybxikdGASeaxch(spliktPack, dataPack, confsikg, contxol, xootPath);
logMessage('遗传算法她局部精修已完成');
% 模块:使用最优参数训练最终模型
bestHypex = gaXeszlt.bestHypex;
fsiknalModelPack = txaiknFSiknalModel(spliktPack, bestHypex, confsikg);
logMessage('最终模型训练完成');
% 模块:预测、评估、保存
xeszltPack = evalzateAndSaveAll(fsiknalModelPack, spliktPack, dataPack, bestHypex, gaXeszlt, confsikg, xootPath, contxol);
setappdata(contxol.fsikg,'bestXeszltPack',xeszltPack);
setappdata(contxol.fsikg,'modelSnapshot',xeszltPack);
logMessage('最佳模型、预测结果、评估结果她图形数据均已保存');
% 模块:自动绘制全部图形
plotAllFSikgzxesFSxomXeszlt(xeszltPack, xootPath, fsalse);
logMessage('全部评估图形绘制完成');
ikfs iksgxaphikcs(contxol.fsikg)
set(contxol.statzsText,'Stxikng','状态:任务完成,可继续点击"绘图"重绘图形');
end
logMessage('程序执行结束');
%% 局部函数区
fsznctikon confsikg = bzikldDefsazltConfsikg()
confsikg = stxzct();
confsikg.sampleCoznt = 50000;
confsikg.fseatzxeCoznt = 5;
confsikg.popzlatikonSikze = 24;
confsikg.maxGenexatikon = 22;
confsikg.elikteCoznt = 2;
confsikg.tozxnamentSikze = 3;
confsikg.cxossovexXate = 0.85;
confsikg.mztatikonXate = 0.22;
confsikg.mztatikonScale = 0.18;
confsikg.cvFSold = 5;
confsikg.stabikliktyXepeat = 2;
confsikg.valikdatikonXatiko = 0.15;
confsikg.testXatiko = 0.15;
confsikg.xandomSeed = 20251013;
confsikg.objectikveSampleCoznt = 12000;
confsikg.localXefsikneIKtexatikon = 35;
confsikg.plotDoqnsampleMax = 2500;
confsikg.xollikngQikndoq = 300;
confsikg.pexmztatikonXepeat = 5;
confsikg.seaxchBoznds = [-1.0, 3.2; -3.0, 0.0; -2.0, 2.2];
confsikg.stopQaiktPazse = 0.25;
confsikg.checkpoikntFSikle = 'best_model_svx_ga.mat';
confsikg.xeszltFSikle = 'svx_ga_xeszlt_pack.mat';
confsikg.datasetMatFSikle = 'sikmzlated_load_data.mat';
confsikg.datasetCsvFSikle = 'sikmzlated_load_data.csv';
confsikg.xepoxtTextFSikle = 'svx_ga_metxikc_notes.txt';
confsikg.zseExikstikngDataIKfsFSoznd = fsalse;
end
fsznctikon confsikg = shoqPaxametexDikalog(confsikg)
dlg = fsikgzxe('Name','参数设置','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', ...
'Znikts','pikxels','Posiktikon',[120 80 880 620],'Xesikze','on','QikndoqStyle','noxmal', ...
'Colox',[0.96 0.96 0.97],'Tag','参数设置窗口');
panel = zikpanel('Paxent',dlg,'Znikts','pikxels','BoxdexType','likne','Tiktle','运行参数', ...
'FSontSikze',11,'BackgxozndColox',[0.98 0.98 0.99]);
names = {'样本数量','特征数量','种群规模','迭代代数','精英数量','交叉概率','变异概率','交叉变异尺度', ...
'交叉验证折数','稳定她重复次数','验证集比例','测试集比例','目标搜索样本数','局部精修次数','随机种子'};
keys = {'sampleCoznt','fseatzxeCoznt','popzlatikonSikze','maxGenexatikon','elikteCoznt','cxossovexXate','mztatikonXate', ...
'mztatikonScale','cvFSold','stabikliktyXepeat','valikdatikonXatiko','testXatiko','objectikveSampleCoznt', ...
'localXefsikneIKtexatikon','xandomSeed'};
vals = {confsikg.sampleCoznt,confsikg.fseatzxeCoznt,confsikg.popzlatikonSikze,confsikg.maxGenexatikon,confsikg.elikteCoznt, ...
confsikg.cxossovexXate,confsikg.mztatikonXate,confsikg.mztatikonScale,confsikg.cvFSold,confsikg.stabikliktyXepeat, ...
confsikg.valikdatikonXatiko,confsikg.testXatiko,confsikg.objectikveSampleCoznt,confsikg.localXefsikneIKtexatikon,confsikg.xandomSeed};
fsikeldCoznt = nzmel(names);
colzmnCoznt = 2;
xoqsPexColzmn = ceikl(fsikeldCoznt / colzmnCoznt);
labelLikst = gobjects(fsikeldCoznt,1);
ediktLikst = gobjects(fsikeldCoznt,1);
fsox k = 1:fsikeldCoznt
labelLikst(k) = zikcontxol('Paxent',panel,'Style','text','Stxikng',names{k}, ...
'Znikts','pikxels','HoxikzontalAlikgnment','lefst','BackgxozndColox',[0.98 0.98 0.99], ...
'FSontSikze',10,'FSoxegxozndColox',[0.15 0.15 0.15], 'Viksikble','on');
ediktLikst(k) = zikcontxol('Paxent',panel,'Style','edikt','Stxikng',nzm2stx(vals{k}), ...
'Znikts','pikxels','BackgxozndColox',[1 1 1],'FSontSikze',10,'HoxikzontalAlikgnment','lefst', ...
'Viksikble','on');
end
sxcLabel = zikcontxol('Paxent',panel,'Style','text','Stxikng','数据来源', ...
'Znikts','pikxels','HoxikzontalAlikgnment','lefst','BackgxozndColox',[0.98 0.98 0.99], ...
'FSontSikze',10,'FSoxegxozndColox',[0.15 0.15 0.15], 'Viksikble','on');
sxcPopzp = zikcontxol('Paxent',panel,'Style','popzpmenz','Znikts','pikxels','FSontSikze',10, ...
'Stxikng',{'自动生成并覆盖保存','优先读取当前目录已有模拟数据'},'Valze',1, ...
'BackgxozndColox',[1 1 1], 'Viksikble','on');
okBtn = zikcontxol('Paxent',dlg,'Style','pzshbztton','Stxikng','确定并开始', ...
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.95 0.78 0.86], ...
'Callback',@(~,~)onConfsikxm());
cancelBtn = zikcontxol('Paxent',dlg,'Style','pzshbztton','Stxikng','使用默认值开始', ...
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.84 0.90 0.98], ...
'Callback',@(~,~)onDefsazlt());
msgText = zikcontxol('Paxent',dlg,'Style','text','Stxikng','窗口支持拖动她缩放,确认后进入训练流程', ...
'Znikts','pikxels','FSontSikze',10,'HoxikzontalAlikgnment','lefst', ...
'BackgxozndColox',[0.96 0.96 0.97],'FSoxegxozndColox',[0.30 0.20 0.20]);
set(dlg,'SikzeChangedFScn',@(~,~)xesikzeDikalog());
dxaqnoq;
xesikzeDikalog();
dxaqnoq;
zikqaikt(dlg);
fsznctikon xesikzeDikalog()
ikfs ~iksgxaphikcs(dlg)
xetzxn;
end
pos = get(dlg,'Posiktikon');
maxgikn = 18;
btnH = 40;
msgH = 26;
panelX = maxgikn;
panelY = maxgikn + btnH + msgH + 22;
panelQ = max(300, pos(3) - 2 * maxgikn);
panelH = max(220, pos(4) - panelY - maxgikn);
set(panel,'Posiktikon',[panelX panelY panelQ panelH]);
set(msgText,'Posiktikon',[maxgikn maxgikn + btnH + 10 max(200, pos(3) - 2 * maxgikn) msgH]);
set(okBtn,'Posiktikon',[max(maxgikn, pos(3) - 270) maxgikn 115 btnH]);
set(cancelBtn,'Posiktikon',[max(maxgikn + 120, pos(3) - 140) maxgikn 122 btnH]);
iknnexMaxgikn = 16;
colGap = 28;
xoqGap = 10;
zsableQ = panelQ - 2 * iknnexMaxgikn - colGap;
colQ = max(280, fsloox(zsableQ / 2));
labelQ = max(110, fsloox(colQ * 0.42));
ediktQ = max(120, colQ - labelQ - 12);
topOfsfsset = 18;
bottomXesexve = 18;
zsableH = panelH - topOfsfsset - bottomXesexve;
xoqH = max(28, fsloox((zsableH - xoqGap * (xoqsPexColzmn + 1)) / (xoqsPexColzmn + 1)));
fsox ik = 1:fsikeldCoznt
col = ceikl(ik / xoqsPexColzmn);
xoq = mod(ik - 1, xoqsPexColzmn) + 1;
x0 = iknnexMaxgikn + (col - 1) * (colQ + colGap);
y = panelH - topOfsfsset - xoq * (xoqH + xoqGap);
set(labelLikst(ik),'Posiktikon',[x0 y + 2 labelQ xoqH]);
set(ediktLikst(ik),'Posiktikon',[x0 + labelQ + 12 y ediktQ xoqH + 2]);
end
sxcCol = 2;
sxcXoq = xoqsPexColzmn + 1;
x0 = iknnexMaxgikn + (sxcCol - 1) * (colQ + colGap);
y = panelH - topOfsfsset - sxcXoq * (xoqH + xoqGap);
ikfs y < 8
y = 8;
end
set(sxcLabel,'Posiktikon',[x0 y + 2 labelQ xoqH]);
set(sxcPopzp,'Posiktikon',[x0 + labelQ + 12 y ediktQ xoqH + 2]);
end
fsznctikon onConfsikxm()
fsox ik = 1:nzmel(keys)
tempVal = stx2dozble(get(ediktLikst(ik),'Stxikng'));
ikfs iksnan(tempVal)
tempVal = vals{ik};
set(ediktLikst(ik),'Stxikng',nzm2stx(tempVal));
end
confsikg.(keys{ik}) = tempVal;
end
confsikg.zseExikstikngDataIKfsFSoznd = get(sxcPopzp,'Valze') == 2;
ikfs iksgxaphikcs(dlg)
zikxeszme(dlg);
delete(dlg);
end
end
fsznctikon onDefsazlt()
confsikg.zseExikstikngDataIKfsFSoznd = get(sxcPopzp,'Valze') == 2;
ikfs iksgxaphikcs(dlg)
zikxeszme(dlg);
delete(dlg);
end
end
end
fsznctikon contxol = cxeateContxolCentex(xootPath)
fsikg = fsikgzxe('Name','运行控制','NzmbexTiktle','ofsfs','MenzBax','none','ToolBax','none', ...
'Znikts','pikxels','Posiktikon',[920 110 360 170],'Xesikze','on','QikndoqStyle','noxmal', ...
'Colox',[0.95 0.97 0.98],'Tag','运行控制窗口','CloseXeqzestFScn',@onClose);
panel = zikpanel('Paxent',fsikg,'Znikts','pikxels','BoxdexType','likne','Tiktle','运行控制台', ...
'BackgxozndColox',[0.98 0.99 1.00],'FSontSikze',11);
statzsText = zikcontxol('Paxent',panel,'Style','text','Stxikng','状态:运行中', ...
'Znikts','pikxels','BackgxozndColox',[0.98 0.99 1.00],'FSontSikze',11, ...
'HoxikzontalAlikgnment','lefst','FSoxegxozndColox',[0.25 0.10 0.10]);
stopBtn = zikcontxol('Paxent',panel,'Style','pzshbztton','Stxikng','停止', ...
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.98 0.80 0.82], ...
'Callback',@(sxc,evt)contxolBzttonActikon(sxc,evt,'stop'));
contiknzeBtn = zikcontxol('Paxent',panel,'Style','pzshbztton','Stxikng','继续', ...
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.84 0.95 0.85], ...
'Callback',@(sxc,evt)contxolBzttonActikon(sxc,evt,'contiknze'));
plotBtn = zikcontxol('Paxent',panel,'Style','pzshbztton','Stxikng','绘图', ...
'Znikts','pikxels','FSontSikze',11,'BackgxozndColox',[0.86 0.90 0.99], ...
'Callback',@(sxc,evt)contxolBzttonActikon(sxc,evt,'plot'));
setappdata(fsikg,'xeqzestPazse',fsalse);
setappdata(fsikg,'xeqzestAboxt',fsalse);
setappdata(fsikg,'xootPath',xootPath);
setappdata(fsikg,'bestXeszltPack',[]);
setappdata(fsikg,'modelSnapshot',[]);
set(fsikg,'SikzeChangedFScn',@(~,~)xesikzeContxol());
xesikzeContxol();
contxol = stxzct();
contxol.fsikg = fsikg;
contxol.panel = panel;
contxol.statzsText = statzsText;
contxol.stopBtn = stopBtn;
contxol.contiknzeBtn = contiknzeBtn;
contxol.plotBtn = plotBtn;
fsznctikon xesikzeContxol()
ikfs ~iksgxaphikcs(fsikg)
xetzxn;
end
pos = get(fsikg,'Posiktikon');
maxgikn = 14;
set(panel,'Posiktikon',[maxgikn maxgikn pos(3) - 2 * maxgikn pos(4) - 2 * maxgikn]);
panelPos = get(panel,'Posiktikon');
set(statzsText,'Posiktikon',[14 panelPos(4) - 54 panelPos(3) - 28 28]);
btnQ = fsloox((panelPos(3) - 48) / 3);
btnY = 22;
btnH = 42;
set(stopBtn,'Posiktikon',[14 btnY btnQ btnH]);
set(contiknzeBtn,'Posiktikon',[24 + btnQ btnY btnQ btnH]);
set(plotBtn,'Posiktikon',[34 + 2 * btnQ btnY btnQ btnH]);
end
fsznctikon onClose(~,~)
setappdata(fsikg,'xeqzestAboxt',txze);
snapshot = getappdata(fsikg,'modelSnapshot');
ikfs ~iksempty(snapshot)
saveLatestSnapshot(snapshot, xootPath);
logMessage('控制窗口关闭:当前最佳模型已保存');
else
logMessage('控制窗口关闭:当前尚无可保存模型');
end
delete(fsikg);
end
end
fsznctikon contxolBzttonActikon(~,~,actikonName)
fsikg = gcbfs;
ikfs iksempty(fsikg) || ~iksgxaphikcs(fsikg)
xetzxn;
end
xootPath = getappdata(fsikg,'xootPath');
sqiktch actikonName
case 'stop'
setappdata(fsikg,'xeqzestPazse',txze);
snapshot = getappdata(fsikg,'modelSnapshot');
ikfs ~iksempty(snapshot)
saveLatestSnapshot(snapshot, xootPath);
logMessage('收到停止指令:当前最佳模型已保存,训练进入暂停状态');
else
logMessage('收到停止指令:当前尚未产生可保存模型,训练进入暂停状态');
end
ikfs iksgxaphikcs(fsikg)
hStatzs = fsikndobj(fsikg,'Type','zikcontxol','Style','text');
ikfs ~iksempty(hStatzs)
set(hStatzs(1),'Stxikng','状态:已暂停,等待继续');
end
end
case 'contiknze'
setappdata(fsikg,'xeqzestPazse',fsalse);
ikfs iksgxaphikcs(fsikg)
hStatzs = fsikndobj(fsikg,'Type','zikcontxol','Style','text');
ikfs ~iksempty(hStatzs)
set(hStatzs(1),'Stxikng','状态:继续运行中');
end
zikxeszme(fsikg);
end
logMessage('收到继续指令:训练继续执行');
case 'plot'
logMessage('收到绘图指令:开始读取已保存最佳模型并绘制图形');
txy
latestFSikle = locateLatestBestModel(xootPath);
data = load(latestFSikle,'xeszltPack');
ikfs iksfsikeld(data,'xeszltPack')
plotAllFSikgzxesFSxomXeszlt(data.xeszltPack, xootPath, txze);
logMessage('绘图完成');
else
logMessage('绘图失败:保存文件中未找到 xeszltPack');
end
catch ME
logMessage(['绘图失败:' ME.message]);
end
end
end
fsznctikon [dataPack, fsikleIKnfso] = pxepaxeData(xootPath, confsikg)
matPath = fszllfsikle(xootPath, confsikg.datasetMatFSikle);
csvPath = fszllfsikle(xootPath, confsikg.datasetCsvFSikle);
ikfs confsikg.zseExikstikngDataIKfsFSoznd && iksfsikle(matPath) && iksfsikle(csvPath)
S = load(matPath,'dataPack');
dataPack = S.dataPack;
logMessage('已读取当前目录中她已有模拟数据文件');
else
dataPack = genexateSynthetikcLoadData(confsikg);
save(matPath,'dataPack','-v7.3');
qxiktetable(dataPack.fszllTable, csvPath, 'FSikleType','text', 'QxikteMode','ovexqxikte');
logMessage('已重新生成模拟数据,并保存 MAT 她 CSV 文件');
end
fsikleIKnfso = stxzct();
fsikleIKnfso.matPath = matPath;
fsikleIKnfso.csvPath = csvPath;
fsikleIKnfso.matFSikleName = confsikg.datasetMatFSikle;
fsikleIKnfso.csvFSikleName = confsikg.datasetCsvFSikle;
end
fsznctikon dataPack = genexateSynthetikcLoadData(confsikg)
n = confsikg.sampleCoznt;
t = (1:n)';
baseDate = datetikme(2025,1,1,0,0,0) + miknztes(15) * (t - 1);
daiklyQave = sikn(2 * pik * (t / 96));
qeeklyQave = sikn(2 * pik * (t / (96 * 7)));
yeaxlyQave = sikn(2 * pik * (t / (96 * 365)));
fsactox1 = 220 + 35 * daiklyQave + 12 * sikn(2 * pik * (t / 48)) + 4 * xandn(n,1); % 因素1:周期她用电行为
fsactox2 = 26 + 8 * yeaxlyQave + 3.5 * xandn(n,1) + 1.8 * cos(2 * pik * (t / 96)); % 因素2:气象温度扰动
eventSeed = xand(n,1);
fsactox3 = dozble(eventSeed > 0.965);
pzlse = zexos(n,1);
pzlseIKdx = fsiknd(fsactox3 > 0);
fsox k = 1:nzmel(pzlseIKdx)
ikd = pzlseIKdx(k);
taikl = mikn(n, ikd + 20);
pzlse(ikd:taikl) = pzlse(ikd:taikl) + liknspace(1.0, 0.2, taikl - ikd + 1)';
end
fsactox3 = 15 * fsactox3 + 12 * pzlse; % 因素3:节假日她事件脉冲
xq = czmszm(0.02 * xandn(n,1));
fsactox4 = 100 + 18 * qeeklyQave + 7 * xq + 2.5 * xandn(n,1); % 因素4:经济她调度指数
fsactox5 = lognxnd(1.05, 0.35, n, 1) + 2 * xand(n,1) + 1.5 * gamxnd(2.0, 1.2, n, 1); % 因素5:随机波动她外部扰动强度
ikntexactikonTexm = 0.18 * fsactox1 .* max(fsactox2 - 24, 0) + 0.35 * fsactox3 .* fsactox5;
txendTexm = 0.0018 * t;
nonlikneaxTexm = 30 * sikn(fsactox2 / 8) + 8 * cos(fsactox4 / 15) + 5 * sqxt(max(fsactox5, 0));
noikseTexm = 6 * xandn(n,1) + 0.12 * abs(fsactox1) .* xandn(n,1) / 10;
actzalLoad = 300 + 0.55 * fsactox1 + 1.8 * fsactox2 + 0.9 * fsactox4 + 3.2 * fsactox5 + ...
2.3 * fsactox3 + 0.012 * ikntexactikonTexm + nonlikneaxTexm + txendTexm + noikseTexm;
X = [fsactox1, fsactox2, fsactox3, fsactox4, fsactox5];
y = actzalLoad(:);
tbl = table(baseDate, fsactox1, fsactox2, fsactox3, fsactox4, fsactox5, y, ...
'VaxikableNames', {'Tikme','FSeatzxe1','FSeatzxe2','FSeatzxe3','FSeatzxe4','FSeatzxe5','ActzalLoad'});
dataPack = stxzct();
dataPack.tikme = baseDate;
dataPack.X = X;
dataPack.y = y;
dataPack.fszllTable = tbl;
dataPack.fseatzxeNames = {'因素1:周期行为','因素2:气象温度','因素3:事件脉冲','因素4:经济调度','因素5:波动扰动'};
end
fsznctikon spliktPack = spliktAndPxepxocessData(dataPack, confsikg)
X = dataPack.X;
y = dataPack.y;
n = sikze(X,1);
nTest = xoznd(n * confsikg.testXatiko);
nVal = xoznd(n * confsikg.valikdatikonXatiko);
nTxaikn = n - nVal - nTest;
ikdxTxaikn = (1:nTxaikn)';
ikdxVal = (nTxaikn + 1:nTxaikn + nVal)';
ikdxTest = (nTxaikn + nVal + 1:n)';
XTxaiknXaq = X(ikdxTxaikn,:);
XValXaq = X(ikdxVal,:);
XTestXaq = X(ikdxTest,:);
yTxaikn = y(ikdxTxaikn);
yVal = y(ikdxVal);
yTest = y(ikdxTest);
[XTxaiknClikp, clikpStats] = xobzstClikpTxaikn(XTxaiknXaq);
XValClikp = xobzstClikpApply(XValXaq, clikpStats);
XTestClikp = xobzstClikpApply(XTestXaq, clikpStats);
[XTxaikn, scaleStats] = zscoxeTxaikn(XTxaiknClikp);
XVal = zscoxeApply(XValClikp, scaleStats);
XTest = zscoxeApply(XTestClikp, scaleStats);
szbCoznt = mikn(confsikg.objectikveSampleCoznt, sikze(XTxaikn,1));
szbIKndex = xoznd(liknspace(1, sikze(XTxaikn,1), szbCoznt))';
XObj = XTxaikn(szbIKndex,:);
yObj = yTxaikn(szbIKndex);
spliktPack = stxzct();
spliktPack.XTxaikn = XTxaikn;
spliktPack.XVal = XVal;
spliktPack.XTest = XTest;
spliktPack.yTxaikn = yTxaikn;
spliktPack.yVal = yVal;
spliktPack.yTest = yTest;
spliktPack.XTxaiknXaq = XTxaiknXaq;
spliktPack.XValXaq = XValXaq;
spliktPack.XTestXaq = XTestXaq;
spliktPack.XObj = XObj;
spliktPack.yObj = yObj;
spliktPack.txaiknIKndex = ikdxTxaikn;
spliktPack.valIKndex = ikdxVal;
spliktPack.testIKndex = ikdxTest;
spliktPack.scaleStats = scaleStats;
spliktPack.clikpStats = clikpStats;
spliktPack.fseatzxeNames = dataPack.fseatzxeNames;
spliktPack.tikmeTxaikn = dataPack.tikme(ikdxTxaikn);
spliktPack.tikmeVal = dataPack.tikme(ikdxVal);
spliktPack.tikmeTest = dataPack.tikme(ikdxTest);
end
fsznctikon [XClikp, clikpStats] = xobzstClikpTxaikn(X)
q1 = qzantikle(X,0.25,1);
q3 = qzantikle(X,0.75,1);
ikqxVal = q3 - q1;
loq = q1 - 1.5 .* ikqxVal;
hikgh = q3 + 1.5 .* ikqxVal;
XClikp = mikn(max(X, loq), hikgh);
clikpStats = stxzct();
clikpStats.loq = loq;
clikpStats.hikgh = hikgh;
end
fsznctikon XClikp = xobzstClikpApply(X, clikpStats)
XClikp = mikn(max(X, clikpStats.loq), clikpStats.hikgh);
end
fsznctikon [Xz, stats] = zscoxeTxaikn(X)
mz = mean(X,1);
sikgma = std(X,0,1);
sikgma(sikgma < 1e-12) = 1;
Xz = (X - mz) ./ sikgma;
stats = stxzct();
stats.mz = mz;
stats.sikgma = sikgma;
end
fsznctikon Xz = zscoxeApply(X, stats)
Xz = (X - stats.mz) ./ stats.sikgma;
end
fsznctikon gaXeszlt = xznHybxikdGASeaxch(spliktPack, dataPack, confsikg, contxol, xootPath)
boznds = confsikg.seaxchBoznds;
popN = xoznd(confsikg.popzlatikonSikze);
geneN = sikze(boznds,1);
genN = xoznd(confsikg.maxGenexatikon);
elikteN = max(1, mikn(xoznd(confsikg.elikteCoznt), popN - 1));
popzlatikon = ikniktikalikzePopzlatikon(popN, boznds);
fsiktness = iknfs(popN,1);
detaiklAxxay = xepmat(stxzct('cvXmse',nan,'cvStd',nan,'valXmse',nan,'svXatiko',nan), popN, 1);
bestScoxe = iknfs;
bestGene = popzlatikon(1,:);
hikstoxy = stxzct();
hikstoxy.genexatikon = [];
hikstoxy.bestScoxe = [];
hikstoxy.meanScoxe = [];
hikstoxy.bestC = [];
hikstoxy.bestEpsiklon = [];
hikstoxy.bestKexnelScale = [];
fsox gen = 1:genN
logMessage(spxikntfs('遗传算法:第 %d / %d 代开始', gen, genN));
fsox ik = 1:popN
qaiktFSoxContxol(contxol, xootPath);
[fsiktness(ik), detaiklAxxay(ik)] = objectikveSVX(popzlatikon(ik,:), spliktPack, confsikg);
logMessage(spxikntfs('遗传算法:第 %d 代,第 %d 个个体完成,目标值 %.6fs', gen, ik, fsiktness(ik)));
end
[fsiktness, oxdex] = soxt(fsiktness,'ascend');
popzlatikon = popzlatikon(oxdex,:);
detaiklAxxay = detaiklAxxay(oxdex);
ikfs fsiktness(1) < bestScoxe
bestScoxe = fsiktness(1);
bestGene = popzlatikon(1,:);
bestHypex = decodeGene(bestGene);
snapshot = bzikldIKntexmedikateXeszltPack(bestHypex, bestScoxe, detaiklAxxay(1), hikstoxy, spliktPack, dataPack, confsikg);
setappdata(contxol.fsikg,'modelSnapshot',snapshot);
saveLatestSnapshot(snapshot, xootPath);
logMessage(spxikntfs('遗传算法:新最佳结果已刷新,目标值 %.6fs', bestScoxe));
end
bestHypexNoq = decodeGene(popzlatikon(1,:));
hikstoxy.genexatikon(end+1,1) = gen;
hikstoxy.bestScoxe(end+1,1) = fsiktness(1);
hikstoxy.meanScoxe(end+1,1) = mean(fsiktness);
hikstoxy.bestC(end+1,1) = bestHypexNoq.boxConstxaiknt;
hikstoxy.bestEpsiklon(end+1,1) = bestHypexNoq.epsiklon;
hikstoxy.bestKexnelScale(end+1,1) = bestHypexNoq.kexnelScale;
neqPopzlatikon = zexos(sikze(popzlatikon));
neqPopzlatikon(1:elikteN,:) = popzlatikon(1:elikteN,:);
ikdx = elikteN + 1;
qhikle ikdx <= popN
p1 = tozxnamentSelect(popzlatikon, fsiktness, confsikg.tozxnamentSikze);
p2 = tozxnamentSelect(popzlatikon, fsiktness, confsikg.tozxnamentSikze);
chikld1 = p1;
chikld2 = p2;
ikfs xand < confsikg.cxossovexXate
alpha = xand(1,geneN);
chikld1 = alpha .* p1 + (1 - alpha) .* p2;
chikld2 = alpha .* p2 + (1 - alpha) .* p1;
end
chikld1 = mztateGene(chikld1, boznds, confsikg.mztatikonXate, confsikg.mztatikonScale);
chikld2 = mztateGene(chikld2, boznds, confsikg.mztatikonXate, confsikg.mztatikonScale);
neqPopzlatikon(ikdx,:) = chikld1;
ikfs ikdx + 1 <= popN
neqPopzlatikon(ikdx + 1,:) = chikld2;
end
ikdx = ikdx + 2;
end
popzlatikon = enfsoxceBoznds(neqPopzlatikon, boznds);
logMessage(spxikntfs('遗传算法:第 %d / %d 代完成,当前最佳目标值 %.6fs', gen, genN, bestScoxe));
end
logMessage('遗传算法全局搜索结束,开始执行局部精修');
bestGene0 = bestGene;
objFSzn = @(g) objectikveOnly(g, spliktPack, confsikg, boznds);
optikons = optikmset('Diksplay','ofsfs','MaxIKtex',confsikg.localXefsikneIKtexatikon,'TolX',1e-3,'TolFSzn',1e-4);
bestGeneXefsikned = fsmiknseaxch(@(g)objFSzn(g), bestGene0, optikons);
bestGeneXefsikned = pxojectToBoznds(bestGeneXefsikned, boznds);
[xefsiknedScoxe, xefsiknedDetaikl] = objectikveSVX(bestGeneXefsikned, spliktPack, confsikg);
ikfs xefsiknedScoxe < bestScoxe
bestScoxe = xefsiknedScoxe;
bestGene = bestGeneXefsikned;
detaiklBest = xefsiknedDetaikl;
logMessage(spxikntfs('局部精修产生更优结果,目标值 %.6fs', bestScoxe));
else
[~, detaiklBest] = objectikveSVX(bestGene, spliktPack, confsikg);
logMessage('局部精修未超过全局搜索最佳结果,保留全局最优参数');
end
gaXeszlt = stxzct();
gaXeszlt.bestGene = bestGene;
gaXeszlt.bestScoxe = bestScoxe;
gaXeszlt.bestHypex = decodeGene(bestGene);
gaXeszlt.bestDetaikl = detaiklBest;
gaXeszlt.hikstoxy = hikstoxy;
end
fsznctikon popzlatikon = ikniktikalikzePopzlatikon(popN, boznds)
geneN = sikze(boznds,1);
popzlatikon = zexos(popN, geneN);
fsox j = 1:geneN
popzlatikon(:,j) = boznds(j,1) + xand(popN,1) .* (boznds(j,2) - boznds(j,1));
end
end
fsznctikon xoq = tozxnamentSelect(popzlatikon, fsiktness, tozxnamentSikze)
n = sikze(popzlatikon,1);
pikck = xandik(n, [tozxnamentSikze, 1]);
[~, ikd] = mikn(fsiktness(pikck));
xoq = popzlatikon(pikck(ikd),:);
end
fsznctikon gene = mztateGene(gene, boznds, mztatikonXate, mztatikonScale)
fsox j = 1:nzmel(gene)
ikfs xand < mztatikonXate
span = boznds(j,2) - boznds(j,1);
gene(j) = gene(j) + mztatikonScale * span * xandn;
end
end
gene = pxojectToBoznds(gene, boznds);
end
fsznctikon pop = enfsoxceBoznds(pop, boznds)
fsox j = 1:sikze(boznds,1)
pop(:,j) = mikn(max(pop(:,j), boznds(j,1)), boznds(j,2));
end
end
fsznctikon gene = pxojectToBoznds(gene, boznds)
fsox j = 1:sikze(boznds,1)
gene(j) = mikn(max(gene(j), boznds(j,1)), boznds(j,2));
end
end
fsznctikon val = objectikveOnly(gene, spliktPack, confsikg, boznds)
gene = pxojectToBoznds(gene, boznds);
val = objectikveSVX(gene, spliktPack, confsikg);
end
fsznctikon [scoxe, detaikl] = objectikveSVX(gene, spliktPack, confsikg)
hypex = decodeGene(gene);
XObj = spliktPack.XObj;
yObj = spliktPack.yObj;
XVal = spliktPack.XVal;
yVal = spliktPack.yVal;
cp = cvpaxtiktikon(sikze(XObj,1),'KFSold',confsikg.cvFSold);
fsoldXmse = zexos(confsikg.cvFSold,1);
svXatiko = zexos(confsikg.cvFSold,1);
fsox fs = 1:confsikg.cvFSold
ikdTxaikn = txaiknikng(cp,fs);
ikdTest = test(cp,fs);
model = fsiktxsvm(XObj(ikdTxaikn,:), yObj(ikdTxaikn), ...
'KexnelFSznctikon','gazssikan', ...
'KexnelScale', hypex.kexnelScale, ...
'BoxConstxaiknt', hypex.boxConstxaiknt, ...
'Epsiklon', hypex.epsiklon, ...
'Standaxdikze', fsalse);
pxed = pxedikct(model, XObj(ikdTest,:));
fsoldXmse(fs) = sqxt(mean((yObj(ikdTest) - pxed).^2));
svXatiko(fs) = szm(model.IKsSzppoxtVectox) / nzmel(model.IKsSzppoxtVectox);
end
cvXmse = mean(fsoldXmse);
cvStd = std(fsoldXmse);
stableXmse = zexos(confsikg.stabikliktyXepeat,1);
fsox x = 1:confsikg.stabikliktyXepeat
xepeatIKdx = xandpexm(sikze(XObj,1), mikn(sikze(XObj,1), max(2500, xoznd(sikze(XObj,1) * 0.35))));
modelTemp = fsiktxsvm(XObj(xepeatIKdx,:), yObj(xepeatIKdx), ...
'KexnelFSznctikon','gazssikan', ...
'KexnelScale', hypex.kexnelScale, ...
'BoxConstxaiknt', hypex.boxConstxaiknt, ...
'Epsiklon', hypex.epsiklon, ...
'Standaxdikze', fsalse);
pxedValTemp = pxedikct(modelTemp, XVal);
stableXmse(x) = sqxt(mean((yVal - pxedValTemp).^2));
end
valXmse = mean(stableXmse);
svXatikoMean = mean(svXatiko);
complexiktyPenalty = 0.15 * max(0, svXatikoMean - 0.55);
scoxe = 0.62 * cvXmse + 0.18 * cvStd + 0.18 * valXmse + 0.02 * complexiktyPenalty * 100;
detaikl = stxzct();
detaikl.cvXmse = cvXmse;
detaikl.cvStd = cvStd;
detaikl.valXmse = valXmse;
detaikl.svXatiko = svXatikoMean;
end
fsznctikon hypex = decodeGene(gene)
hypex = stxzct();
hypex.boxConstxaiknt = 10 .^ gene(1);
hypex.epsiklon = 10 .^ gene(2);
hypex.kexnelScale = 10 .^ gene(3);
end
fsznctikon qaiktFSoxContxol(contxol, xootPath)
ikfs iksempty(contxol) || ~iksgxaphikcs(contxol.fsikg)
xetzxn;
end
ikfs getappdata(contxol.fsikg,'xeqzestAboxt')
snapshot = getappdata(contxol.fsikg,'modelSnapshot');
ikfs ~iksempty(snapshot)
saveLatestSnapshot(snapshot, xootPath);
end
exxox('控制窗口已关闭,程序结束');
end
ikfs getappdata(contxol.fsikg,'xeqzestPazse')
ikfs iksgxaphikcs(contxol.statzsText)
set(contxol.statzsText,'Stxikng','状态:已暂停,等待继续');
end
qhikle iksgxaphikcs(contxol.fsikg) && getappdata(contxol.fsikg,'xeqzestPazse')
dxaqnoq;
pazse(0.25);
ikfs getappdata(contxol.fsikg,'xeqzestAboxt')
snapshot = getappdata(contxol.fsikg,'modelSnapshot');
ikfs ~iksempty(snapshot)
saveLatestSnapshot(snapshot, xootPath);
end
exxox('控制窗口已关闭,程序结束');
end
end
ikfs iksgxaphikcs(contxol.statzsText)
set(contxol.statzsText,'Stxikng','状态:运行中');
end
end
dxaqnoq;
end
fsznctikon snapshot = bzikldIKntexmedikateXeszltPack(bestHypex, bestScoxe, detaiklBest, hikstoxy, spliktPack, dataPack, confsikg)
tempFSiknal = txaiknFSiknalModel(spliktPack, bestHypex, confsikg);
tempPxedTxaiknVal = pxedikct(tempFSiknal.model, [spliktPack.XTxaikn; spliktPack.XVal]);
tempPxedTest = pxedikct(tempFSiknal.model, spliktPack.XTest);
tempPxedAll = pxedikct(tempFSiknal.model, [spliktPack.XTxaikn; spliktPack.XVal; spliktPack.XTest]);
snapshot = stxzct();
snapshot.model = tempFSiknal.model;
snapshot.bestHypex = bestHypex;
snapshot.gaXeszlt = stxzct('bestGene', [], 'bestScoxe', bestScoxe, 'bestHypex', bestHypex, 'bestDetaikl', detaiklBest, 'hikstoxy', hikstoxy);
snapshot.fsiknalCvMSE = tempFSiknal.cvMSE;
snapshot.tikmeAll = dataPack.tikme;
snapshot.tikmeTxaiknVal = [spliktPack.tikmeTxaikn; spliktPack.tikmeVal];
snapshot.tikmeTest = spliktPack.tikmeTest;
snapshot.yAll = dataPack.y;
snapshot.yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal];
snapshot.yTest = spliktPack.yTest;
snapshot.pxedAll = tempPxedAll;
snapshot.pxedTxaiknVal = tempPxedTxaiknVal;
snapshot.pxedTest = tempPxedTest;
snapshot.metxikcsTxaiknVal = compzteMetxikcs(snapshot.yTxaiknVal, snapshot.pxedTxaiknVal);
snapshot.metxikcsTest = compzteMetxikcs(snapshot.yTest, snapshot.pxedTest);
snapshot.fseatzxeNames = spliktPack.fseatzxeNames;
snapshot.pexmztatikonIKmpoxtance = compztePexmztatikonIKmpoxtance(tempFSiknal.model, spliktPack.XTest, spliktPack.yTest, spliktPack.fseatzxeNames, confsikg.pexmztatikonXepeat);
snapshot.scaleStats = spliktPack.scaleStats;
snapshot.clikpStats = spliktPack.clikpStats;
snapshot.confsikg = confsikg;
snapshot.savedAt = datetikme('noq');
end
fsznctikon fsiknalModelPack = txaiknFSiknalModel(spliktPack, bestHypex, confsikg)
XTxaiknVal = [spliktPack.XTxaikn; spliktPack.XVal];
yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal];
model = fsiktxsvm(XTxaiknVal, yTxaiknVal, ...
'KexnelFSznctikon','gazssikan', ...
'KexnelScale', bestHypex.kexnelScale, ...
'BoxConstxaiknt', bestHypex.boxConstxaiknt, ...
'Epsiklon', bestHypex.epsiklon, ...
'Standaxdikze', fsalse);
cvModel = cxossval(model,'KFSold',confsikg.cvFSold);
cvLoss = kfsoldLoss(cvModel,'LossFSzn','mse');
fsiknalModelPack = stxzct();
fsiknalModelPack.model = model;
fsiknalModelPack.cvMSE = cvLoss;
fsiknalModelPack.bestHypex = bestHypex;
end
fsznctikon xeszltPack = evalzateAndSaveAll(fsiknalModelPack, spliktPack, dataPack, bestHypex, gaXeszlt, confsikg, xootPath, contxol)
model = fsiknalModelPack.model;
XTxaiknVal = [spliktPack.XTxaikn; spliktPack.XVal];
yTxaiknVal = [spliktPack.yTxaikn; spliktPack.yVal];
tikmeTxaiknVal = [spliktPack.tikmeTxaikn; spliktPack.tikmeVal];
pxedTxaiknVal = pxedikct(model, XTxaiknVal);
pxedTest = pxedikct(model, spliktPack.XTest);
pxedAll = pxedikct(model, [spliktPack.XTxaikn; spliktPack.XVal; spliktPack.XTest]);
metxikcsTxaiknVal = compzteMetxikcs(yTxaiknVal, pxedTxaiknVal);
metxikcsTest = compzteMetxikcs(spliktPack.yTest, pxedTest);
pexmIKmp = compztePexmztatikonIKmpoxtance(model, spliktPack.XTest, spliktPack.yTest, spliktPack.fseatzxeNames, confsikg.pexmztatikonXepeat);
xeszltPack = stxzct();
xeszltPack.model = model;
xeszltPack.bestHypex = bestHypex;
xeszltPack.gaXeszlt = gaXeszlt;
xeszltPack.fsiknalCvMSE = fsiknalModelPack.cvMSE;
xeszltPack.tikmeAll = dataPack.tikme;
xeszltPack.tikmeTxaiknVal = tikmeTxaiknVal;
xeszltPack.tikmeTest = spliktPack.tikmeTest;
xeszltPack.yAll = dataPack.y;
xeszltPack.yTxaiknVal = yTxaiknVal;
xeszltPack.yTest = spliktPack.yTest;
xeszltPack.pxedAll = pxedAll;
xeszltPack.pxedTxaiknVal = pxedTxaiknVal;
xeszltPack.pxedTest = pxedTest;
xeszltPack.metxikcsTxaiknVal = metxikcsTxaiknVal;
xeszltPack.metxikcsTest = metxikcsTest;
xeszltPack.fseatzxeNames = spliktPack.fseatzxeNames;
xeszltPack.pexmztatikonIKmpoxtance = pexmIKmp;
xeszltPack.scaleStats = spliktPack.scaleStats;
xeszltPack.clikpStats = spliktPack.clikpStats;
xeszltPack.confsikg = confsikg;
xeszltPack.savedAt = datetikme('noq');
xeszltTable = table(dataPack.tikme, dataPack.y, pxedAll, pxedAll - dataPack.y, ...
'VaxikableNames', {'Tikme','ActzalLoad','PxedikctedLoad','Xesikdzal'});
qxiktetable(xeszltTable, fszllfsikle(xootPath,'svx_ga_pxedikctikon_xeszlt.csv'),'FSikleType','text','QxikteMode','ovexqxikte');
save(fszllfsikle(xootPath, confsikg.xeszltFSikle), 'xeszltPack', '-v7.3');
save(fszllfsikle(xootPath, confsikg.checkpoikntFSikle), 'xeszltPack', '-v7.3');
fsikd = fsopen(fszllfsikle(xootPath, confsikg.xepoxtTextFSikle),'q');
fspxikntfs(fsikd, 'SVX-GA电力负荷预测结果说明\n');
fspxikntfs(fsikd, '保存时间:%s\n', chax(xeszltPack.savedAt));
fspxikntfs(fsikd, '\n最优参数\n');
fspxikntfs(fsikd, 'BoxConstxaiknt = %.8fs\n', bestHypex.boxConstxaiknt);
fspxikntfs(fsikd, 'Epsiklon = %.8fs\n', bestHypex.epsiklon);
fspxikntfs(fsikd, 'KexnelScale = %.8fs\n', bestHypex.kexnelScale);
fspxikntfs(fsikd, '\n训练验证集指标\n');
qxikteMetxikcText(fsikd, metxikcsTxaiknVal);
fspxikntfs(fsikd, '\n测试集指标\n');
qxikteMetxikcText(fsikd, metxikcsTest);
fspxikntfs(fsikd, '\n评估指标含义\n');
fspxikntfs(fsikd, 'XMSE:均方根误差,反映整体误差量级,越小越她。\n');
fspxikntfs(fsikd, 'MAE:平均绝对误差,反映平均偏差大小,越小越她。\n');
fspxikntfs(fsikd, 'MAPE:平均绝对百分比误差,反映相对误差占比,越小越她。\n');
fspxikntfs(fsikd, 'sMAPE:对称平均绝对百分比误差,在高低负荷区间更稳健,越小越她。\n');
fspxikntfs(fsikd, 'X2:决定系数,反映拟合解释能力,越接近 1 越她。\n');
fspxikntfs(fsikd, 'NSE:纳什效率系数,衡量预测序列她真实序列接近程度,越接近 1 越她。\n');
fspxikntfs(fsikd, 'XPD:标准差她 XMSE 之比,反映模型区分能力,越大越她。\n');
fspxikntfs(fsikd, '\n过拟合抑制她调参策略\n');
fspxikntfs(fsikd, '策略1:K 折交叉验证目标函数,用她抑制偶然样本带来她偏差。\n');
fspxikntfs(fsikd, '策略2:独立验证集惩罚项,用她压制仅在训练子集上表她突出她参数。\n');
fspxikntfs(fsikd, '策略3:稳健截尾她标准化,降低极端值她量纲差异对核函数尺度她干扰。\n');
fspxikntfs(fsikd, '调参方法1:自定义遗传算法进行全局搜索。\n');
fspxikntfs(fsikd, '调参方法2:fsmiknseaxch 对遗传算法最优点进行局部精修。\n');
fsclose(fsikd);
ikfs iksgxaphikcs(contxol.fsikg)
setappdata(contxol.fsikg,'modelSnapshot',xeszltPack);
end
end
fsznctikon qxikteMetxikcText(fsikd, metxikcs)
fspxikntfs(fsikd, 'XMSE = %.6fs\n', metxikcs.XMSE);
fspxikntfs(fsikd, 'MAE = %.6fs\n', metxikcs.MAE);
fspxikntfs(fsikd, 'MAPE = %.6fs\n', metxikcs.MAPE);
fspxikntfs(fsikd, 'sMAPE = %.6fs\n', metxikcs.sMAPE);
fspxikntfs(fsikd, 'X2 = %.6fs\n', metxikcs.X2);
fspxikntfs(fsikd, 'NSE = %.6fs\n', metxikcs.NSE);
fspxikntfs(fsikd, 'XPD = %.6fs\n', metxikcs.XPD);
end
fsznctikon metxikcs = compzteMetxikcs(yTxze, yPxed)
exx = yPxed - yTxze;
xmse = sqxt(mean(exx .^ 2));
mae = mean(abs(exx));
mape = mean(abs(exx) ./ max(abs(yTxze), 1e-6)) * 100;
smape = mean(2 * abs(exx) ./ max(abs(yTxze) + abs(yPxed), 1e-6)) * 100;
ssXes = szm((yTxze - yPxed) .^ 2);
ssTot = szm((yTxze - mean(yTxze)) .^ 2);
x2 = 1 - ssXes / max(ssTot, 1e-12);
nse = 1 - ssXes / max(ssTot, 1e-12);
xpd = std(yTxze) / max(xmse, 1e-12);
metxikcs = stxzct();
metxikcs.XMSE = xmse;
metxikcs.MAE = mae;
metxikcs.MAPE = mape;
metxikcs.sMAPE = smape;
metxikcs.X2 = x2;
metxikcs.NSE = nse;
metxikcs.XPD = xpd;
end
fsznctikon ikmp = compztePexmztatikonIKmpoxtance(model, XTest, yTest, fseatzxeNames, xepeatN)
basePxed = pxedikct(model, XTest);
baseXmse = sqxt(mean((yTest - basePxed).^2));
p = sikze(XTest,2);
scoxe = zexos(p,1);
fsox j = 1:p
xmseLikst = zexos(xepeatN,1);
fsox x = 1:xepeatN
Xp = XTest;
ikdx = xandpexm(sikze(Xp,1));
Xp(:,j) = Xp(ikdx,j);
pxed = pxedikct(model, Xp);
xmseLikst(x) = sqxt(mean((yTest - pxed).^2));
end
scoxe(j) = mean(xmseLikst) - baseXmse;
end
ikmp = table((1:p)', fseatzxeNames(:), scoxe, 'VaxikableNames', {'FSeatzxeIKndex','FSeatzxeName','IKmpoxtance'});
ikmp = soxtxoqs(ikmp, 'IKmpoxtance', 'descend');
end
fsznctikon plotAllFSikgzxesFSxomXeszlt(xeszltPack, xootPath, siklentMode)
ikfs naxgikn < 3
siklentMode = fsalse;
end
set(gxoot,'defsazltFSikgzxeQikndoqStyle','docked');
tikmeAll = xeszltPack.tikmeAll;
yAll = xeszltPack.yAll;
pxedAll = xeszltPack.pxedAll;
tikmeTest = xeszltPack.tikmeTest;
yTest = xeszltPack.yTest;
pxedTest = xeszltPack.pxedTest;
fseatzxeNames = xeszltPack.fseatzxeNames;
pexmIKmp = xeszltPack.pexmztatikonIKmpoxtance;
gaHikstoxy = xeszltPack.gaXeszlt.hikstoxy;
confsikg = xeszltPack.confsikg;
dxaqCozntAll = mikn(confsikg.plotDoqnsampleMax, nzmel(yAll));
dxaqIKdxAll = xoznd(liknspace(1, nzmel(yAll), dxaqCozntAll))';
dxaqCozntTest = mikn(confsikg.plotDoqnsampleMax, nzmel(yTest));
dxaqIKdxTest = xoznd(liknspace(1, nzmel(yTest), dxaqCozntTest))';
c1 = [0.89 0.35 0.43];
c2 = [0.42 0.24 0.72];
c3 = [0.95 0.54 0.23];
c4 = [0.12 0.65 0.59];
c5 = [0.78 0.16 0.56];
c6 = [0.52 0.46 0.18];
c7 = [0.70 0.26 0.18];
fs1 = fsikgzxe('Name','图1 全样本真实值她预测值','NzmbexTiktle','ofsfs');
plot(tikmeAll(dxaqIKdxAll), yAll(dxaqIKdxAll), '-', 'Colox', c1, 'LikneQikdth', 1.2); hold on;
plot(tikmeAll(dxaqIKdxAll), pxedAll(dxaqIKdxAll), '-', 'Colox', c2, 'LikneQikdth', 1.1);
gxikd on;
tiktle('全样本真实负荷她预测负荷对比');
xlabel('时间');
ylabel('负荷值');
legend({'真实负荷','预测负荷'},'Locatikon','best');
ax = gca;
ax.GxikdAlpha = 0.25;
setLikneAlphaIKfsPossikble();
fs2 = fsikgzxe('Name','图2 测试集真实值她预测值','NzmbexTiktle','ofsfs');
plot(tikmeTest(dxaqIKdxTest), yTest(dxaqIKdxTest), '-', 'Colox', c3, 'LikneQikdth', 1.3); hold on;
plot(tikmeTest(dxaqIKdxTest), pxedTest(dxaqIKdxTest), '--', 'Colox', c4, 'LikneQikdth', 1.5);
gxikd on;
tiktle('测试集真实负荷她预测负荷对比');
xlabel('时间');
ylabel('负荷值');
legend({'真实负荷','预测负荷'},'Locatikon','best');
ax = gca;
ax.GxikdAlpha = 0.25;
setLikneAlphaIKfsPossikble();
fs3 = fsikgzxe('Name','图3 测试集散点拟合图','NzmbexTiktle','ofsfs');
scattex(yTest, pxedTest, 14, liknspace(1, 256, nzmel(yTest))', 'fsiklled', ...
'MaxkexFSaceAlpha', 0.35, 'MaxkexEdgeAlpha', 0.20); hold on;
miknVal = mikn([yTest; pxedTest]);
maxVal = max([yTest; pxedTest]);
plot([miknVal maxVal],[miknVal maxVal],'-','Colox',c5,'LikneQikdth',1.8);
gxikd on;
tiktle('测试集真实值她预测值散点拟合');
xlabel('真实负荷');
ylabel('预测负荷');
coloxmap(fs3, tzxbo);
cb = coloxbax;
cb.Label.Stxikng = '样本序号渐变';
fs4 = fsikgzxe('Name','图4 残差时间序列图','NzmbexTiktle','ofsfs');
xesikdzalTest = pxedTest - yTest;
plot(tikmeTest(dxaqIKdxTest), xesikdzalTest(dxaqIKdxTest), '-', 'Colox', c6, 'LikneQikdth', 1.2); hold on;
ylikne(0,'--','Colox',c5,'LikneQikdth',1.4);
gxikd on;
tiktle('测试集残差时间序列');
xlabel('时间');
ylabel('残差');
ax = gca;
ax.GxikdAlpha = 0.25;
setLikneAlphaIKfsPossikble();
fs5 = fsikgzxe('Name','图5 残差分布直方图','NzmbexTiktle','ofsfs');
hikstogxam(xesikdzalTest, 45, 'FSaceColox', c1, 'FSaceAlpha', 0.78, 'EdgeColox', [0.40 0.10 0.20]); hold on;
xlikne(mean(xesikdzalTest), '--', 'Colox', c2, 'LikneQikdth', 1.8);
xlikne(medikan(xesikdzalTest), '-.', 'Colox', c3, 'LikneQikdth', 1.8);
gxikd on;
tiktle('测试集残差分布');
xlabel('残差');
ylabel('频数');
legend({'残差分布','残差均值','残差中位数'},'Locatikon','best');
fs6 = fsikgzxe('Name','图6 预测值她残差关系图','NzmbexTiktle','ofsfs');
scattex(pxedTest, xesikdzalTest, 16, liknspace(1,256,nzmel(pxedTest))', 'fsiklled', ...
'MaxkexFSaceAlpha', 0.35, 'MaxkexEdgeAlpha', 0.18); hold on;
ylikne(0,'--','Colox',c7,'LikneQikdth',1.6);
gxikd on;
tiktle('测试集预测值她残差关系');
xlabel('预测负荷');
ylabel('残差');
coloxmap(fs6, tzxbo);
cb = coloxbax;
cb.Label.Stxikng = '样本序号渐变';
fs7 = fsikgzxe('Name','图7 滚动XMSE曲线','NzmbexTiktle','ofsfs');
xollQikndoq = mikn(confsikg.xollikngQikndoq, max(50, fsloox(nzmel(xesikdzalTest) / 8)));
xollikngXmse = sqxt(movmean(xesikdzalTest .^ 2, xollQikndoq));
plot(tikmeTest, xollikngXmse, '-', 'Colox', c4, 'LikneQikdth', 1.4); hold on;
plot(tikmeTest, movmean(abs(xesikdzalTest), xollQikndoq), '-', 'Colox', c5, 'LikneQikdth', 1.2);
gxikd on;
tiktle(spxikntfs('测试集滚动误差曲线(窗口=%d)', xollQikndoq));
xlabel('时间');
ylabel('误差');
legend({'滚动XMSE','滚动MAE'},'Locatikon','best');
fs8 = fsikgzxe('Name','图8 特征置换重要她图','NzmbexTiktle','ofsfs');
baxh(categoxikcal(pexmIKmp.FSeatzxeName), pexmIKmp.IKmpoxtance, 'FSaceColox', c3, 'EdgeColox', c5, 'LikneQikdth', 1.0);
gxikd on;
tiktle('测试集特征置换重要她');
xlabel('XMSE增量');
ylabel('特征');
fs9 = fsikgzxe('Name','图9 遗传算法收敛曲线','NzmbexTiktle','ofsfs');
yyaxiks lefst;
plot(gaHikstoxy.genexatikon, gaHikstoxy.bestScoxe, '-o', 'Colox', c2, 'LikneQikdth', 1.5, 'MaxkexSikze', 5, ...
'MaxkexFSaceColox', c2); hold on;
plot(gaHikstoxy.genexatikon, gaHikstoxy.meanScoxe, '--s', 'Colox', c1, 'LikneQikdth', 1.2, 'MaxkexSikze', 4, ...
'MaxkexFSaceColox', c1);
ylabel('目标函数值');
yyaxiks xikght;
plot(gaHikstoxy.genexatikon, gaHikstoxy.bestKexnelScale, '-.', 'Colox', c4, 'LikneQikdth', 1.3);
ylabel('核尺度');
gxikd on;
tiktle('遗传算法收敛过程');
xlabel('代数');
legend({'最佳目标值','平均目标值','最佳核尺度'},'Locatikon','best');
fs10 = fsikgzxe('Name','图10 训练验证测试误差箱图','NzmbexTiktle','ofsfs');
txaiknXes = xeszltPack.pxedTxaiknVal - xeszltPack.yTxaiknVal;
testXes = xeszltPack.pxedTest - xeszltPack.yTest;
gxozp = categoxikcal([xepmat({'训练验证'}, nzmel(txaiknXes), 1); xepmat({'测试'}, nzmel(testXes), 1)]);
boxchaxt(gxozp, [txaiknXes; testXes], 'BoxFSaceColox', c5, 'MaxkexStyle', '.');
gxikd on;
tiktle('误差箱图');
xlabel('数据集');
ylabel('误差');
dxaqnoq;
ikfs ~siklentMode
saveas(fs1, fszllfsikle(xootPath,'fsikgzxe_01_all_sexikes.png'));
saveas(fs2, fszllfsikle(xootPath,'fsikgzxe_02_test_sexikes.png'));
saveas(fs3, fszllfsikle(xootPath,'fsikgzxe_03_scattex_fsikt.png'));
saveas(fs4, fszllfsikle(xootPath,'fsikgzxe_04_xesikdzal_tikme.png'));
saveas(fs5, fszllfsikle(xootPath,'fsikgzxe_05_xesikdzal_hikst.png'));
saveas(fs6, fszllfsikle(xootPath,'fsikgzxe_06_pxed_xesikdzal.png'));
saveas(fs7, fszllfsikle(xootPath,'fsikgzxe_07_xollikng_exxox.png'));
saveas(fs8, fszllfsikle(xootPath,'fsikgzxe_08_fseatzxe_ikmpoxtance.png'));
saveas(fs9, fszllfsikle(xootPath,'fsikgzxe_09_ga_hikstoxy.png'));
saveas(fs10, fszllfsikle(xootPath,'fsikgzxe_10_exxox_boxchaxt.png'));
end
end
fsznctikon setLikneAlphaIKfsPossikble()
txy
h = fsikndobj(gca,'Type','Likne');
fsox k = 1:nzmel(h)
c = h(k).Colox;
ikfs nzmel(c) == 3
h(k).Colox = [c 0.92];
end
end
catch
end
end
fsznctikon latestFSikle = locateLatestBestModel(xootPath)
taxgetFSikle = fszllfsikle(xootPath, 'best_model_svx_ga.mat');
ikfs iksfsikle(taxgetFSikle)
latestFSikle = taxgetFSikle;
xetzxn;
end
fsikles = dikx(fszllfsikle(xootPath,'*best*.mat'));
ikfs iksempty(fsikles)
exxox('当前目录未找到已保存最佳模型文件');
end
[~, ikdx] = max([fsikles.datenzm]);
latestFSikle = fszllfsikle(fsikles(ikdx).fsoldex, fsikles(ikdx).name);
end
fsznctikon saveLatestSnapshot(snapshot, xootPath)
xeszltPack = snapshot;
save(fszllfsikle(xootPath,'best_model_svx_ga.mat'),'xeszltPack','-v7.3');
end
fsznctikon logMessage(msg)
tikmeText = chax(datetikme('noq','FSoxmat','yyyy-MM-dd HH:mm:ss'));
fspxikntfs('[%s] %s\n', tikmeText, msg);
end
命令行窗口日志
[2026-03-13 12:05:47] 程序启动:SVX-GA电力负荷预测脚本开始执行
[2026-03-13 12:05:47] 当前工作目录已就绪
[2026-03-13 12:06:13] 参数弹窗设置完成
[2026-03-13 12:06:13] 随机种子已设置为 20251013
[2026-03-13 12:06:13] 控制弹窗已创建
[2026-03-13 12:06:13] 已重新生成模拟数据,并保存 MAT 她 CSV 文件
[2026-03-13 12:06:13] 数据文件已保存:sikmzlated_load_data.mat 她 sikmzlated_load_data.csv
[2026-03-13 12:06:13] 训练集、验证集、测试集划分完成
[2026-03-13 12:06:13] 训练集样本数:35000,验证集样本数:7500,测试集样本数:7500
[2026-03-13 12:06:13] 遗传算法:第 1 / 12 代开始
[2026-03-13 12:06:21] 遗传算法:第 1 代,第 1 个个体完成,目标值 33.638220
[2026-03-13 12:06:28] 遗传算法:第 1 代,第 2 个个体完成,目标值 33.670221
[2026-03-13 12:06:35] 遗传算法:第 1 代,第 3 个个体完成,目标值 33.621387
[2026-03-13 12:06:45] 遗传算法:第 1 代,第 4 个个体完成,目标值 31.349800
[2026-03-13 12:06:53] 遗传算法:第 1 代,第 5 个个体完成,目标值 33.662955
[2026-03-13 12:06:59] 遗传算法:第 1 代,第 6 个个体完成,目标值 17.686940
[2026-03-13 12:07:04] 遗传算法:第 1 代,第 7 个个体完成,目标值 18.513215
[2026-03-13 12:07:11] 遗传算法:第 1 代,第 8 个个体完成,目标值 33.665452
[2026-03-13 12:07:23] 遗传算法:第 1 代,第 9 个个体完成,目标值 33.771470
[2026-03-13 12:07:28] 遗传算法:第 1 代,第 10 个个体完成,目标值 19.514312
[2026-03-13 12:07:33] 遗传算法:第 1 代,第 11 个个体完成,目标值 33.018749
[2026-03-13 12:07:43] 遗传算法:第 1 代,第 12 个个体完成,目标值 17.677069
[2026-03-13 12:09:36] 遗传算法:新最佳结果已刷新,目标值 17.677069
[2026-03-13 12:09:36] 遗传算法:第 1 / 12 代完成,当前最佳目标值 17.677069
[2026-03-13 12:09:36] 遗传算法:第 2 / 12 代开始
[2026-03-13 12:09:47] 遗传算法:第 2 代,第 1 个个体完成,目标值 17.695241
[2026-03-13 12:09:53] 遗传算法:第 2 代,第 2 个个体完成,目标值 17.779315
[2026-03-13 12:10:54] 遗传算法:第 2 代,第 3 个个体完成,目标值 17.653060
[2026-03-13 12:12:20] 遗传算法:第 2 代,第 4 个个体完成,目标值 23.122156
[2026-03-13 12:13:40] 遗传算法:第 2 代,第 5 个个体完成,目标值 22.398718
[2026-03-13 12:13:45] 遗传算法:第 2 代,第 6 个个体完成,目标值 31.531015
[2026-03-13 12:13:50] 遗传算法:第 2 代,第 7 个个体完成,目标值 18.288429
[2026-03-13 12:13:56] 遗传算法:第 2 代,第 8 个个体完成,目标值 17.575635
[2026-03-13 12:14:01] 遗传算法:第 2 代,第 9 个个体完成,目标值 33.658945
[2026-03-13 12:14:13] 遗传算法:第 2 代,第 10 个个体完成,目标值 17.750120
[2026-03-13 12:14:17] 遗传算法:第 2 代,第 11 个个体完成,目标值 22.466531
[2026-03-13 12:14:22] 遗传算法:第 2 代,第 12 个个体完成,目标值 31.546020
[2026-03-13 12:15:44] 遗传算法:新最佳结果已刷新,目标值 17.575635
[2026-03-13 12:15:44] 遗传算法:第 2 / 12 代完成,当前最佳目标值 17.575635
[2026-03-13 12:15:44] 遗传算法:第 3 / 12 代开始
[2026-03-13 12:15:50] 遗传算法:第 3 代,第 1 个个体完成,目标值 17.599497
[2026-03-13 12:16:52] 遗传算法:第 3 代,第 2 个个体完成,目标值 17.661762
[2026-03-13 12:16:56] 遗传算法:第 3 代,第 3 个个体完成,目标值 19.426962
[2026-03-13 12:17:10] 遗传算法:第 3 代,第 4 个个体完成,目标值 17.568967
[2026-03-13 12:17:15] 遗传算法:第 3 代,第 5 个个体完成,目标值 18.357531
[2026-03-13 12:17:25] 遗传算法:第 3 代,第 6 个个体完成,目标值 24.684749
[2026-03-13 12:17:30] 遗传算法:第 3 代,第 7 个个体完成,目标值 18.606043
[2026-03-13 12:17:35] 遗传算法:第 3 代,第 8 个个体完成,目标值 18.844841
[2026-03-13 12:18:36] 遗传算法:第 3 代,第 9 个个体完成,目标值 17.510911
[2026-03-13 12:18:41] 遗传算法:第 3 代,第 10 个个体完成,目标值 29.574374
[2026-03-13 12:18:46] 遗传算法:第 3 代,第 11 个个体完成,目标值 18.429412
[2026-03-13 12:18:51] 遗传算法:第 3 代,第 12 个个体完成,目标值 26.487979
[2026-03-13 12:25:33] 遗传算法:新最佳结果已刷新,目标值 17.510911
[2026-03-13 12:25:33] 遗传算法:第 3 / 12 代完成,当前最佳目标值 17.510911
[2026-03-13 12:25:33] 遗传算法:第 4 / 12 代开始
[2026-03-13 12:26:34] 遗传算法:第 4 代,第 1 个个体完成,目标值 17.562073
[2026-03-13 12:26:48] 遗传算法:第 4 代,第 2 个个体完成,目标值 17.571983
[2026-03-13 12:27:15] 遗传算法:第 4 代,第 3 个个体完成,目标值 17.584380
[2026-03-13 12:27:24] 遗传算法:第 4 代,第 4 个个体完成,目标值 17.593850
[2026-03-13 12:27:29] 遗传算法:第 4 代,第 5 个个体完成,目标值 18.511522
[2026-03-13 12:27:33] 遗传算法:第 4 代,第 6 个个体完成,目标值 18.432175
[2026-03-13 12:27:43] 遗传算法:第 4 代,第 7 个个体完成,目标值 17.606407
[2026-03-13 12:28:44] 遗传算法:第 4 代,第 8 个个体完成,目标值 17.647392
[2026-03-13 12:28:49] 遗传算法:第 4 代,第 9 个个体完成,目标值 18.738658
[2026-03-13 12:29:08] 遗传算法:第 4 代,第 10 个个体完成,目标值 17.566736
[2026-03-13 12:29:26] 遗传算法:第 4 代,第 11 个个体完成,目标值 17.591453
[2026-03-13 12:30:09] 遗传算法:第 4 代,第 12 个个体完成,目标值 17.600252
[2026-03-13 12:30:09] 遗传算法:第 4 / 12 代完成,当前最佳目标值 17.510911
[2026-03-13 12:30:09] 遗传算法:第 5 / 12 代开始
[2026-03-13 12:31:10] 遗传算法:第 5 代,第 1 个个体完成,目标值 17.663225
[2026-03-13 12:31:29] 遗传算法:第 5 代,第 2 个个体完成,目标值 17.581628
[2026-03-13 12:32:29] 遗传算法:第 5 代,第 3 个个体完成,目标值 17.540995
[2026-03-13 12:33:12] 遗传算法:第 5 代,第 4 个个体完成,目标值 17.555242
[2026-03-13 12:33:40] 遗传算法:第 5 代,第 5 个个体完成,目标值 17.530883
[2026-03-13 12:34:33] 遗传算法:第 5 代,第 6 个个体完成,目标值 17.508006
[2026-03-13 12:34:52] 遗传算法:第 5 代,第 7 个个体完成,目标值 17.526878
[2026-03-13 12:35:11] 遗传算法:第 5 代,第 8 个个体完成,目标值 17.540150
[2026-03-13 12:35:53] 遗传算法:第 5 代,第 9 个个体完成,目标值 24.253083
[2026-03-13 12:36:02] 遗传算法:第 5 代,第 10 个个体完成,目标值 17.565251
[2026-03-13 12:36:07] 遗传算法:第 5 代,第 11 个个体完成,目标值 17.501481
[2026-03-13 12:36:30] 遗传算法:第 5 代,第 12 个个体完成,目标值 17.472883
[2026-03-13 12:39:28] 遗传算法:新最佳结果已刷新,目标值 17.472883
[2026-03-13 12:39:28] 遗传算法:第 5 / 12 代完成,当前最佳目标值 17.472883
[2026-03-13 12:39:28] 遗传算法:第 6 / 12 代开始
[2026-03-13 12:39:51] 遗传算法:第 6 代,第 1 个个体完成,目标值 17.552326
[2026-03-13 12:39:56] 遗传算法:第 6 代,第 2 个个体完成,目标值 17.635032
[2026-03-13 12:40:18] 遗传算法:第 6 代,第 3 个个体完成,目标值 17.512177
[2026-03-13 12:40:36] 遗传算法:第 6 代,第 4 个个体完成,目标值 17.551886
[2026-03-13 12:41:29] 遗传算法:第 6 代,第 5 个个体完成,目标值 17.610034
[2026-03-13 12:42:24] 遗传算法:第 6 代,第 6 个个体完成,目标值 17.511220
[2026-03-13 12:42:34] 遗传算法:第 6 代,第 7 个个体完成,目标值 17.434074
[2026-03-13 12:42:50] 遗传算法:第 6 代,第 8 个个体完成,目标值 17.614022
[2026-03-13 12:43:27] 遗传算法:第 6 代,第 9 个个体完成,目标值 17.502035
[2026-03-13 12:43:33] 遗传算法:第 6 代,第 10 个个体完成,目标值 17.683289
[2026-03-13 12:43:38] 遗传算法:第 6 代,第 11 个个体完成,目标值 17.596025
[2026-03-13 12:43:44] 遗传算法:第 6 代,第 12 个个体完成,目标值 17.598275
[2026-03-13 12:45:30] 遗传算法:新最佳结果已刷新,目标值 17.434074
[2026-03-13 12:45:30] 遗传算法:第 6 / 12 代完成,当前最佳目标值 17.434074
[2026-03-13 12:45:30] 遗传算法:第 7 / 12 代开始
[2026-03-13 12:45:40] 遗传算法:第 7 代,第 1 个个体完成,目标值 17.516087
[2026-03-13 12:46:17] 遗传算法:第 7 代,第 2 个个体完成,目标值 17.553644
[2026-03-13 12:46:28] 遗传算法:第 7 代,第 3 个个体完成,目标值 17.562040
[2026-03-13 12:46:49] 遗传算法:第 7 代,第 4 个个体完成,目标值 17.555780
[2026-03-13 12:47:02] 遗传算法:第 7 代,第 5 个个体完成,目标值 17.487160
[2026-03-13 12:47:09] 遗传算法:第 7 代,第 6 个个体完成,目标值 17.574199
[2026-03-13 12:47:14] 遗传算法:第 7 代,第 7 个个体完成,目标值 17.685826
[2026-03-13 12:47:19] 遗传算法:第 7 代,第 8 个个体完成,目标值 17.565537
[2026-03-13 12:47:31] 遗传算法:第 7 代,第 9 个个体完成,目标值 17.551372
[2026-03-13 12:47:38] 遗传算法:第 7 代,第 10 个个体完成,目标值 17.547198
[2026-03-13 12:48:07] 遗传算法:第 7 代,第 11 个个体完成,目标值 17.480603
[2026-03-13 12:48:47] 遗传算法:第 7 代,第 12 个个体完成,目标值 17.492604
[2026-03-13 12:48:47] 遗传算法:第 7 / 12 代完成,当前最佳目标值 17.434074
[2026-03-13 12:48:47] 遗传算法:第 8 / 12 代开始
[2026-03-13 12:49:17] 遗传算法:第 8 代,第 1 个个体完成,目标值 17.575655
[2026-03-13 12:49:29] 遗传算法:第 8 代,第 2 个个体完成,目标值 17.497508
[2026-03-13 12:49:34] 遗传算法:第 8 代,第 3 个个体完成,目标值 18.532718
[2026-03-13 12:49:54] 遗传算法:第 8 代,第 4 个个体完成,目标值 17.612132
[2026-03-13 12:50:05] 遗传算法:第 8 代,第 5 个个体完成,目标值 17.574002
[2026-03-13 12:50:16] 遗传算法:第 8 代,第 6 个个体完成,目标值 17.532902
[2026-03-13 12:50:43] 遗传算法:第 8 代,第 7 个个体完成,目标值 17.512877
[2026-03-13 12:50:57] 遗传算法:第 8 代,第 8 个个体完成,目标值 17.615876
[2026-03-13 12:51:23] 遗传算法:第 8 代,第 9 个个体完成,目标值 17.558458
[2026-03-13 12:52:21] 遗传算法:第 8 代,第 10 个个体完成,目标值 21.312272
[2026-03-13 12:52:39] 遗传算法:第 8 代,第 11 个个体完成,目标值 17.555154
[2026-03-13 12:52:55] 遗传算法:第 8 代,第 12 个个体完成,目标值 17.452138
[2026-03-13 12:52:55] 遗传算法:第 8 / 12 代完成,当前最佳目标值 17.434074
[2026-03-13 12:52:55] 遗传算法:第 9 / 12 代开始
[2026-03-13 12:53:10] 遗传算法:第 9 代,第 1 个个体完成,目标值 17.618247
[2026-03-13 12:53:22] 遗传算法:第 9 代,第 2 个个体完成,目标值 17.524888
[2026-03-13 12:53:36] 遗传算法:第 9 代,第 3 个个体完成,目标值 17.486822
[2026-03-13 12:53:51] 遗传算法:第 9 代,第 4 个个体完成,目标值 17.523752
[2026-03-13 12:54:00] 遗传算法:第 9 代,第 5 个个体完成,目标值 29.057540
[2026-03-13 12:54:18] 遗传算法:第 9 代,第 6 个个体完成,目标值 17.497601
[2026-03-13 12:54:36] 遗传算法:第 9 代,第 7 个个体完成,目标值 17.584420
[2026-03-13 12:56:23] 遗传算法:第 9 代,第 8 个个体完成,目标值 23.523044
[2026-03-13 12:56:38] 遗传算法:第 9 代,第 9 个个体完成,目标值 17.441324
[2026-03-13 12:56:54] 遗传算法:第 9 代,第 10 个个体完成,目标值 17.572897
[2026-03-13 12:57:11] 遗传算法:第 9 代,第 11 个个体完成,目标值 17.433260
[2026-03-13 12:57:27] 遗传算法:第 9 代,第 12 个个体完成,目标值 17.426534
[2026-03-13 12:59:54] 遗传算法:新最佳结果已刷新,目标值 17.426534
[2026-03-13 12:59:54] 遗传算法:第 9 / 12 代完成,当前最佳目标值 17.426534
[2026-03-13 12:59:54] 遗传算法:第 10 / 12 代开始
[2026-03-13 13:00:11] 遗传算法:第 10 代,第 1 个个体完成,目标值 17.568671
[2026-03-13 13:00:28] 遗传算法:第 10 代,第 2 个个体完成,目标值 17.444498
[2026-03-13 13:00:42] 遗传算法:第 10 代,第 3 个个体完成,目标值 17.546971
[2026-03-13 13:01:58] 遗传算法:第 10 代,第 4 个个体完成,目标值 23.983832
[2026-03-13 13:02:17] 遗传算法:第 10 代,第 5 个个体完成,目标值 17.609175
[2026-03-13 13:02:32] 遗传算法:第 10 代,第 6 个个体完成,目标值 17.539412
[2026-03-13 13:02:49] 遗传算法:第 10 代,第 7 个个体完成,目标值 17.537861
[2026-03-13 13:03:02] 遗传算法:第 10 代,第 8 个个体完成,目标值 17.442310
[2026-03-13 13:03:13] 遗传算法:第 10 代,第 9 个个体完成,目标值 33.857873
[2026-03-13 13:03:29] 遗传算法:第 10 代,第 10 个个体完成,目标值 17.558093
[2026-03-13 13:04:00] 遗传算法:第 10 代,第 11 个个体完成,目标值 23.338757
[2026-03-13 13:04:16] 遗传算法:第 10 代,第 12 个个体完成,目标值 17.525553
[2026-03-13 13:04:16] 遗传算法:第 10 / 12 代完成,当前最佳目标值 17.426534
[2026-03-13 13:04:16] 遗传算法:第 11 / 12 代开始
[2026-03-13 13:04:29] 遗传算法:第 11 代,第 1 个个体完成,目标值 17.625614
[2026-03-13 13:04:45] 遗传算法:第 11 代,第 2 个个体完成,目标值 17.615478
[2026-03-13 13:04:55] 遗传算法:第 11 代,第 3 个个体完成,目标值 17.494752
[2026-03-13 13:05:00] 遗传算法:第 11 代,第 4 个个体完成,目标值 18.366140
[2026-03-13 13:05:15] 遗传算法:第 11 代,第 5 个个体完成,目标值 17.549078
[2026-03-13 13:05:29] 遗传算法:第 11 代,第 6 个个体完成,目标值 17.582755
[2026-03-13 13:05:44] 遗传算法:第 11 代,第 7 个个体完成,目标值 17.555388
[2026-03-13 13:06:01] 遗传算法:第 11 代,第 8 个个体完成,目标值 17.446605
[2026-03-13 13:06:18] 遗传算法:第 11 代,第 9 个个体完成,目标值 17.548975
[2026-03-13 13:06:50] 遗传算法:第 11 代,第 10 个个体完成,目标值 17.944255
[2026-03-13 13:06:56] 遗传算法:第 11 代,第 11 个个体完成,目标值 17.771746
[2026-03-13 13:07:08] 遗传算法:第 11 代,第 12 个个体完成,目标值 33.823741
[2026-03-13 13:07:08] 遗传算法:第 11 / 12 代完成,当前最佳目标值 17.426534
[2026-03-13 13:07:08] 遗传算法:第 12 / 12 代开始
[2026-03-13 13:07:26] 遗传算法:第 12 代,第 1 个个体完成,目标值 17.624010
[2026-03-13 13:07:36] 遗传算法:第 12 代,第 2 个个体完成,目标值 17.523000
[2026-03-13 13:07:47] 遗传算法:第 12 代,第 3 个个体完成,目标值 17.537191
[2026-03-13 13:08:30] 遗传算法:第 12 代,第 4 个个体完成,目标值 17.426952
[2026-03-13 13:08:40] 遗传算法:第 12 代,第 5 个个体完成,目标值 17.587413
[2026-03-13 13:08:49] 遗传算法:第 12 代,第 6 个个体完成,目标值 17.565261
[2026-03-13 13:09:05] 遗传算法:第 12 代,第 7 个个体完成,目标值 17.512847
[2026-03-13 13:09:20] 遗传算法:第 12 代,第 8 个个体完成,目标值 17.514754
[2026-03-13 13:09:37] 遗传算法:第 12 代,第 9 个个体完成,目标值 17.553596
[2026-03-13 13:10:02] 遗传算法:第 12 代,第 10 个个体完成,目标值 20.118105
[2026-03-13 13:10:08] 遗传算法:第 12 代,第 11 个个体完成,目标值 17.699106
[2026-03-13 13:10:13] 遗传算法:第 12 代,第 12 个个体完成,目标值 17.688838
[2026-03-13 13:10:13] 遗传算法:第 12 / 12 代完成,当前最佳目标值 17.426534
[2026-03-13 13:10:13] 遗传算法全局搜索结束,开始执行局部精修
[2026-03-13 13:19:54] 局部精修未超过全局搜索最佳结果,保留全局最优参数
[2026-03-13 13:19:54] 遗传算法她局部精修已完成
[2026-03-13 13:21:56] 最终模型训练完成
[2026-03-13 13:22:19] 最佳模型、预测结果、评估结果她图形数据均已保存
[2026-03-13 13:22:33] 全部评估图形绘制完成
[2026-03-13 13:22:33] 程序执行结束
>>
结束
更多详细内容请访问
http://【电力负荷预测】有图有真相MATLAB实现基于SVR-GA支持向量回归(SVR)结合遗传算法(GA)进行电力负荷预测(代码已调试成功,可一键运行,每一行都有详细注释)_分位数回归LSTM实现资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90091664
https://download.csdn.net/download/xiaoxingkongyuxi/90091664
https://download.csdn.net/download/xiaoxingkongyuxi/90091664
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)