clc;
clear;
close all;
%% Problem Definition
CostFunction=@(x) Sphere(x); % Cost Function
nVar=13; % Number of Decision Variables
VarSize=[1 nVar]; % Decision Variables Matrix Size
VarMin=[0 0 0 60 60 60 60 60 60 40 40 55 55]; % Decision Variables Lower Bound
VarMax= [680 360 360 180 180 180 180 180 180 120 120 120 120 ]; % Decision Variables Upper Bound
%% ICA Parameters
MaxIt=10000; % Maximum Number of Iterations
nPop=100; % Population Size
nEmp=30; % Number of Empires/Imperialists
alpha=1; % Selection Pressure
beta=1.5; % Assimilation Coefficient
pRevolution=0.05; % Revolution Probability
mu=0.2; % Revolution Rate
zeta=0.5; % Colonies Mean Cost Coefficient
%% Globalization of Parameters and Settings
global ProblemSettings;
ProblemSettings.CostFunction=CostFunction;
ProblemSettings.nVar=nVar;
ProblemSettings.VarSize=VarSize;
ProblemSettings.VarMin=VarMin;
ProblemSettings.VarMax=VarMax;
global ICASettings;
ICASettings.MaxIt=MaxIt;
ICASettings.nPop=nPop;
ICASettings.nEmp=nEmp;
ICASettings.alpha=alpha;
ICASettings.beta=beta;
ICASettings.pRevolution=pRevolution;
ICASettings.mu=mu;
ICASettings.zeta=zeta;
%% Initialization
% Initialize Empires
emp=CreateInitialEmpires();
% Array to Hold Best Cost Values
BestCost=zeros(MaxIt,1);
%% ICA Main Loop
for it=1:MaxIt
% Assimilation
emp=AssimilateColonies(emp);
% Revolution
emp=DoRevolution(emp);
% Intra-Empire Competition
emp=IntraEmpireCompetition(emp);
% Update Total Cost of Empires
emp=UpdateTotalCost(emp);
% Inter-Empire Competition
emp=InterEmpireCompetition(emp);
% Update Best Solution Ever Found
imp=[emp.Imp];
[~, BestImpIndex]=min([imp.Cost]);
BestSol=imp(BestImpIndex);
% Update Best Cost
BestCost(it)=BestSol.Cost;
% Show Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
end
%% Results
BestSol.Position
disp([' Power sum = ' num2str(sum(BestSol.Position))]);
figure;
%plot(BestCost,'LineWidth',2);
semilogy(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;