首页 > 解决方案 > Matlab:Nonlcon 对我的 GA 不满意

问题描述

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

非图标

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_2,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

遗传算法发起者

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 < 0(ConstraintTolerance 的选项保留为默认值 1e-3,但个人有时会违反此容差)。

例如,遗传算法提出的其中一个个体的矩阵被附加为图像。 当在矩阵上试验 nonlcon 时,至少有 35 个案例 c > 0。

任何形式的帮助都非常感谢

由 GA 为 n_piles=10 生成的 vars 矩阵示例

标签: matlabgenetic-algorithm

解决方案


推荐阅读