Genetic Algorithm and PSO not varying from initial point, regardless of parameters and fitness function
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
I am trying to compare various algorithms for a predetermined problem. I have solved the algorithms using fmincon and want to compare genetic algorithms and particle swarm optimisation. However, when adapting the code for either, the results don't vary from the initial population. I have played with various paramters and even completely changed the objective function with no result. Can someone please show me where I am going wrong and missing the boat. I would gratly appreciate it.
Here is my main code for the GA (very similar for PSO):
max_28 = 70;
min_28 = 10;
max_21 = 70;
min_21 = 10;
max_28 = max_28/100.*2500000./1200;
min_28 = min_28/100.*2500000./1200;
max_21 = max_21/100.*2000000./1200;
min_21 = min_21/100.*2000000./1200;
flow_decline_out_1 = readtable('Dam flow calculation.xlsx','Sheet','Flows','Range','L2:L97','ReadVariableNames',false);
flow_decline_out = cumsum(table2array([flow_decline_out_1]));
x0 = table2array([readtable('Dam flow calculation.xlsx','Sheet','Flows','Range','S2:S195','ReadVariableNames',false)]);
lb = transpose([10;10;zeros(96*2,1)]);
ub = transpose([70;70;ones(96*2,1).*75]);
% x0 = ub/2;
winter = 0;
if winter == 1
tariff = table2array(readtable('Dam flow calculation.xlsx','Sheet','Tariff','Range','E3:E98','ReadVariableNames',false));
else
tariff = table2array(readtable('Dam flow calculation.xlsx','Sheet','Tariff','Range','C3:C98','ReadVariableNames',false));
end
fun = @(x)Power(x,tariff);
temp = ones(96);
A = [-ones(96,1)./100.*2500000./1200 zeros(96,1) tril(temp) zeros(96,96);
ones(96,1)./100.*2500000./1200 zeros(96,1) -tril(temp) zeros(96,96);
zeros(96,1) -ones(96,1)./100.*2000000./1200 -tril(temp) tril(temp);
zeros(96,1) ones(96,1)./100.*2000000./1200 tril(temp) -tril(temp)];
b = [- min_21.*ones(96,1) + flow_decline_out;
max_21.*ones(96,1) - flow_decline_out;
- min_28.*ones(96,1);
max_28.*ones(96,1)];
Aeq = [zeros(1,1) ones(1,1) ones(1,96) zeros(1,96);
zeros(1,1) ones(1,1) -ones(1,96) ones(1,96)];
beq = [flow_decline_out(96);
0];
% initPop = [transpose(x0);transpose(x0);transpose(x0);transpose(x0);transpose(x0);transpose(x0);transpose(x0);transpose(x0);transpose(x0);transpose(x0)];
% options = optimoptions('ga','PenaltyFactor',10000,'CrossoverFcn',{@crossoverintermediate, 1.2},'MutationFcn',@mutationadaptfeasible,'FitnessScalingFcn',@fitscalingrank,'CreationFcn','gacreationlinearfeasible','ConstraintTolerance',1e-6,'Display','iter','PlotFcn',{@gaplotselection, @gaplotbestf},'MaxGenerations',500,'MaxStallGenerations',100);
options = optimoptions("ga",'PlotFcn',{@gaplotbestf,@gaplotstopping},'Display','iter');
X0 = ub; % Start point (row vector)
options.InitialPopulationMatrix = X0;
% options.InitialPopulationMatrix = transpose(x0);
% options.MutationFcn = @mutationuniform;
% options.CrossoverFcn = @crossoverintermediate;
% options.SelectionFcn = @selectionroulette;
% options.CreationFcn = @gacreationuniform;
% options.FitnessScalingFcn = @fitscalingtop;
% options.InitialPopulationRange = [0;7500];
% % options.PopulationSize = 1000;
% options.MigrationDirection = 'forward';
[x,fval] = ga(fun,194,A,b,Aeq,beq,lb,ub,[],[],options);
xlswrite('Dam flow calculation.xlsx',transpose(x),'Flows','P2:P195');
xlswrite('Dam flow calculation.xlsx',1,'Calcs','K1');
winopen('Dam flow calculation.xlsx');
I read the tariff and some flow values from an excel file and use these in the calculations allowing me to have a base to compare the various methods.
And here is the objective function:
function pow = Power(x,tariff)
tariff1 = [zeros(1,2) transpose(tariff) transpose(tariff)];
% pow = tariff1*(transpose(x./eta(x)));
% pow = tariff1*x;
x1 = transpose(x);
pow = tariff1*x1;
% pow = sum(x);
end
0 comentarios
Respuestas (1)
Alan Weiss
el 13 de Abr. de 2022
Editada: Alan Weiss
el 13 de Abr. de 2022
You have a linear objective function and linear constraints. You should use linprog to solve your problem. Typically, a linear programming problem will have a unique solution, though sometimes there is a bounded or semi-bounded portion of an affine subspace of solutions with the same objective function.
ga and particleswarm are not appropriate solvers for this type of problem.
Alan Weiss
MATLAB mathematical toolbox documentation
2 comentarios
Alan Weiss
el 14 de Abr. de 2022
They are not appropriate because the problem has linear objective and constraints. Both of those algorithms are heuristic, not guaranteed to work in any case. The linprog linear programming solver is much, much faster, can handle much larger problems, and has supporting theory.
For guidance on which solver to choose, see Optimization Decision Table (optimiization toolbox) and Table for Choosing a Solver (global).
Alan Weiss
MATLAB mathematical toolbox documentation
Ver también
Categorías
Más información sobre Global Optimization Toolbox en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!