MATLAB: Truss optimization, genetic algorithm

truss optimization. genetic algorithm. structural optimization. please help

Hi
Please I need help with my code in truss optimization using genetic algorithm. When I run it, I get a statement at the end which I have been struggling to sort out. the error it shows it this
"Optimization terminated: average change in the fitness value less than options.FunctionTolerance
and constraint violation is less than options.ConstraintTolerance."
Please does anyone know why it shows this…. I really need help on this because it's slowing me down and my deadline is close
I have attached the whole data below.

TITLELEMENTS = 21
1 1 12 0.00361 1.79e-6
2 1 2 0.00361 1.79e-6
3 2 12 0.00203 9.0e-7
4 2 3 0.00361 1.79e-6
5 12 3 0.00361 1.79e-6
6 12 11 0.00361 1.79e-6
7 3 11 0.00203 9.0e-7
8 3 4 0.00361 1.79e-6
9 11 4 0.00361 1.79e-6
10 11 10 0.00361 1.79e-6
11 8 7 0.00361 1.79e-6
12 6 7 0.00361 1.79e-6
13 6 8 0.00203 9.0e-7
14 5 6 0.00361 1.79e-6
15 5 8 0.00361 1.79e-6
16 9 8 0.00361 1.79e-6
17 5 9 0.00203 9.0e-7
18 4 5 0.00361 1.79e-6
19 4 9 0.00361 1.79e-6
20 10 9 0.00361 1.79e-6
21 4 10 0.00203 9.0e-7
NODE_COORDINATES = 12
1 0.0 0.0
2 4.0 0.0
3 8.0 0.0
4 12.0 0.0
5 16.0 0.0
6 20.0 0.0
7 24.0 0.0
8 20.0 3.0
9 16.0 3.0
10 12.0 3.0
11 8.0 3.0
12 4.0 3.0
NODES_WITH_PRESCRIBED_DISPLACEMENTS = 2
1 11 0.000 0.000
7 01 0.000 0.000
YOUNG_MODULUS =210000000.0
YIELD STRESS =250000.0
NODES_WITH_POINT_LOAD = 5
2 0 -40
3 0 -40
4 0 -40
5 0 -40
6 0 -40
PLOTTING_AMPLIFICATION_FACTOR = 20
NODES_WITH_VARIABLE_COORDINATES = 5
8 11 18.0 1.0 22.0 5.0
9 11 14.0 1.0 18.0 5.0
10 11 10.0 1.0 14.0 5.0
11 11 6.0 1.0 12.0 5.0
12 11 2.0 1.0 6.0 5.0
DEFLECTION_LIMIT = 5
8 11 0.01 0.1
9 11 0.01 0.1
10 11 0.01 0.1
11 11 0.01 0.1
12 11 0.01 0.1
%**********************************************************************

% Reads all data for a 2D linear elastic truss

%

% HISTORY

% October 2018, : Initial coding (from "truss2D.m")

%***********************************************************************

function [coorddofvar,fixeddata] = truss2D_readdata(filename)
%
% Set some basic variables

% ========================

% Number of degrees of freedom per node

ndofn=2;
% Number of nodes of the element

nnode=2;
%
% Read information from data file

% ===============================

%
fid = fopen(filename, 'r');
title = fscanf(fid, 'TITLE = %s',1);
%
% Total number of elements in the mesh

nelem = fscanf(fid, '\nELEMENTS = %d', 1);
%
%Read Table of connectivities

%
lnods = fscanf(fid, '\n%d %d %d %f %f', [nnode+3,nelem]);
lnods = lnods';sortrows(lnods,1);
%...cross-sectional areas

csarea = lnods(:,4);
%...second moment of areas

sndmoa = lnods(:,5);
%...store only connectivities in lnods

lnods = lnods(:,2:nnode+1);
%...create table of element global degrees of freedom

eldofX = lnods*ndofn-1; eldofY = lnods*ndofn;
eldofs = [ eldofX(:,1) eldofY(:,1) eldofX(:,2) eldofY(:,2) ];
%
% Read Nodal coordinates

%
npoin = fscanf(fid, '\nNODE_COORDINATES = %d', 1);
coord = fscanf(fid, '\n%d %f %f', [3, npoin]);
coord = coord';sortrows(coord,1);nodnumbers=coord(:,1);
coord = coord(:,2:3);
%...create table of nodal degrees of freedom

nodofs = [ nodnumbers*ndofn-1 nodnumbers*ndofn ];
%
%
% Read Prescribed displacements

%
nnodefix = fscanf(fid,'\nNODES_WITH_PRESCRIBED_DISPLACEMENTS = %d',1);
ipresc = fscanf(fid, '\n%d %d %f %f', [2+ndofn, nnodefix]);
ipresc = ipresc';fixednodes=ipresc(:,1);
%...create tables of fixed dofs and corresponding prescribed values

