我想制作一个执行以下操作的 GA:
- 找到复合材料中满足 D(2,2) >= 210 且不失效(安全系数 > 0)的最小层数
我的目标函数是
function f = gaObjective(x,infLoc)
f = numel(x(x~=infLoc));
end
% x is the stacking sequence
% empty layer are indicated by 'inf' value, therefore I delete those before determining the number of layers
我使用了 MATLAB GA
[x, fval, exitflag, output, population, score] = ...
ga(@(X)gaObjective(X,infLoc),inLamSize, [], [], [], [], ...
lb, ub, @(X)gaConstraint(X, anglesLayup, matProp, extLoad), ...
1:inLamSize, opts);
重要的是要说明:
- X是我通过代码的层压板
- 我使用索引来表示层 1=-75°, 2=-60°, ..., 12=90°, 13=inf
- infLoc 表示对应于“inf”值的索引,该值表示一个空层
- lb 都是 1(最小索引)
- ub 都是 13(最大索引)
- inLamSize 是层的起始数量(例如,50)和变量的数量
- 所有变量都被认为是 lb-ub 之间的整数
我的目标函数是
function [Cineq, Ceq, outputCost] = gaConstraint(layup, anglesPoss, matProp, extLoad)
% layup is the stacking sequence
% anglesPoss, is a list index to transform the index to a corresponding degree orientation; e.g. 1=-75 degrees, 2=-60degrees, ... , 12=90degrees, 13=inf
% matProp material properties needed to determine ABD matrix
% extLoad external loads needed to determine failure and safety factor of the laminate
function to calculate the ABD
function to calculate the stress/strains
function to calculate failure/safety factor
% Define output
outputCost(1) = D(2,2)/210;
outputCost(2) = size(layup,2);
outputCost(3) = SF;
Cineq(1) = 1 - D(2,2)/210;
Cineq(2) = -1.00*SF;
Ceq = [];
end
我的问题是GA没有找到正确的最小层数,这个问题是18(通过ModelCenter获得)。它似乎去了 19 和所有层对应的最小索引 1 代表 -75 度。我想知道是否正确定义了我的目标函数?或者我忽略了一些东西。此外,如果我强制所有 90 度层的初始上篮,那么它会找到正确的答案。