-
Notifications
You must be signed in to change notification settings - Fork 1
/
FireFlyRegression.m
139 lines (137 loc) · 3.48 KB
/
FireFlyRegression.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
function bestfis=FireFlyRegression(fis,data)
%
% Variables
p0=GettingFuzzyParameters(fis);
Problem.CostFunction=@(x) FuzzyCost(x,fis,data);
Problem.nVar=numel(p0);
alpha=1;
Problem.VarMin=-(10^alpha);
Problem.VarMax=10^alpha;
%
% FireFly Parameters
Params.MaxIt=30;
Params.nPop=8;
%
% Starting FireFly Algorithm
results=Runfly(Problem,Params);
%
% Getting the Results
p=results.BestSol.Position.*p0;
bestfis=FuzzyParameters(fis,p);
end
%%
function results=Runfly(Problem,Params)
disp('Starting FireFly Training');
%
% Cost Function
CostFunction=Problem.CostFunction;
% Number of Decision Variables
nVar=Problem.nVar;
% Size of Decision Variables Matrixv
VarSize=[1 nVar];
% Lower Bound of Variables
VarMin=Problem.VarMin;
% Upper Bound of Variables
VarMax=Problem.VarMax;
% Some Change
if isscalar(VarMin) && isscalar(VarMax)
dmax = (VarMax-VarMin)*sqrt(nVar);
else
dmax = norm(VarMax-VarMin);
end
%
% FireFly Algorithm Parameters
% Maximum Number of Iterations
MaxIt=Params.MaxIt;
% Number of Fireflies (Swarm Size)
nPop=Params.nPop;
% Light Absorption Coefficient
gamma = 1;
% Attraction Coefficient Base Value
beta0 = 2;
% Mutation Coefficient
alpha = 0.2;
% Mutation Coefficient Damping Ratio
alpha_damp = 0.98;
% Uniform Mutation Range
delta = 0.05*(VarMax-VarMin);
m = 2;
%
% Second Stage
% Empty Firefly Structure
empty_firefly.Position = [];
empty_firefly.Cost = [];
% Initialize Population Array
pop = repmat(empty_firefly, nPop, 1);
% Initialize Best Solution Ever Found
BestSol.Cost = inf;
% Create Initial Fireflies
for i = 1:nPop
pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
pop(i).Cost = CostFunction(pop(i).Position);
if pop(i).Cost <= BestSol.Cost
BestSol = pop(i);
end
end
% Array to Hold Best Cost Values
BestCost = zeros(MaxIt, 1);
%
%% Firefly Algorithm Main Body
%
for it = 1:MaxIt
newpop = repmat(empty_firefly, nPop, 1);
for i = 1:nPop
newpop(i).Cost = inf;
for j = 1:nPop
if pop(j).Cost < pop(i).Cost
rij = norm(pop(i).Position-pop(j).Position)/dmax;
beta = beta0*exp(-gamma*rij^m);
e = delta*unifrnd(-1, +1, VarSize);
newsol.Position = pop(i).Position ...
+ beta*rand(VarSize).*(pop(j).Position-pop(i).Position) ...
+ alpha*e;
newsol.Position = max(newsol.Position, VarMin);
newsol.Position = min(newsol.Position, VarMax);
newsol.Cost = CostFunction(newsol.Position);
if newsol.Cost <= newpop(i).Cost
newpop(i) = newsol;
if newpop(i).Cost <= BestSol.Cost
BestSol = newpop(i);
end
end
end
end
end
% Merge Operation
pop = [pop
newpop];
% Sort Operation
[~, SortOrder] = sort([pop.Cost]);
pop = pop(SortOrder);
% Truncate Operation
pop = pop(1:nPop);
% Store Best Cost Ever Found
BestCost(it) = BestSol.Cost;
% Show Iteration Information
disp(['In Iteration Number ' num2str(it) ': Highest Cost Is = ' num2str(BestCost(it))]);
% Damp Mutation Coefficient
alpha = alpha*alpha_damp;
end
disp('FireFly Algorithm Came To End');
% Store Res
results.BestSol=BestSol;
results.BestCost=BestCost;
% Plot FireFly Training Stages
set(gcf, 'Position', [600, 300, 500, 400])
plot(BestCost,':',...
'LineWidth',2,...
'MarkerSize',8,...
'MarkerEdgeColor','r',...
'Color',[0.1,0.9,0.1]);
title('FireFly Algorithm Training')
xlabel('FireFly Iteration Number','FontSize',10,...
'FontWeight','bold','Color','r');
ylabel('FireFly Best Cost Result','FontSize',10,...
'FontWeight','bold','Color','r');
legend({'FireFly Algorithm Train'});
end