Skip to content

Instantly share code, notes, and snippets.

@riuri
Last active August 29, 2015 14:11
Show Gist options
  • Save riuri/5978964a93ea6454336e to your computer and use it in GitHub Desktop.
Save riuri/5978964a93ea6454336e to your computer and use it in GitHub Desktop.
Simulador para SSA
funcs = 1:20;
panelas = [];
uso = [];
for i=funcs
[p, u] = ssa(11040, i);
panelas = [panelas p];
uso = [uso mean(u)];
end
plot(funcs, uso);
plot(funcs, panelas./funcs);
grid;
function [panelas razao_uso_funcionario] = ssa(tempo_total, num_func)
% Simulacao de estampagem
% Tempos de proximas atividades a terminar
t_proximo = Inf*ones(1, 7);
relogio = 0;
plot_t = [];
plot_y = [];
% Fila de funcionarios
fila_funcionarios = 1:num_func;
% Tamanhos de filas
fila_bases_nao_estampadas = 0;
fila_estampador = 1;
fila_cabos_nao_conformados = 0;
fila_conformador = 1;
fila_bases_para_soldar = 0;
fila_cabos_para_soldar = 0;
fila_soldador = 1;
fila_panelas_soldadas_cromar = 0;
fila_panelas_soldadas_pintar = 0;
fila_cromador = 1;
fila_pintor = 1;
fila_saida_cromadas = 0;
fila_saida_pintadas = 0;
% Atividades com identificacoes
atividade_estampagem = [NaN NaN];
atividade_conformacao = [NaN NaN];
atividade_soldagem = [NaN NaN NaN];
atividade_cromagem = [NaN NaN];
atividade_pintura = [NaN NaN];
% Contagem de tempo por funcionario
tempo_funcionario_inicio = -Inf*ones(1, num_func);
tempo_funcionario_trabalhando = zeros(1, num_func);
% Geradores de numeros aleatorios
function t = gera_t_bases(atual)
t = atual+exprnd(0.25);
end
function t = gera_t_cabos(atual)
t = gera_t_bases(atual);
end
function t = gera_t_estampagem(atual)
x = normrnd(0.2, 0.1);
if x<=0
x = gera_t_estampagem(0);
end
t = atual+x;
end
function t = gera_t_conformacao(atual)
x = normrnd(0.18, 0.06);
if x<=0
x = gera_t_conformacao(0);
end
t = atual+x;
end
function t = gera_t_soldagem(atual)
x = normrnd(0.22, 0.08);
if x<=0
x = gera_t_soldagem(0);
end
t = atual+x;
end
function t = gera_t_cromagem(atual)
a = 0.2;
b = 0.4;
t = atual+a+(b-a)*rand();
end
function t = gera_t_pintura(atual)
a = 0.15;
b = 0.2;
c = 0.27;
h = 2/(c-a);
incl_a = h/(b-a);
incl_c = h/(c-b);
area = rand();
x = sqrt(2*area/incl_a)+a;
if(x>b)
area = 1-area;
x = c-sqrt(2*area/incl_c);
end
t = atual+x;
end
t_proximo(1:2) = [0 0];
while relogio < tempo_total
% Encontrar o menor tempo de termino
relogio = min(t_proximo);
% Terminar atividades
if t_proximo(1) <= relogio
% Bases
fila_bases_nao_estampadas = fila_bases_nao_estampadas+1;
end
if t_proximo(2) <= relogio
% Cabos
fila_cabos_nao_conformados = fila_cabos_nao_conformados+1;
end
if t_proximo(3) <= relogio
% Estampagem
estampador = atividade_estampagem(2);
fila_bases_para_soldar = fila_bases_para_soldar+1;
fila_estampador = fila_estampador+1;
fila_funcionarios = [fila_funcionarios estampador];
tempo_funcionario_trabalhando(estampador) = ...
tempo_funcionario_trabalhando(estampador) + ...
relogio - tempo_funcionario_inicio(estampador);
t_proximo(3) = Inf;
end
if t_proximo(4) <= relogio
% Conformacao
conformador = atividade_conformacao(2);
fila_cabos_para_soldar = fila_cabos_para_soldar+1;
fila_conformador = fila_conformador+1;
fila_funcionarios = [fila_funcionarios conformador];
tempo_funcionario_trabalhando(conformador) = ...
tempo_funcionario_trabalhando(conformador) + ...
relogio - tempo_funcionario_inicio(conformador);
t_proximo(4) = Inf;
end
if t_proximo(5) <= relogio
% Soldagem
soldador_A = atividade_soldagem(2);
soldador_B = atividade_soldagem(3);
if rand() < 0.167
fila_panelas_soldadas_cromar = ...
fila_panelas_soldadas_cromar+1;
else
fila_panelas_soldadas_pintar = ...
fila_panelas_soldadas_pintar+1;
end
fila_soldador = fila_soldador+1;
fila_funcionarios = [fila_funcionarios soldador_A soldador_B];
tempo_funcionario_trabalhando(soldador_A) = ...
tempo_funcionario_trabalhando(soldador_A) + ...
relogio - tempo_funcionario_inicio(soldador_A);
tempo_funcionario_trabalhando(soldador_B) = ...
tempo_funcionario_trabalhando(soldador_B) + ...
relogio - tempo_funcionario_inicio(soldador_B);
t_proximo(5) = Inf;
end
if t_proximo(6) <= relogio
% Cromagem
cromador = atividade_cromagem(2);
fila_saida_cromadas = fila_saida_cromadas+1;
fila_cromador = fila_cromador+1;
fila_funcionarios = [fila_funcionarios cromador];
tempo_funcionario_trabalhando(cromador) = ...
tempo_funcionario_trabalhando(cromador) + ...
relogio - tempo_funcionario_inicio(cromador);
t_proximo(6) = Inf;
end
if t_proximo(7) <= relogio
% Pintura
pintor_A = atividade_pintura(2);
pintor_B = atividade_pintura(3);
fila_saida_pintadas = fila_saida_pintadas+1;
fila_pintor = fila_pintor+1;
fila_funcionarios = [fila_funcionarios pintor_A pintor_B];
tempo_funcionario_trabalhando(pintor_A) = ...
tempo_funcionario_trabalhando(pintor_A) + ...
relogio - tempo_funcionario_inicio(pintor_A);
tempo_funcionario_trabalhando(pintor_B) = ...
tempo_funcionario_trabalhando(pintor_B) + ...
relogio - tempo_funcionario_inicio(pintor_B);
t_proximo(7) = Inf;
end
% Iniciar atividades
% Bases
if relogio >= t_proximo(1)
t_proximo(1) = gera_t_bases(relogio);
end
% Cabos
if relogio >= t_proximo(2)
t_proximo(2) = gera_t_cabos(relogio);
end
% Cromagem
if (fila_panelas_soldadas_cromar > 0) && (fila_cromador > 0) ...
&& (size(fila_funcionarios, 2) > 0)
atividade_cromagem(1) = 1;
atividade_cromagem(2) = fila_funcionarios(1);
fila_panelas_soldadas_cromar = fila_panelas_soldadas_cromar-1;
fila_cromador = fila_cromador-1;
fila_funcionarios = fila_funcionarios(2:end);
tempo_funcionario_inicio(atividade_cromagem(2)) = relogio;
t_proximo(6) = gera_t_cromagem(relogio);
end
% Pintura
if (fila_panelas_soldadas_pintar > 0) && (fila_pintor > 0) ...
&& (size(fila_funcionarios, 2) > 1)
atividade_pintura(1) = 1;
atividade_pintura(2) = fila_funcionarios(1);
atividade_pintura(3) = fila_funcionarios(2);
fila_panelas_soldadas_pintar = fila_panelas_soldadas_pintar-1;
fila_pintor = fila_pintor-1;
fila_funcionarios = fila_funcionarios(3:end);
tempo_funcionario_inicio(atividade_pintura(2)) = relogio;
tempo_funcionario_inicio(atividade_pintura(3)) = relogio;
t_proximo(7) = gera_t_pintura(relogio);
end
% Soldagem
if (fila_bases_para_soldar > 0) && (fila_cabos_para_soldar > 0) ...
&& (fila_soldador > 0) && (size(fila_funcionarios, 2) > 1)
atividade_soldagem(1) = 1;
atividade_soldagem(2) = fila_funcionarios(1);
atividade_soldagem(3) = fila_funcionarios(2);
fila_bases_para_soldar = fila_bases_para_soldar-1;
fila_cabos_para_soldar = fila_cabos_para_soldar-1;
fila_soldador = fila_soldador-1;
fila_funcionarios = fila_funcionarios(3:end);
tempo_funcionario_inicio(atividade_soldagem(2)) = relogio;
tempo_funcionario_inicio(atividade_soldagem(3)) = relogio;
t_proximo(5) = gera_t_soldagem(relogio);
end
% Estampagem
if (fila_bases_nao_estampadas > 0) && (fila_estampador > 0) ...
&& (size(fila_funcionarios, 2) > 0)
atividade_estampagem(1) = 1;
atividade_estampagem(2) = fila_funcionarios(1);
fila_bases_nao_estampadas = fila_bases_nao_estampadas-1;
fila_estampador = fila_estampador-1;
fila_funcionarios = fila_funcionarios(2:end);
tempo_funcionario_inicio(atividade_estampagem(2)) = relogio;
t_proximo(3) = gera_t_estampagem(relogio);
end
% Conformacao
if (fila_cabos_nao_conformados > 0) && (fila_conformador > 0) ...
&& (size(fila_funcionarios, 2) > 0)
atividade_conformacao(1) = 1;
atividade_conformacao(2) = fila_funcionarios(1);
fila_cabos_nao_conformados = fila_cabos_nao_conformados-1;
fila_conformador = fila_conformador-1;
fila_funcionarios = fila_funcionarios(2:end);
tempo_funcionario_inicio(atividade_conformacao(2)) = relogio;
t_proximo(4) = gera_t_conformacao(relogio);
end
plot_t = [plot_t relogio];
estoques = [ ...
fila_bases_nao_estampadas; ...
fila_cabos_nao_conformados; ...
fila_bases_para_soldar; ...
fila_cabos_para_soldar; ...
fila_panelas_soldadas_cromar + fila_panelas_soldadas_pintar; ...
%fila_saida_cromadas; ...
%fila_saida_pintadas;
];
plot_y = [plot_y estoques];
end
razao_uso_funcionario = tempo_funcionario_trabalhando/tempo_total;
panelas = fila_saida_cromadas+fila_saida_pintadas;
plot(plot_t, plot_y);
legend(...
'bases nao estampadas', ...
'cabos nao conformados', ...
'bases para soldar', ...
'cabos para soldar', ...
'panelas soldadas');
%'saida cromadas', ...
%'saida pintadas' ...
%);
% panelas por funcionarios
% [ 0 582 2010 2704 3604 3949 3980 4056 3932 3847 3900 3987 3928 3950 3979
% 3970 3914 4018 3953 4047]
% Uso de funcionarios
% [ 1.0000 .9940 .9560 .9513 .9100 .8045 .6959 .6203 .5371 .4700 .4347
% .4071 .3701 .3459 .3259 .3043 .2834 .2738 .2547 .2474]
end
@riuri
Copy link
Author

riuri commented Dec 15, 2014

Fiz um comentário aqui

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment