# Optimization of Artificial Immune system using Genetic algorithm

7 views (last 30 days)
BR on 15 Oct 2018
Edited: BR on 18 Oct 2018
The defined problem for DCA (AIS) gives an output function, providing three different ouputs for a matrix of input weights.
The condition for the output is
if C(csm)>thr && C(mDC)>C(smDC)
C=1;
else
C=0;
end
Where Cp = data(target,1)
Cs = data(target,2)
Cd= data(target,3) for target to be a logical vector for labels
Obviously, I have a target data for which this condition should meet, only if I optimize the weights properly.
So, in order to do this I created the following code for GA fitness function
function [s,c]=DCA_weights(W, data, targets)
c(1)=0.5*(W(1) * data(targets,1) + W(3) * data(targets,3) + W(2) * data(targets,2))/(W(1) + W(2) + W(3));
c(2)=0.5*(W(1) * data(targets,1) + W(3) * data(targets,3) + W(2) * data(targets,2))/(W(1) + W(2) + W(3));
c(3)=0.5*(W(1) * data(targets,1) + W(3) * data(targets,3) + W(2) * data(targets,2))/(W(1) + W(2) + W(3));
s=c(2)./c(3); % minimizing the ratio of C(smDC)/(CmDC)
and constraint function as (After solving the C(csm) < thr)
function [c, ceq] = DCA_constraint_GA(W, data, target)
c = (9.6 - data(target,1))*W(1) + (9.6 - data(target,2))*W(2) + (9.6 - data(target,3))*W(3);
ceq=[];
I have defined both upper and lower bounds for weights as [-6 -6 -6] and upper bounds as [6 6 6]
and the final code is
ObjectiveFunction = @DCA_weights;
nvars = 3; % Number of variables
LB = [-6 -6 -6]; % Lower bound
UB = [6 6 6]; % Upper bound
ConstraintFunction = @DCA_constraint_GA;
[x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,ConstraintFunction);
But I always get the following response,
'Not enough input arguments'

Stephan on 15 Oct 2018
Edited: Stephan on 15 Oct 2018
Hi,
solvers like ga only pass only one argument to their objective functions - in your case W. If your function needs additional arguments you have to pass them in another way. See passing extra parameters and look which is the best method for you. I prefer nested functions - but there are also other methods. The use of global variables is not recommended.
If you fix this, it should work.
General example:
% call outer function to start the calculation
outer_fcn
% define outer function containing the additional variables / values:
function outer_fcn
data = ...;
targets = ...;
% call ga inside the outer function:
ObjectiveFunction = @DCA_weights;
nvars = 3; % Number of variables
LB = [-6 -6 -6]; % Lower bound
UB = [6 6 6]; % Upper bound
ConstraintFunction = @DCA_constraint_GA;
[x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,ConstraintFunction);
% nonlinear constraints function (1. inner function)
function [c, ceq] = DCA_constraint_GA(W, data, target)
c = (9.6 - data(target,1))*W(1) + (9.6 - data(target,2))*W(2) + (9.6 - data(target,3))*W(3);
ceq=[];
end
% objective function (2. inner function)
function [s,c]=DCA_weights(W, data, targets)
c(1)=0.5*(W(1) * data(targets,1) + W(3) * data(targets,3) + W(2) * data(targets,2))/(W(1) + W(2) + W(3));
c(2)=0.5*(W(1) * data(targets,1) + W(3) * data(targets,3) + W(2) * data(targets,2))/(W(1) + W(2) + W(3));
c(3)=0.5*(W(1) * data(targets,1) + W(3) * data(targets,3) + W(2) * data(targets,2))/(W(1) + W(2) + W(3));
s=c(2)./c(3); % minimizing the ratio of C(smDC)/(CmDC)
end
% end of outer function
end
Best regards
Stephan
BR on 18 Oct 2018
Edited: BR on 18 Oct 2018
Yeah mate, Think so. Thanks a tonne.
Best Regards
Baqar