如何通过Ctrl+C终止Matlab的fminsearch并保留当前最优解?
手动终止Matlab fminsearch并保留当前最优解的方法
方法1:使用输出函数(OutputFcn)保存迭代进度
这是最安全且无需修改内置函数的方案,通过自定义输出函数在每次迭代时自动保存当前最优解,即使按Ctrl+C终止,也能拿到最后一次迭代的结果。
- 新建一个名为
saveCurrentSolution.m的函数文件,内容如下:
function stop = saveCurrentSolution(x, optimValues, state) stop = false; % 不终止迭代,仅执行保存操作 % 将当前最优解和目标函数值同步到工作区 assignin('base', 'currentBestX', x); assignin('base', 'currentBestFval', optimValues.fval); % 同时保存到本地文件,防止MATLAB意外崩溃导致数据丢失 save('fminsearch_progress.mat', 'currentBestX', 'currentBestFval'); end
- 调用fminsearch时指定该输出函数:
% 替换为你的目标函数和初始猜测值 objFunc = @(x) your_objective_function(x); initialGuess = [1, 2, 3]; % 配置优化选项,绑定自定义输出函数 options = optimset('OutputFcn', @saveCurrentSolution); % 启动fminsearch [x, fval] = fminsearch(objFunc, initialGuess, options);
当你按Ctrl+C终止程序后,工作区的currentBestX和currentBestFval就是最后一次迭代的最优解;如果MATLAB意外崩溃,也可以通过load('fminsearch_progress.mat')读取本地备份的数据。
方法2:修改fminsearch内置函数(谨慎使用)
如果需要更直接的中断处理,可以修改fminsearch的源代码,但务必先备份原文件,避免影响其他场景的使用。
- 在MATLAB命令行输入
which fminsearch,找到函数文件路径并打开编辑。 - 定位到迭代循环的核心部分(通常是
while循环),在循环内部插入以下代码:
% 每次迭代时保存当前解到工作区 assignin('base', 'currentX', x); assignin('base', 'currentFval', fval); % 捕获Ctrl+C中断,保存最终解后再抛出异常 try % 保留原循环内的迭代逻辑代码 catch ME if strcmp(ME.identifier, 'MATLAB:ctrlc') assignin('base', 'finalX', x); assignin('base', 'finalFval', fval); rethrow(ME); % 继续触发中断,但已提前保存解 end end
修改后保存文件,下次调用fminsearch时,按Ctrl+C会自动将中断前的最后一组解保存到工作区的finalX和finalFval中。
注意事项
- 输出函数会在迭代的不同阶段触发(如
init、iter、done),上述代码确保每次迭代都执行保存操作。 - 如果目标函数计算耗时较长,保存操作的性能开销可以忽略,优先选择方法1。
- 使用文件保存时,每次迭代会自动覆盖旧文件,避免占用过多磁盘空间。
内容的提问来源于stack exchange,提问作者Gappy Hilmore
相关产品推荐
相关产品推荐

