Matlab:Nonlcon 在我的 GA 中不满意

问题描述

我正在使用 GA 函数,它在具有边界的矩形平面中搜索一组“n_piles”(x 和 y 坐标)点的最佳位置。 (n_piles 是点数)。 GA 变量数是 n_piles 的 3 倍,因为它们代表这些桩的倾角(第三个变量表示为 1 到 5 的整数,但它们不是非 lcons 方程的一部分)。 使用 nonlcon,因此每个点 (x,y) 至少相隔距离 D_min。辅助函数用于计算不等式的数量和要相互比较的变量的索引。接下来我附上代码

非lcon

function [c,ceq] = pile_heads_separation3D(vars)
%%This constraint function keeps the pile heads separated by D = 4*d_piles

load ('inputSeparation3D.mat','n_piles','N_separation','d_piles')
[n_ineq,idx_2,idx_3] = constraint_indexes3D(n_piles);
D_min = round(N_separation*d_piles,1);              %minsta pålavtånd (m)

for i=1:1:n_ineq
    c(:,i) = (D_min.^2) -...
        ((vars(:,idx_3(i)) - vars(:,idx_2(i))).^2)...
        - ((vars(:,n_piles+idx_3(i)) - vars(:,n_piles+idx_2(i))).^2);
end
   ceq = []; 
end

索引

function [n_ineq,idx_3] = constraint_indexes3D(n_piles)

if n_piles > 1
    n_ineq = nchoosek(n_piles,2);                    %number of inequalities
    
    j_1=1;
    idx_2=[];                                       %required index to fill the A matrix columns(i)
    for i=1:n_piles-j_1
        idx_2 = vertcat(idx_2,i*ones((n_piles-j_1),1));
        j_1=j_1+1;
    end
    j_1=1;
    
    idx_3=[];                                       %required index to fill the A matrix columns(j)
    for i=1:1:n_piles-1
        for j=j_1+1:1:n_piles
            idx_3 = vertcat(idx_3,j*ones(1,1));
        end
        j_1=j_1+1;
    end
else
    n_ineq = [];
    idx_2 = [];
    idx_3 = [];
end
end

GA 发起者

d_piles = 0.170;                    %Piles section diameter (m)
n_piles = 5;                       %number of piles
N_separation = 4;                   %minsta pålavstånd
D_border = 0.5;
L_x = 5.40;                        %Pile cap x_dimension (m)
L_y = 10.00;                         %Pile cap y_dimension (m)


lb_x = (-0.5*L_x+D_border)*ones(1,n_piles);    %lower boundary for support position
lb_y = (-0.5*L_y+D_border)*ones(1,n_piles);    %lower boundary for support position
lb_dir = ones(1,n_piles);                  %lower boundary for pile direction    
lb = cat(2,lb_x,lb_y,lb_dir);
ub_x = (0.5*L_x-D_border)*ones(1,n_piles);     %upper boundary for support position
ub_y = (0.5*L_y-D_border)*ones(1,n_piles);     %upper boundary for support position
ub_dir = 5*ones(1,n_piles);                  %upper boundary for pile direction
ub = cat(2,ub_x,ub_y,ub_dir);

nonlcon = @pile_heads_separation3D;
IntCon = 2*n_piles+1:1:3*n_piles; %the inclination explained at the beggining

[vars,alpha,exitflag,output,population,scores] = ga(fun,3*n_piles,[],lb,ub,IntCon,options);

问题是当我试用时,有几个个体不满足c (ConstraintTolerance的选项保留为认1e-3,但个体有时会违反此容忍度) .

例如,GA 提出的其中一个个体的矩阵作为图像附加。 在矩阵上试验 nonlcon 时,至少有 35 种情况 c > 0。

非常感谢任何形式的帮助

example of vars matrix generated by GA for n_piles=10

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)