You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题排查与修复

核心错误点

  1. 循环内重置关键变量:每次循环都将d1=2、d2=2、x0=1、y0=1强制重置,导致算法无法迭代更新搜索步长和当前最优点,永远停留在初始状态,直接陷入死循环。
  2. 步长终止判断逻辑错误:D用初始固定的d1=2、d2=2计算,结果恒为√8≈2.828,永远大于e=1,终止条件永远无法触发。
  3. 缺失区间约束:未对生成的候选点做0 ≤ x, y ≤ 5的边界检查,可能搜索到无效区域。
  4. 符号函数冗余:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:05:14