Box进化搜索算法Matlab代码陷入死循环求助
问题:Box进化算法求解非线性方程组时陷入死循环
需要用Box Evolutionary优化算法求解区间0 ≤ x, y ≤ 5内的非线性方程组:
x² + y = 11
x + y² = 7
初始点设为𝑋=(x,y)ᵀ=(1,1)ᵀ,缩减参数delta=(2,2)ᵀ,但编写的Matlab代码运行时陷入死循环,代码如下:
clc clear syms x y e=1; a=2; f(x,y)=(x^2+y-11)^2; g(x,y)=(x+y^2-7)^2; k=1; while(k~=0) d1=2; d2=2; D=(d1^2+d2^2)^(0.5); x0=1; y0=1; xb1=x0; xb2=y0; x1=xb1+d1/2; y1=xb2+d2/2; x2=xb1+d1/2; y2=xb2-d2/2; x3=xb1-d1/2; y3=xb2+d2/2; x4=xb1-d1/2; y4=xb2-d2/2; f1=f(x1,y1)+g(x1,y1); f2=f(x2,y2)+g(x2,y2); f3=f(x3,y3)+g(x3,y3); f4=f(x4,y4)+g(x4,y4); if f1<f2 && f1<f3 && f1<f4 xb1=x1; xb2=y1; elseif f2<f1 && f2<f3 && f2<f4 xb1=x2; xb2=y2; elseif f3<f1 && f3<f2 && f3<f4 xb1=x3; xb2=y3; elseif f4<f1 && f4<f2 && f4<f3 xb1=x4; xb2=y4; end if xb1==x0 && xb2==y0 d1=d1/a; d2=d2/a; if D<e disp("x value is") disp(xb1) k=0; break end else x0=xb1; y0=xb2; end end
问题排查与修复
核心错误点
- 循环内重置关键变量:每次循环都将
d1=2、d2=2、x0=1、y0=1强制重置,导致算法无法迭代更新搜索步长和当前最优点,永远停留在初始状态,直接陷入死循环。 - 步长终止判断逻辑错误:
D用初始固定的d1=2、d2=2计算,结果恒为√8≈2.828,永远大于e=1,终止条件永远无法触发。 - 缺失区间约束:未对生成的候选点做
0 ≤ x, y ≤ 5的边界检查,可能搜索到无效区域。 - 符号函数冗余:使用
syms定义符号函数会大幅降低计算效率,数值优化场景下直接用数值函数即可。
修复后的代码
clc clear % 定义目标函数:方程组残差平方和 obj_fun = @(x,y) (x^2 + y - 11).^2 + (x + y^2 - 7).^2; e = 1e-3; % 调整终止阈值,更符合数值优化精度要求 a = 2; % 步长缩减系数 % 初始化迭代参数(移到循环外,避免每次重置) x0 = 1; y0 = 1; d1 = 2; d2 = 2; k = 1; while k ~= 0 D = sqrt(d1^2 + d2^2); xb1 = x0; xb2 = y0; % 生成四个候选点并做区间约束,确保在[0,5]范围内 x1 = max(0, min(5, xb1 + d1/2)); y1 = max(0, min(5, xb2 + d2/2)); x2 = max(0, min(5, xb1 + d1/2)); y2 = max(0, min(5, xb2 - d2/2)); x3 = max(0, min(5, xb1 - d1/2)); y3 = max(0, min(5, xb2 + d2/2)); x4 = max(0, min(5, xb1 - d1/2)); y4 = max(0, min(5, xb2 - d2/2)); % 计算候选点的目标函数值 f1 = obj_fun(x1,y1); f2 = obj_fun(x2,y2); f3 = obj_fun(x3,y3); f4 = obj_fun(x4,y4); % 选择最优候选点,简化判断逻辑 min_f = min([f1,f2,f3,f4]); if f1 == min_f xb1 = x1; xb2 = y1; elseif f2 == min_f xb1 = x2; xb2 = y2; elseif f3 == min_f xb1 = x3; xb2 = y3; else xb1 = x4; xb2 = y4; end % 更新迭代逻辑 if xb1 == x0 && xb2 == y0 % 未找到更优点,缩减步长 d1 = d1 / a; d2 = d2 / a; % 检查终止条件(用更新后的步长计算D) if sqrt(d1^2 + d2^2) < e fprintf('求解完成,x值为:%.4f,y值为:%.4f\n', xb1, xb2); k = 0; end else % 更新当前最优点 x0 = xb1; y0 = xb2; end end
修复说明
- 将
x0、y0、d1、d2移到循环外初始化,保证迭代过程中变量能持续更新。 - 调整终止阈值
e为1e-3,更符合数值优化的精度需求。 - 新增区间约束逻辑,确保所有候选点在指定范围内搜索。
- 改用匿名函数替代符号函数,提升计算效率。
- 简化最优点选择逻辑,避免多重条件嵌套的遗漏问题。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

