public HiloDeSimulacion(string ArchivoSalida, int NumeroDeSimulaciones, int NumeroDeRentas, double CostoDistribuidor, int periodosDelPlazo, double TazaFalloEquipo, double TazaCancelación, double TazaNoPago, double tazaInteresAnual, int periodosAnuales, double costoPublico) { this.NumeroDeSimulaciones = NumeroDeSimulaciones; this.NumeroDeRentas = NumeroDeRentas; this.CostoDistribuidor = CostoDistribuidor; this.periodosDelPlazo = periodosDelPlazo; this.TazaFalloEquipo = TazaFalloEquipo; this.TazaCancelación = TazaCancelación; this.TazaNoPago = TazaNoPago; this.ArchivoSalida = ArchivoSalida; TA = TA = new TablaAmortización(tazaInteresAnual / periodosAnuales, periodosDelPlazo, costoPublico); }
public void EjecutaSimulación(BinaryWriter file, TablaAmortización TA, int NumeroDeRentas, double costoDistribuidor, int periodosDelPlazo, double TazaFalloEquipo, double TazaCancelación, double TazaNoPago) { int CuantasFallas = 0; int CuantasCancelaciones = 0; int CuantosNoPagos = 0; double CostoInicialEquipo = 0; double CostosFallasEquipo = 0; double IngresosTotales = 0; Renta renta = new Renta(); Random rand = new Random(); CostoInicialEquipo = costoDistribuidor; RentasData datos = new RentasData(); for (int i = 0; i < NumeroDeRentas; i++) { renta.SimulaRenta(periodosDelPlazo, TazaFalloEquipo, TazaCancelación, TazaNoPago, rand); datos.PagoPeriodico = TA.PagoPeriodico(); datos.CostoInicialEquipo = CostoInicialEquipo; datos.FalloEquipo = renta._FalloEquipo; datos.CancelaciónContrato = renta._CancelaciónContrato; datos.PeriodoCancelación = renta._PeriodoCancelación; datos.NoPago = renta._NoPago; datos.PeriodoNoPago = renta._PeriodoNoPago; datos.Plazos = periodosDelPlazo; if (renta._FalloEquipo) { CuantasFallas++; } double PagoTotal = 0; if (renta._CancelaciónContrato) { CuantasCancelaciones++; PagoTotal = renta._PeriodoCancelación * TA.PagoPeriodico(); IngresosTotales += PagoTotal; datos.PagoTotal = PagoTotal; //Console.WriteLine(PagoTotal); } else { if (renta._NoPago) { CuantosNoPagos++; PagoTotal = (renta._PeriodoNoPago - 1) * TA.PagoPeriodico(); IngresosTotales += PagoTotal; datos.PagoTotal = PagoTotal; //Console.WriteLine(PagoTotal); } else { PagoTotal = periodosDelPlazo * TA.PagoPeriodico(); IngresosTotales += PagoTotal; datos.PagoTotal = PagoTotal; //Console.WriteLine(PagoTotal); } } byte[] byteArr = datos.Serialize(); Int32 sizeOfarrByte = byteArr.Length; file.Write(sizeOfarrByte); file.Write(byteArr); } CostosFallasEquipo = CuantasFallas * costoDistribuidor; Result.PagoMensual = TA.PagoPeriodico(); Result.CostoInicialEquipo = costoDistribuidor * NumeroDeRentas; Result.IngresosTotales = IngresosTotales; Result.CostosFallasEquipo = CostosFallasEquipo; Result.FallasTotales = CuantasFallas; Result.CuantasCancelaciones = CuantasCancelaciones; Result.CuantosNoPagos = CuantosNoPagos; }
static void Main(string[] args) { double costoPublico = 0; double costoDistribuidor = 0; int periodosDelPlazo = 0; int periodosAnuales = 0; double tazaInteresAnual = 0; int NumeroDeRentas = 0; double TazaFalloEquipo = 0; double TazaCancelación = 0; double TazaNoPago = 0; int NumeroSimulaciones = 0; int NumeroThreads; /* El 8 es el numero de cores del procesador */ HiloDeSimulacion[] HilosDeSimulacion = new HiloDeSimulacion[8]; Thread[] threads = new Thread[8]; /* * * do * { * Console.Write("Numero de Threads (max 8) : "); * NumeroThreads = int.Parse(Console.ReadLine()); * } * while (NumeroThreads > 8); */ using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\SimulacionesRentas\ResultadosSimulaciones.txt")) { file.WriteLine("CostoPublico, CostoDistribuidor, PeriodosPorAño, PeriodosDelContrato, TazaIntAnual, NumeroDeRentas, TazaDeFallo, TazaDeCancelación, TazaNoPago, NumeroDeThreads, " + "PagoMensualDeAguaCaliente, CostoInicialDeLosEquipos, IngresosTotales, CostosPorFallaDeEquipos, NumeroDeFallasDeEquipos, NumeroDeCancelaciones, NumeroDeNoPagos, SimulationTime"); var lineas = File.ReadLines(@"D:\SimulacionesRentas\Simulaciones.txt"); int linea = 1; foreach (string line in lineas) { Console.WriteLine(line); //Console.ReadKey(); string[] numbers = line.Split(','); costoPublico = Convert.ToDouble(numbers[0]); costoDistribuidor = Convert.ToDouble(numbers[1]); periodosAnuales = int.Parse(numbers[2]); periodosDelPlazo = int.Parse(numbers[3]); tazaInteresAnual = Convert.ToDouble(numbers[4]); NumeroDeRentas = int.Parse(numbers[5]); TazaFalloEquipo = Convert.ToDouble(numbers[6]); TazaCancelación = Convert.ToDouble(numbers[7]); TazaNoPago = Convert.ToDouble(numbers[8]); NumeroThreads = int.Parse(numbers[9]); if (NumeroThreads < 9) { file.Write(costoPublico + ", " + costoDistribuidor + ", " + periodosAnuales + ", " + periodosDelPlazo + ", " + tazaInteresAnual + ", " + NumeroDeRentas + ", " + TazaFalloEquipo + ", " + TazaCancelación + ", " + TazaNoPago + ", " + NumeroThreads + ", "); int repeticiones = 100; // veces que se simula una renta NumeroSimulaciones = NumeroDeRentas * repeticiones; int cociente = NumeroSimulaciones / NumeroThreads; int residuo = NumeroSimulaciones % NumeroThreads; Console.WriteLine("Numero de Rentas: " + NumeroDeRentas); Console.WriteLine("cociente: " + cociente + " residuo: " + residuo + " prueba " + (NumeroThreads * cociente + residuo - NumeroSimulaciones)); string ArchivoSalida = "AS_" + linea++ + "_"; for (int i = 0; i < (NumeroThreads - 1); i++) { HilosDeSimulacion[i] = new HiloDeSimulacion(ArchivoSalida + i, cociente, NumeroDeRentas, costoDistribuidor, periodosDelPlazo, TazaFalloEquipo, TazaCancelación, TazaNoPago, tazaInteresAnual, periodosAnuales, costoPublico); } HilosDeSimulacion[NumeroThreads - 1] = new HiloDeSimulacion(ArchivoSalida + (NumeroThreads - 1), cociente + residuo, NumeroDeRentas, costoDistribuidor, periodosDelPlazo, TazaFalloEquipo, TazaCancelación, TazaNoPago, tazaInteresAnual, periodosAnuales, costoPublico); var empiezo = DateAndTime.TimeOfDay; int epochInicio = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; for (int i = 0; i < NumeroThreads; i++) { threads[i] = new Thread(new ThreadStart(HilosDeSimulacion[i].EjecutaHilo)); } for (int i = 0; i < NumeroThreads; i++) { threads[i].Start(); } for (int i = 0; i < NumeroThreads; i++) { threads[i].Join(); } var fin = DateAndTime.TimeOfDay; int epochFin = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; // int epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; Console.WriteLine("Simulation time: " + (fin - empiezo)); Console.WriteLine("Epoch " + epochFin + " " + epochInicio); double MIT = 0; for (int i = 0; i < NumeroThreads; i++) { MIT += HilosDeSimulacion[i].MeanIngresosTotales; } double MCFE = 0; for (int i = 0; i < NumeroThreads; i++) { MCFE += HilosDeSimulacion[i].MeanCostosFallasEquipo; } double MFT = 0; for (int i = 0; i < NumeroThreads; i++) { MFT += HilosDeSimulacion[i].MeanFallasTotales; } double MC = 0; for (int i = 0; i < NumeroThreads; i++) { MC += HilosDeSimulacion[i].MeanCancelaciones; } double MNP = 0; for (int i = 0; i < NumeroThreads; i++) { MNP += HilosDeSimulacion[i].MeanNoPagos; } TablaAmortización TA = new TablaAmortización(tazaInteresAnual / periodosAnuales, periodosDelPlazo, costoPublico); file.WriteLine(TA.PagoPeriodico() + ", " + NumeroDeRentas * costoDistribuidor + ", " + MIT / NumeroSimulaciones + ", " + MCFE / NumeroSimulaciones + ", " + MFT / NumeroSimulaciones + ", " + MC / NumeroSimulaciones + ", " + MNP / NumeroSimulaciones + ", " + (fin - empiezo)); } else { Console.WriteLine("Demasiados Threads"); } } } Console.ReadKey(); }