Hi everyone!
Iam not so good at english, but ill try to expolain my problem to you.
A factory uses ingots to do some products, that have a fix volume, but the ingots dont. They have an error in their dimensions that affects on the end of the process, giving more or less material loss.
So thats it, I need to arrange the ingots in order to have minimum material loss and iam doing this with genetic algorithm as solver.
The fact is that iam getting the quantity of material lost, but I cant have a fix order to the ingots (probably many results).
Iam posting my function and the genetic algorithm code now:
function sobra = lingoten(x);
vol=[932.632661923009;896.096943763439;833.371277330512;843.809844382488;929.391342004761;904.160516477429;1025.99962821412;870.221930789316;944.865478885808;984.150429036178;833.990702471929;852.559052149479;834.376307939848;861.292659074916;863.365915901348;890.730603197672;963.504073232846;886.996713449424;793.389622161219;888.816391134596;949.696136725675;917.256662064900;852.207569275760;814.794835044433;847.553580285134;943.871877391880;955.143074172044;929.219111657251;];
[xord,ordem] = sort(x);
sobra(1) = vol(ordem(1))-900;
if sobra(1)<0
sobra(1)= 15*abs(sobra(1));
end
sobra(2) = sum(vol(ordem(2:3)))-1550;
if sobra(2)<0
sobra(2)=15*abs(sobra(2));
end
sobra(3) = sum(vol(ordem(4:6)))-2650;
if sobra(3)<0
sobra(3)=15*abs(sobra(3));
end
sobra(4) = vol(ordem(7))-900;
if sobra(4)<0
sobra(4)=15*abs(sobra(4));
end
sobra(5) = sum(vol(ordem(8:10)))-2650;
if sobra(5)<0
sobra(5)=15*abs(sobra(5));
end
sobra(6) = sum(vol(ordem(11:13)))-2650;
if sobra(6)<0
sobra(6)=15*abs(sobra(6));
end
sobra(7) = sum(vol(ordem(14:15)))-1550;
if sobra(7)<0
sobra(7)=15*abs(sobra(7));
end
sobra(8) = sum(vol(ordem(16:18)))-2650;
if sobra(8)<0
sobra(8)=15*abs(sobra(8));
end
sobra(9) = sum(vol(ordem(19:20)))-1550;
if sobra(9)<0
sobra(9)=15*abs(sobra(9));
end
sobra(10)= sum(vol(ordem(21:22)))-1550;
if sobra(10)<0
sobra(10)=15*abs(sobra(10));
end
sobra(11)= vol(ordem(23))-900;
if sobra(11)<0
sobra(11)=15*abs(sobra(11));
end
sobra(12)= vol(ordem(24))-900;
if sobra(12)<0
sobra(12)=15*abs(sobra(12));
end
sobra(13)= sum(vol(ordem(25:26)))-1550;
if sobra(13)<0
sobra(13)=15*abs(sobra(13));
end
sobra(14)= sum(vol(ordem(27:28)))-1550;
if sobra(14)<0
sobra(14)=15*abs(sobra(14));
end
sobra = sum(sobra);
now the GA:
clear all
clc
%funcao: minimizar a perda de material:
%% Dados de Entrada
f = @lingoten; % funcao objetivo
nvar = 28; % numero de variaveis
a = zeros(1,28); % valores inferiores das suas variáveis
b = ones(1,28); % valores superiores das suas variáveis
N = 100; % qtd de individuos da pop
n = 11; % tamanho de cada individuo
pmut = 0.03; % probabilidade de mutacao
pcrs = 0.90; % probabilidade de cruzamento
kmax = 20; % numero maximo de geracoes
%% Inicio do Programa
% Análise da Aptidao da Populacao
apt = N:-1:1;
apt = apt/sum(apt);
aptcum = cumsum(apt);
%% Declaracoes de Parametros e Variaveis
func = zeros(N,1);
omenor = Inf;
pop = rand(N,n*nvar)<0.5; % populacao inicial
newpop = zeros(N,nvar*n);
pop_int = zeros(N,nvar);
%% Geracao da Populacao Inicial
% transformacoes dos individuos de numeros binarios em reais
for j=1:nvar
for i=1:n
pop_int(:,j) = pop_int(:,j) + 2^(i-1)*pop(:,((j-1)*n)+n+1-i);
end
end
pop_real = repmat(a,N,1) + repmat((b-a),N,1)/(2^n-1).*pop_int;
%% Avaliacao da Populacao Inicial atraves da Funcao Objetivo
for i=1:N
func(i) = f(pop_real(i,:));
end
%% Determinacao de Metodos de Escolha do Melhor Individuo da Pop
[menor, melhor] = min(func);
if menor<omenor
omenor = menor;
omelhorb = pop(melhor,:);
omelhorr = pop_real(melhor,:);
end
%% Inicio do Algoritmo Genetico
k = 1;
while k<=kmax
%% Ordenamento da Populacao
[func,ordem] = sort(func,'ascend');
pop = pop(ordem,:);
for i=1:N/2
%% Determinacao dos Pais para Cruzamento Conforme Aptidao do Individuo da Populacao
fstpar = find(aptcum>rand,1,'first');
sndpar = find(aptcum>rand,1,'first');
%% Cruzamento
if rand<pcrs
p = ceil(rand*(nvar*n-1)); % determinacao do ponto de corte dos pais
newpop(i,:) = [pop(fstpar,1:p) pop(sndpar,p+1:end)]; % filho 1 se condicional obedecida
newpop(i+N/2,:) = [pop(sndpar,1:p) pop(fstpar,p+1:end)]; % filho 2 se condicional obedecida
else
newpop(i,:) = pop(fstpar,:); % filho 1 se condicional nao obedecida
newpop(i+N/2,:) = pop(sndpar,:); % filho 2 se condicional nao obedecida
end
end
%% Mutacao
for i=1:N
for j=1:nvar*n
if rand<pmut
newpop(i,j) = not(newpop(i,j)); % mutacao do bit dos individuos se a condicional for obedecida
end
end
end
pop = newpop; % A populacao inicial recebe os valores da populacao apos cruzamento e mutacao
%% Transformacao de numeros binarios em reais
pop_int = zeros(N,nvar);
for j=1:nvar
for i=1:n
pop_int(:,j) = pop_int(:,j) + 2^(i-1)*pop(:,((j-1)*n)+n+1-i);
end
end
pop_real = repmat(a,N,1) + repmat((b-a),N,1)/(2^n-1).*pop_int;
for i=1:N
func(i) = f(pop_real(i,:)); % Avaliacao da populacao apos cruzamento e mutacao, conforme avaliacao da funcao objetivo
end
%% Determinacao do Melhor individuo da geracao
[menor, melhor] = min(func);
if menor<omenor
omenor = menor;
omelhorb = pop(melhor,:);
omelhorr = pop_real(melhor,:);
geracao= k;
end
%% Armazenamento dos melhores individuos ao longo das geracoes
melhor_ger(k)=menor;
geracoes(k)=k;
k = k+1;
end
[valores,ordemm]=sort(omelhorr);
disp('Menor sobra obtida foi');
disp(omenor);
disp('porcentagem do total');
disp(omenor*100/2.5043e+04);
disp('O Melhor resultado foi encontrado na geracao:');
disp(geracao);
disp('A Melhor ordem dos lingotes para os produtos é:');
disp(ordemm);