Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
474 lines (385 sloc) 19.2 KB
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Simulacion_TP6
{
public class clSimu
{
//Variables de Control
private int cantS, cantSS, cantJ;
public int CantS { get => cantS; set => cantS = value; }
public int CantSS { get => cantSS; set => cantSS = value; }
public int CantJ { get => cantJ; set => cantJ = value; }
//Variables de Estado
private int nsA, nsN, nsB;
public int NsA { get => nsA; set => nsA = value; }
public int NsN { get => nsN; set => nsN = value; }
public int NsB { get => nsB; set => nsB = value; }
private List<clTicket> cola_A, cola_N, cola_B;
public List<clTicket> Cola_A { get => cola_A; set => cola_A = value; }
public List<clTicket> Cola_N { get => cola_N; set => cola_N = value; }
public List<clTicket> Cola_B { get => cola_B; set => cola_B = value; }
//Otras
DateTime T,
Tinicial,
TF,
TPLL,
HV = new DateTime(9999, 12, 31, 23, 59, 59);
public DateTime TiempoActual { get => T; }
public DateTime TiempoInicial { get => Tinicial; }
public DateTime TiempoFinal { get => TF; }
double nTA, nTN, nTB; //Cantidad de tickets que entraron al sistema
double secA, secN, secB; //Sumatorias de tiempos de Espera en cola, en minutos
double staTA, staTN, staTB; //Sumatorias de tiempos de atención, en minutos
public double NTA { get => nTA; set => nTA = value; }
public double NTN { get => nTN; set => nTN = value; }
public double NTB { get => nTB; set => nTB = value; }
public double SecA { get => secA; set => secA = value; }
public double SecN { get => secN; set => secN = value; }
public double SecB { get => secB; set => secB = value; }
public double StaTA { get => staTA; set => staTA = value; }
public double StaTN { get => staTN; set => staTN = value; }
public double StaTB { get => staTB; set => staTB = value; }
List<clPuesto> puestos_S, puestos_SS, puestos_J;
public List<clPuesto> Puestos_S { get => puestos_S; }
public List<clPuesto> Puestos_SS { get => puestos_SS; }
public List<clPuesto> Puestos_J { get => puestos_J; }
int idx_puesto_S_MayorTps,
idx_puesto_SS_MayorTps,
idx_puesto_J_MayorTps,
idx_puesto_S_MenorTps,
idx_puesto_SS_MenorTps,
idx_puesto_J_MenorTps;
bool procesar = true;
const string cPrioridadAlta = "A",
cPrioridadNormal = "N",
cPrioridadBaja = "B";
//Constructor
public clSimu(int pCantS, int pCantSS, int pCantJ)
{
cantS = pCantS;
cantSS = pCantSS;
cantJ = pCantJ;
}
//Métodos
public clSimuResultados Iniciar()
{
DateTime TpsS, TpsSS, TpsJ;
clSimuResultados resultados;
//Inicializar variables
this.CondicionesIniciales();
while (procesar == true)
{
//Obtener menores Tps para SENIOR, SEMI SENIOR y JUNIOR
idx_puesto_S_MenorTps = this.BuscarIdxMenorTps(puestos_S);
idx_puesto_SS_MenorTps = this.BuscarIdxMenorTps(puestos_SS);
idx_puesto_J_MenorTps = this.BuscarIdxMenorTps(puestos_J);
if (puestos_S.Count != 0)
TpsS = puestos_S[idx_puesto_S_MenorTps].Tps;
else //En el caso de que no haya puestos SENIOR (variable de control cantS == 0)
TpsS = HV;
if (puestos_SS.Count != 0)
TpsSS = puestos_SS[idx_puesto_SS_MenorTps].Tps;
else //En el caso de que no haya puestos SEMI SENIOR (variable de control cantSS == 0)
TpsSS = HV;
if (puestos_J.Count != 0)
TpsJ = puestos_J[idx_puesto_J_MenorTps].Tps;
else //En el caso de que no haya puestos JUNIOR (variable de control cantJ == 0)
TpsJ = HV;
//Determinar si se procesará una LLEGADA o una SALIDA
if (TPLL <= TpsS && TPLL <= TpsSS && TPLL <= TpsJ)
{ this.ProcesarLlegada(); } //LLEGADA
else if (TpsS <= TpsSS && TpsS <= TpsJ)
{ this.ProcesarSalida(ref puestos_S, idx_puesto_S_MenorTps); } //SALIDA SENIOR
else if (TpsSS <= TpsS && TpsSS <= TpsJ)
{ this.ProcesarSalida(ref puestos_SS, idx_puesto_SS_MenorTps); } //SALIDA SEMI SENIOR
else
{ this.ProcesarSalida(ref puestos_J, idx_puesto_J_MenorTps); } //SALIDA JUNIOR
if (T >= TF)
if (nsA + nsN + nsB == 0)
procesar = false; //Cortar el ciclo while
else
TPLL = HV; //Vaciamiento
}
//Calcular resultados de la simulación
resultados = new clSimuResultados(this);
resultados.Calcular();
String path = "C:\\ResultadosCSV.txt";
if (!File.Exists(path))
{
using (TextWriter tw = new StreamWriter(path))
{
tw.WriteLine(
"Cantidad Senior" + ";" + "Cantidad SemiSenior" + ";" + "Cantidad Junior" + ";" +
"TMEA" + ";" + "TMEN" + ";" + "TMEB" + ";" +
"TMAA" + ";" + "TMAN" + ";" + "TMAB" + ";" +
"PTOS" + ";" + "PTOSS" + ";" + "PTOJ" + Environment.NewLine +
this.CantS + ";" + this.CantSS + ";" + this.CantJ + ";" +
resultados.TMEA + ";" + resultados.TMEN + ";" + resultados.TMEB + ";" +
resultados.TMAA + ";" + resultados.TMAN + ";" + resultados.TMAB + ";" +
resultados.PTOS + ";" + resultados.PTOSS + ";" + resultados.PTOJ
);
}
}
else
{
File.AppendAllText(path,
this.CantS + ";" + this.CantSS + ";" + this.CantJ + ";" +
resultados.TMEA + ";" + resultados.TMEN + ";" + resultados.TMEB + ";" +
resultados.TMAA + ";" + resultados.TMAN + ";" + resultados.TMAB + ";" +
resultados.PTOS + ";" + resultados.PTOSS + ";" + resultados.PTOJ + Environment.NewLine);
}
return resultados;
}
private void CondicionesIniciales()
{
//Tiempo Próxima Llegada (Tiempo Inicial)
Tinicial = new DateTime(2019, 01, 01, 00, 00, 00);
TPLL = Tinicial;
//Tiempo Final
TF = new DateTime(2029, 01, 01, 23, 59, 59);
//Inicializar puestos SENIOR
puestos_S = new List<clPuesto>();
for (var index = 0; index < cantS; index++)
{
puestos_S.Add(new clPuesto() { Tipo = clPuesto.RecursoS(), Ticket = null, Tps = HV, Ito = Tinicial, Sto = 0 });
}
//Inicializar puestos SEMI SENIOR
puestos_SS = new List<clPuesto>();
for (var index = 0; index < cantSS; index++)
{
puestos_SS.Add(new clPuesto() { Tipo = clPuesto.RecursoSS(), Ticket = null, Tps = HV, Ito = Tinicial, Sto = 0 });
}
//Inicializar puestos JUNIOR
puestos_J = new List<clPuesto>();
for (var index = 0; index < cantJ; index++)
{
puestos_J.Add(new clPuesto() { Tipo = clPuesto.RecursoJ(), Ticket = null, Tps = HV, Ito = Tinicial, Sto = 0 });
}
//Inicializar cola de tickets prioridad ALTA
Cola_A = new List<clTicket>();
//Inicializar cola de tickets prioridad NORMAL
Cola_N = new List<clTicket>();
//Inicializar cola de tickets prioridad BAJA
Cola_B = new List<clTicket>();
}
private void ProcesarLlegada()
{
double IA;
string prioridadTicket;
T = TPLL; //Avance del tiempo
//Próxima llegada (EFNC)
IA = clDatosVar.GenerarIA();
TPLL = clDatosVar.SumarTiempos(T, IA);
//Determinar prioridad del nuevo ticket
prioridadTicket = clDatosVar.GenerarPrioridadTicket();
//Obtener Mayores Tps para SENIOR, SEMI SENIOR y JUNIOR
idx_puesto_S_MayorTps = this.BuscarIdxMayorTps(puestos_S);
idx_puesto_SS_MayorTps = this.BuscarIdxMayorTps(puestos_SS);
idx_puesto_J_MayorTps = this.BuscarIdxMayorTps(puestos_J);
if (String.Compare(prioridadTicket, cPrioridadAlta) == 0)
this.ProcesarLlegadaA(); //Llegada ticket Prioridad ALTA
else if (String.Compare(prioridadTicket, cPrioridadNormal) == 0)
this.ProcesarLlegadaN(); //Llegada ticket Prioridad NORMAL
else
this.ProcesarLlegadaB(); //Llegada ticket Prioridad BAJA
}
private void ProcesarLlegadaA()
{
clTicket ticket;
string prioridadTicket = cPrioridadAlta;
//Llegada de un nuevo ticket
nsA += 1; //Actualizar el NS correspondiente
nTA += 1; //Actualizar el NT correspondiente
ticket = new clTicket(prioridadTicket);
ticket.Tll = T; //tiempo de llegada del ticket
if (puestos_S[idx_puesto_S_MayorTps].Tps == HV)
{
//Si hay un puesto SENIOR libre, toma el ticket
staTA += puestos_S[idx_puesto_S_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_S[idx_puesto_S_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_S[idx_puesto_S_MayorTps].Ito);
puestos_S[idx_puesto_S_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else if (puestos_SS[idx_puesto_SS_MayorTps].Tps == HV)
{
//Si hay un puesto SEMI SENIOR libre, toma el ticket
staTA += puestos_SS[idx_puesto_SS_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_SS[idx_puesto_SS_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_SS[idx_puesto_SS_MayorTps].Ito);
puestos_SS[idx_puesto_SS_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else if (puestos_J[idx_puesto_J_MayorTps].Tps == HV)
{
//Si hay un puesto JUNIOR libre, toma el ticket
staTA += puestos_J[idx_puesto_J_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_J[idx_puesto_J_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_J[idx_puesto_J_MayorTps].Ito);
puestos_J[idx_puesto_J_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else
//Nadie lo pueda atender y el ticket queda encolado
cola_A.Add(ticket);
}
private void ProcesarLlegadaN()
{
clTicket ticket;
string prioridadTicket = cPrioridadNormal;
//Llegada de un nuevo ticket
nsN += 1; //Actualizar el NS correspondiente
nTN += 1; //Actualizar el NT correspondiente
ticket = new clTicket(prioridadTicket);
ticket.Tll = T; //tiempo de llegada del ticket
if (puestos_SS[idx_puesto_SS_MayorTps].Tps == HV)
{
//Si hay un puesto SEMI SENIOR libre, toma el ticket
staTN += puestos_SS[idx_puesto_SS_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_SS[idx_puesto_SS_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_SS[idx_puesto_SS_MayorTps].Ito);
puestos_SS[idx_puesto_SS_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else if (puestos_S[idx_puesto_S_MayorTps].Tps == HV)
{
//Si hay un puesto SENIOR libre, toma el ticket
staTN += puestos_S[idx_puesto_S_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_S[idx_puesto_S_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_S[idx_puesto_S_MayorTps].Ito);
puestos_S[idx_puesto_S_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else if (puestos_J[idx_puesto_J_MayorTps].Tps == HV)
{
//Si hay un puesto JUNIOR libre, toma el ticket
staTN += puestos_J[idx_puesto_J_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_J[idx_puesto_J_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_J[idx_puesto_J_MayorTps].Ito);
puestos_J[idx_puesto_J_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else
//Nadie lo pueda atender y el ticket queda encolado
cola_N.Add(ticket);
}
private void ProcesarLlegadaB()
{
clTicket ticket;
string prioridadTicket = cPrioridadBaja;
//Llegada de un nuevo ticket
nsB += 1; //Actualizar el NS correspondiente
nTB += 1; //Actualizar el NT correspondiente
ticket = new clTicket(prioridadTicket);
ticket.Tll = T; //tiempo de llegada del ticket
if (puestos_J[idx_puesto_J_MayorTps].Tps == HV)
{
//Si hay un puesto JUNIOR libre, toma el ticket
staTB += puestos_J[idx_puesto_J_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_J[idx_puesto_J_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_J[idx_puesto_J_MayorTps].Ito);
puestos_J[idx_puesto_J_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else if (puestos_SS[idx_puesto_SS_MayorTps].Tps == HV)
{
//Si hay un puesto SEMI SENIOR libre, toma el ticket
staTB += puestos_SS[idx_puesto_SS_MayorTps].AtenderTicket(ticket, T);
//El puesto deja de estar ocioso
puestos_SS[idx_puesto_SS_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_SS[idx_puesto_SS_MayorTps].Ito);
puestos_SS[idx_puesto_SS_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else if (puestos_S[idx_puesto_S_MayorTps].Tps == HV)
{
//Si hay un puesto SENIOR libre, toma el ticket
staTB += puestos_S[idx_puesto_S_MayorTps].AtenderTicket(ticket, T); ;
//El puesto deja de estar ocioso
puestos_S[idx_puesto_S_MayorTps].Sto += clDatosVar.RestarFechas(T, puestos_S[idx_puesto_S_MayorTps].Ito);
puestos_S[idx_puesto_S_MayorTps].Ito = DateTime.MinValue; //1/1/0001 00:00:00 (no puedo ponerle null)
}
else
//Nadie lo pueda atender y el ticket queda encolado
cola_B.Add(ticket);
}
private void ProcesarSalida(ref List<clPuesto> pPuestos, int pIndex)
{
//Avance del tiempo
T = pPuestos[pIndex].Tps;
//Sale el ticket
//Actualizar el NS correspondiente a la salida
if (String.Compare(pPuestos[pIndex].Pta(), cPrioridadAlta) == 0)
{ nsA -= 1; } //Prioridad ALTA
else if (String.Compare(pPuestos[pIndex].Pta(), cPrioridadNormal) == 0)
{ nsN -= 1; } //Prioridad NORMAL
else
{ nsB -= 1; } //Prioridad BAJA
//El puesto continuará atendiendo mientras haya tickets encolados
if (Cola_A.Count >= 1)
{
//Atender ticket de prioridad ALTA
staTA += pPuestos[pIndex].AtenderTicket(Cola_A[0], T); //sumarizamos tiempos de atención tickets de prioridad ALTA
Cola_A.RemoveAt(0); //disminuye la cola tickets prioridad ALTA
secA += pPuestos[pIndex].Ticket.Tesperacola; //Sumatoria tiempos de espera en Cola ALTA
}
else if (Cola_N.Count >= 1)
{
//Atender ticket de prioridad NORMAL
staTN += pPuestos[pIndex].AtenderTicket(Cola_N[0], T); //sumarizamos tiempos de atención tickets de prioridad NORMAL
Cola_N.RemoveAt(0); //disminuye la cola tickets prioridad NORMAL
secN += pPuestos[pIndex].Ticket.Tesperacola; //Sumatoria tiempos de espera en Cola NORMAL
}
else if (Cola_B.Count >= 1)
{
//Atender ticket de prioridad BAJA
staTB += pPuestos[pIndex].AtenderTicket(Cola_B[0], T); //sumarizamos tiempos de atención tickets de prioridad BAJA
Cola_B.RemoveAt(0); //disminuye la cola tickets prioridad BAJA
secB += pPuestos[pIndex].Ticket.Tesperacola; //Sumatoria tiempos de espera en Cola BAJA
}
else
{
//El puesto queda vacío
pPuestos[pIndex].Ticket = null;
pPuestos[pIndex].Tps = HV;
pPuestos[pIndex].Ito = T;
}
}
private int BuscarIdxMayorTps(List<clPuesto> pPuestos)
{
if (pPuestos.Count == 0)
return -1;
DateTime maxTps = DateTime.MinValue;
int idxMaxTps = -1;
for (var index = 0; index < pPuestos.Count; index++)
{
if (pPuestos[index].Tps > maxTps)
{
maxTps = pPuestos[index].Tps;
idxMaxTps = index;
}
}
return idxMaxTps;
/*
if (pPuestos.Count == 0)
return -1;
clPuesto puestoMayorTps = pPuestos.Aggregate((puesto1, puesto2) => puesto1.Tps > puesto2.Tps ? puesto1 : puesto2);
return pPuestos.IndexOf(puestoMayorTps);*/
}
private int BuscarIdxMenorTps(List<clPuesto> pPuestos)
{
if (pPuestos.Count == 0)
return -1;
DateTime minTps = DateTime.MaxValue;
int idxMinTps = -1;
for (var index = 0; index < pPuestos.Count; index++)
{
if (pPuestos[index].Tps <= minTps)
{
minTps = pPuestos[index].Tps;
idxMinTps = index;
}
}
return idxMinTps;
/*
if (pPuestos.Count == 0)
return -1;
clPuesto puestoMenorTps = pPuestos.Aggregate((puesto1, puesto2) => puesto1.Tps <= puesto2.Tps ? puesto1 : puesto2);
return pPuestos.IndexOf(puestoMenorTps);*/
}
}
}
You can’t perform that action at this time.