Last active
May 6, 2022 20:01
-
-
Save martinsaposnic/d1414f5a82a9dd0834ee64dd48050161 to your computer and use it in GitHub Desktop.
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
const HV = Infinity; | |
const TF = 1000000; | |
let T = 0; | |
const N = 3; // cantidad de empleados | |
const M = 2; // cantidad de empleados online | |
// make array of N items | |
const TPSO = new Array(M).fill(HV); | |
const STOO = new Array(M).fill(0); | |
const TPS = new Array(N).fill(HV); | |
const STO = new Array(N).fill(0); | |
let TPLL = 0; | |
let ARR = 0; | |
let NTA = 0; | |
let NT = 0; | |
let NS = 0; | |
let NSO = 0; | |
let STLL = 0; | |
let STA = 0; | |
let STS = 0; | |
let ITO = new Array(N).fill(0); | |
let ITOO = new Array(M).fill(0); | |
function obtenerMenorTPS() { | |
// get min from TPS | |
let min = HV; | |
let index = 0; | |
for (let i = 0; i < N; i++) { | |
if (TPS[i] < min) { | |
min = TPS[i]; | |
index = i; | |
} | |
} | |
return index; | |
} | |
function obtenerMenorTPSO() { | |
// get min from TPSO | |
let min = HV; | |
let index = 0; | |
for (let i = 0; i < M; i++) { | |
if (TPSO[i] < min) { | |
min = TPSO[i]; | |
index = i; | |
} | |
} | |
return index; | |
} | |
function getRandom() { | |
return Math.random(); | |
} | |
function obtenerTPSOenHV() { | |
// get max from TPSO | |
let max = 0; | |
let index = 0; | |
for (let i = 0; i < M; i++) { | |
if (TPSO[i] > max) { | |
max = TPSO[i]; | |
index = i; | |
} | |
} | |
return index; | |
} | |
function obtenerTPSenHV() { | |
// get max from TPS | |
let max = 0; | |
let index = 0; | |
for (let i = 0; i < N; i++) { | |
if (TPS[i] > max) { | |
max = TPS[i]; | |
index = i; | |
} | |
} | |
return index; | |
} | |
function calcularTiempoDeAtencion() { | |
const r = Math.random(); | |
if (r <= 0.15) { | |
return 2 + (4 - 2) * r; | |
} else if (r <= 0.8) { | |
return 4 + (7 - 4) * r; | |
} else { | |
return 10 + (15 - 10) * r; | |
} | |
} | |
function calcularTiempoDeAtencionOnline() { | |
const r = Math.random(); | |
return 20 + (25 - 20) * r; | |
} | |
function calcularIntervaloDeArribos() { | |
return 0.3801 * Math.tan(Math.PI * (Math.random() - 0.5)) + 1.4132; | |
} | |
do { | |
if (T > TF) TPLL = HV; | |
const i = obtenerMenorTPS(); | |
const j = obtenerMenorTPSO(); | |
if (TPSO[j] <= TPS[i]) { | |
if (TPLL <= TPSO[j]) { | |
atenderLlegada(); | |
} else { | |
atenderSalidaOnline(); | |
} | |
} else { | |
if (TPLL <= TPS[i]) { | |
atenderLlegada(); | |
} else { | |
atenderSalidaNormal(); | |
} | |
} | |
function atenderLlegada() { | |
T = TPLL; | |
const IA = calcularTiempoDeAtencion(); | |
TPLL = T + IA; | |
NTA++; | |
if (NS + NSO <= 25) { | |
STLL += T; | |
NT++; | |
const random = getRandom(); | |
if (random < 0.1) { | |
NSO++; | |
if (NSO <= N) { | |
const x = obtenerTPSOenHV(); | |
const TAO = calcularTiempoDeAtencionOnline(); | |
TPSO[x] = T + TAO; | |
STOO[x] += T - ITOO[x]; | |
STA = STA + TAO; | |
} | |
} else { | |
NS++; | |
if (NS <= N) { | |
const x = obtenerTPSenHV(); | |
const TA = calcularTiempoDeAtencion(); | |
TPS[x] = T + TA; | |
STO[x] += T - ITO[x]; | |
STA = STA + TA; | |
} else { | |
if (NSO < M) { | |
const x = obtenerTPSOenHV(); | |
NS--; | |
NSO++; | |
const TAO = calcularTiempoDeAtencionOnline(); | |
TPSO[x] = T + TAO; | |
STOO[x] += T - ITOO[x]; | |
STA = STA + TAO; | |
} | |
} | |
} | |
} else { | |
ARR++; | |
} | |
} | |
function atenderSalidaOnline() { | |
T = TPSO[j]; | |
if (NSO <= 0) { | |
debugger; | |
} | |
NSO--; | |
STS += T; | |
if (NSO >= M) { | |
const TAO = calcularTiempoDeAtencionOnline(); | |
TPSO[j] = T + TAO; | |
STA += TAO; | |
} else { | |
if (NS > N) { | |
NS--; | |
NSO++; | |
const TA = calcularTiempoDeAtencion(); | |
TPS[i] = T + TA; | |
STA += TA; | |
} else { | |
ITOO[j] = T; | |
TPSO[j] = HV; | |
} | |
} | |
} | |
function atenderSalidaNormal() { | |
T = TPS[i]; | |
NS--; | |
STS += T; | |
if (NS >= N) { | |
const TA = calcularTiempoDeAtencion(); | |
TPS[i] = T + TA; | |
STA += TA; | |
} else { | |
ITO[i] = T; | |
TPS[i] = HV; | |
} | |
} | |
} while (T < TF || NS + NSO > 0); | |
const PTE = (STS - STLL - STA) / T; | |
const PARR = (ARR * 100) / NTA; | |
const PTO = STO.map((sto) => (sto / T) * 100); | |
const PTOO = STOO.map((stoo) => (stoo / T) * 100); | |
console.log("Cantidad de empleados", N); | |
console.log("Cantidad de empleados online", M); | |
console.log("Promedio tiempo en espera", PTE); | |
console.log("Porcentaje de arrepentidos", PARR); | |
PTO.forEach((p, i) => | |
console.log(`Porcentaje tiempo ocioso empleado ${i}`, p) | |
); | |
PTOO.forEach((p, i) => | |
console.log(`Porcentaje tiempo ocioso empleado online ${i}`, p) | |
); | |
console.log("Gente que entro", NT); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment