Last active
August 29, 2015 14:11
-
-
Save riuri/5978964a93ea6454336e to your computer and use it in GitHub Desktop.
Simulador para SSA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Fiz um comentário aqui