public void PreparaCenario(List <Cenario> cenarios, ParametrosPerna[] parametrosPernas, ParametrosPernaCenario[] parametrosPernasCenario, int perna) { ParametrosPerna parametrosPerna = parametrosPernas[perna]; if (perna < parametrosPernas.Length - 1) { for (decimal x = parametrosPerna.MinX; x <= parametrosPerna.MaxX; x = decimal.Add(x, 0.01m)) { parametrosPernasCenario[perna].X = x; PreparaCenario(cenarios, parametrosPernas, parametrosPernasCenario, perna + 1); } } else { Cenario cenario = new Cenario(parametrosPernasCenario); cenario = CalculaUltimaPernaCenario(parametrosPernas, cenario, perna); if (cenario != null) { cenario = CalculaCenario(cenario); cenarios.Add(cenario); } } }
public void PreparaCenario(List <Cenario> cenarios, ParametrosPerna[] parametrosPernas, ParametrosPernaCenario[] parametrosPernasCenario, int perna) { ParametrosPerna parametrosPerna = parametrosPernas[perna]; if (perna < parametrosPernas.Length - 1) { List <Task> tasks = new List <Task>(); List <List <Cenario> > cenariosPorTasks = new List <List <Cenario> >(); for (decimal x = parametrosPerna.MinX; x <= parametrosPerna.MaxX; x = decimal.Add(x, 0.01m)) { parametrosPernasCenario[perna].X = x; if (perna == 0) { ParametrosPernaCenario[] parametrosPernasNovoCenario = new ParametrosPernaCenario[parametrosPernas.Length]; for (int i = 0; i < parametrosPernas.Length; i++) { parametrosPernasNovoCenario[i] = new ParametrosPernaCenario(parametrosPernasCenario[i]); } /// Cada task tem uma lista de cenários, para evitar problemas de concorrência List <Cenario> cenariosPorTask = new List <Cenario>(); cenariosPorTasks.Add(cenariosPorTask); Task task = Task.Run(() => PreparaCenario(cenariosPorTask, parametrosPernas, parametrosPernasNovoCenario, perna + 1)); tasks.Add(task); } else { PreparaCenario(cenarios, parametrosPernas, parametrosPernasCenario, perna + 1); } } if (tasks.Count > 0) { Task.WaitAll(tasks.ToArray()); foreach (List <Cenario> cenariosPorTask in cenariosPorTasks) { cenarios.AddRange(cenariosPorTask); } } } else { Cenario cenario = new Cenario(parametrosPernasCenario); cenario = CalculaUltimaPernaCenario(parametrosPernas, cenario, perna); if (cenario != null) { cenario = CalculaCenario(cenario); cenarios.Add(cenario); } } }
public Cenario CalculaCenario(Cenario cenario) { for (int i = 0; i < cenario.Parametros.Length; i++) { decimal resultado = (cenario.Parametros[i].X - cenario.Parametros[i].PrecoExec) / cenario.Parametros[i].Vega; resultado *= resultado; cenario.Resultado += resultado; } if (cenario.Resultado == 0.0m) { cenario.Print(); } return(cenario); }
public void Modula(ParametrosPerna[] parametrosPernas) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); List <Cenario> cenarios = new List <Cenario>(); PreparaCenarios(cenarios, parametrosPernas); //foreach (Cenario cenario in cenarios) //{ // if (cenario == null) // { // cenario.Print(); // } // CalculaCenario(cenario); //} Cenario melhorCenario = cenarios.OrderBy(s => s.Resultado).FirstOrDefault(); Console.WriteLine("ModulacaoSync"); Console.WriteLine(); Console.WriteLine($"Cenarios: {cenarios.Count}"); Console.WriteLine(); melhorCenario.Print(); Console.WriteLine(); stopWatch.Stop(); Console.WriteLine($"ExecutionTime: {stopWatch.ElapsedMilliseconds}"); Console.WriteLine(); }
private Cenario CalculaUltimaPernaCenario(ParametrosPerna[] parametrosPernas, Cenario cenario, int n) { decimal sum = 0m; for (int i = 0; i < n; i++) { sum = decimal.Add(sum, cenario.Parametros[i].X); } cenario.Parametros[n].X = sum * -1; if (cenario.Parametros[n].X >= parametrosPernas[n].MinX && cenario.Parametros[n].X <= parametrosPernas[n].MaxX) { return(cenario); } else { return(null); } }