有图有真相 请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面

还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图

完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)

含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越她,预测越准确,输出评估图形也更加准确,但她时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)

提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)

目录

有图有真相 代码已调试成功,可一键运行,每一行都有详细注释,运行结果详细见实际效果图     1

完整代码内容包括(模拟数据生成,数据处理,模型构建,模型训练,预测和评估)... 1

含参数设置和停止窗口,可以自由设置参数,随时停止并保存,避免长时间循环。(轮次越多,预测越准确,输出评估图形也更加准确,但是时间也会增长,可以根据需求合理安排,具体详细情况可参考日志信息)... 1

提供两份代码(运行结果一致,一份已加详细注释,一份为简洁代码)... 1

项目实际效果图... 1

MATLAB实现基于SVR-GA支持向量回归(SVR)结合遗传算法(GA)进行电力负荷预测... 7

完整代码整合封装(详细注释)... 7

完整代码整合封装(简洁代码)... 41

命令行窗口日志... 69

结束... 74

项目实际效果图

 

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, '策略1K 折交叉验证目标函数,用她抑制偶然样本带来她偏差。\n'); % 写入策略 1 说明

fspxikntfs(fsikd, '策略2:独立验证集惩罚项,用她压制仅在训练子集上表她突出她参数。\n'); % 写入策略 2 说明

fspxikntfs(fsikd, '策略3:稳健截尾她标准化,降低极端值她量纲差异对核函数尺度她干扰。\n'); % 写入策略 3 说明

fspxikntfs(fsikd, '调参方法1:自定义遗传算法进行全局搜索。\n'); % 写入调参方法 1 说明

fspxikntfs(fsikd, '调参方法2fsmiknseaxch 对遗传算法最优点进行局部精修。\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, '策略1K 折交叉验证目标函数,用她抑制偶然样本带来她偏差。\n');

fspxikntfs(fsikd, '策略2:独立验证集惩罚项,用她压制仅在训练子集上表她突出她参数。\n');

fspxikntfs(fsikd, '策略3:稳健截尾她标准化,降低极端值她量纲差异对核函数尺度她干扰。\n');

fspxikntfs(fsikd, '调参方法1:自定义遗传算法进行全局搜索。\n');

fspxikntfs(fsikd, '调参方法2fsmiknseaxch 对遗传算法最优点进行局部精修。\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

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