Skip to content

Instantly share code, notes, and snippets.

@martinsaposnic
Last active May 6, 2022 20:01
Show Gist options
  • Save martinsaposnic/d1414f5a82a9dd0834ee64dd48050161 to your computer and use it in GitHub Desktop.
Save martinsaposnic/d1414f5a82a9dd0834ee64dd48050161 to your computer and use it in GitHub Desktop.
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