ifdoffix = zeros(npoin*ndofn,1); icount = 0;
for inodefix = 1:nnodefix
ipoin=ipresc(inodefix,1);
dofX=nodofs(ipoin,1);dofY=nodofs(ipoin,2);
if ipresc(inodefix,2)==11
ifdoffix(dofX)=1;
ifdoffix(dofY)=1;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,3);
fixeddoftable(icount) = dofX;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,4);
fixeddoftable(icount) = dofY;
elseif ipresc(inodefix,2)==1
ifdoffix(dofY)=1;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,4);
fixeddoftable(icount) = dofY;
elseif ipresc(inodefix,2)==10
ifdoffix(dofX)=1;
icount = icount+1;
valuedoffix(icount) = ipresc(inodefix,3);
fixeddoftable(icount) = dofX;
elseif ipresc(inodefix,2)==0
else
error('Wrong displacement prescription code in data file')
end
end
%...create table of free dofs by subtracting the set of fixed dofs

% from the set of all dofs

ngdof=npoin*ndofn;alldoftable=[1:ngdof]';
freedoftable = setxor(alldoftable,fixeddoftable);
%
% Read Material properties

%
matprop.young = fscanf(fid, '\nYOUNG_MODULUS = %f', 1);
matprop.yield = fscanf(fid, '\nYIELD STRESS = %f', 1);
%
%Read Load vector (point loads only)

%
npload = fscanf(fid,'\nNODES_WITH_POINT_LOAD = %d',1);
pload = fscanf(fid, '\n%d %f %f', [1+ndofn, npload]);
pload = pload';
%...add point loads to global load vector

F=zeros(ngdof,1);
loadednodes=pload(:,1);
loadeddofs=nodofs(loadednodes,:);
F(loadeddofs) = pload(:,2:3);
%
% Reads deformation amplification factor (for plotting only)

amplfact = fscanf(fid,'\nPLOTTING_AMPLIFICATION_FACTOR = %d',1);
%
% Reads upper and lower bounds of variable coordinates to be optimised

%
nnodevar = fscanf(fid, '\nNODES_WITH_VARIABLE_COORDINATES = %d', 1);
ivar = fscanf(fid, '\n%d %d %f %f %f %f', [2+2*ndofn, nnodevar]);
ivar = ivar';varnodes=ivar(:,1);
%...create tables of variable coordinates and corresponding prescribed

% upper and lower bounds

ifcoordvar = zeros(npoin*ndofn,1); icount = 0;
upperbound=[];lowerbound=[];dofcoordvar=[];
for inodevar = 1:nnodevar
ipoin=ivar(inodevar,1);
dofX=nodofs(ipoin,1);dofY=nodofs(ipoin,2);
if ivar(inodevar,2)==11
% both x- and y-coordinates are variable

ifcoordvar(dofX)=1;
ifcoordvar(dofY)=1;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,3);
upperbound(icount) = ivar(inodevar,5);
dofcoordvar(icount) = dofX;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,4);
upperbound(icount) = ivar(inodevar,6);
dofcoordvar(icount) = dofY;
elseif ivar(inodevar,2)==1
% only y-coordinate is variable

ifcoordvar(dofY)=1;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,4);
upperbound(icount) = ivar(inodevar,6);
dofcoordvar(icount) = dofY;
elseif ivar(inodevar,2)==10
% only x-coordinate is variable

ifcoordvar(dofX)=1;
icount = icount+1;
lowerbound(icount) = ivar(inodevar,3);
upperbound(icount) = ivar(inodevar,5);
dofcoordvar(icount) = dofX;
elseif ivar(inodevar,2)==0
disp('WARNING: Node listed with no variable coordinates for optimisation process')
else
error('Wrong variable coordinate prescription code in data file')
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% RITA CODE STARTS FROM HERE

%Read deflection limit from data file

nnodelimit = fscanf(fid,'\nDEFLECTION_LIMIT = %d',1);
ilimit = fscanf(fid, '\n%d %d %f %f', [2+ndofn, nnodelimit]);
ilimit = ilimit';limitednodes=ilimit(:,1);
%...create tables of fixed dofs and corresponding prescribed values
ifdoflimit = zeros(npoin*ndofn,1); iicount = 0;
for inodelimit = 1:nnodelimit
ipoin=ilimit(inodelimit,1);
dofX=nodofs(ipoin,1);
dofY=nodofs(ipoin,2);
if ilimit(inodelimit,2)==11
ifdoflimit(dofX)=1;
ifdoflimit(dofY)=1;
iicount = iicount+1;
valuedoflimit(iicount)= ilimit(inodelimit,3);
limiteddoftable(iicount) = dofX;
iicount = iicount+1;
valuedoflimit(iicount) = ilimit(inodelimit,4);
limiteddoftable(iicount)= dofY;
elseif ilimit(inodelimit,2)==1
ifdoflimit(dofY)=1;
iicount = iicount+1;
valuedoflimit(iicount)= ilimit(inodelimit,4);
limiteddoftable(iicount) = dofY;
elseif ilimit(inodefix,2)==10
ifdoflimit(dofX)=1;
iicount = iicount+1;
valuedoflimit(iicount) = ilimit(inodelimit,3);
limiteddoftable(iicount) = dofX;
elseif ilimit(inodelimit,2)==0
else error('Deflection limitaion value is not inserted')
end
end
%************************************************************************

%
% IMPORTANT

% (DEFINIFION OF DESIGN VARIABLES)

%
% set of dofs associated with variable coordinates

dofcoordfix=setxor(alldoftable,dofcoordvar);
if isempty(dofcoordvar)
disp('No variables in optimisation problem - all nodes have fixed coordinates')
error('No variables in optimisation problem - all nodes have fixed coordinates')
end
%
% arrange coordinates following dof ordering (in one-dimensional array, as

% in global displacement vector)

coorddof=zeros(ngdof,1);
for ipoin=1:npoin
dofx=ipoin*2-1;dofy=ipoin*2;
coorddof(dofx)=coord(ipoin,1);coorddof(dofy)=coord(ipoin,2);
end
% split coordinates array into variable and fixed coordinates

coorddofvar=coorddof(dofcoordvar);coorddoffix=coorddof(dofcoordfix);
%AppRita

coorddoflimit=coorddof(alldoftable);
%x = coorddofvar

%************************************************************************
%
% Store fixed data in structure

fixeddata.amplfact=amplfact;
fixeddata.coorddoffix=coorddoffix;
fixeddata.csarea=csarea;
fixeddata.sndmoa=sndmoa;
fixeddata.dofcoordfix=dofcoordfix;
fixeddata.dofcoordvar=dofcoordvar;
fixeddata.eldofs=eldofs;
fixeddata.F=F;
fixeddata.fixeddoftable=fixeddoftable;
fixeddata.freedoftable=freedoftable;
fixeddata.lnods=lnods;
fixeddata.lowerbound=lowerbound;
fixeddata.matprop=matprop;
fixeddata.ndofn=ndofn;
fixeddata.nelem=nelem;
fixeddata.ngdof=ngdof;
fixeddata.npoin=npoin;
fixeddata.upperbound=upperbound;
fixeddata.valuedoffix=valuedoffix;
%fixeddata.coorddoflimit=coorddoflimit; %appended by Rita

%fixeddata.coorddoflimit=coorddoflimit;

fixeddata.ifdoflimit=ifdoflimit;
fixeddata.limiteddoftable=limiteddoftable;
fixeddata.valuedoflimit=valuedoflimit;
fixeddata.csarea=csarea;
fixeddata.sndmoa=sndmoa;
% Close file(s)

status = fclose(fid);
%
end%**********************************************************************
% Reads all data for a 2D linear elastic truss
%
% HISTORY
% October 2018, : Initial coding (from "truss2D.m")
%***********************************************************************
function [coorddofvar,fixeddata] = truss2D_readdata(filename)
%
% Set some basic variables
% ========================
% Number of degrees of freedom per node
ndofn=2;
% Number of nodes of the element
nnode=2;
%
% Read information from data file
% ===============================
%
fid = fopen(filename, 'r');
title = fscanf(fid, 'TITLE = %s',1);
%
% Total number of elements in the mesh
nelem = fscanf(fid, '\nELEMENTS = %d', 1);
%
%Read Table of connectivities
%
lnods = fscanf(fid, '\n%d %d %d %f %f', [nnode+3,nelem]);
lnods = lnods';sortrows(lnods,1);
%...cross-sectional areas
csarea = lnods(:,4);
%...second moment of areas
sndmoa = lnods(:,5);
%...store only connectivities in lnods
lnods = lnods(:,2:nnode+1);
%...create table of element global degrees of freedom
eldofX = lnods*ndofn-1; eldofY = lnods*ndofn;
eldofs = [ eldofX(:,1) eldofY(:,1) eldofX(:,2) eldofY(:,2) ];
%
% Read Nodal coordinates
%
npoin = fsc

Best Answer

That statement does not indicate an error. That indicates normal ending of the solver iterations.
Congratulations!
Alan Weiss
MATLAB mathematical toolbox documentation