private void SolveMultiple100() { KnapsackInput input; for (int i = 0; i < 100; i++) { input = new KnapsackInput(); input.GenerateRandomItems(); var stopwatch = new Stopwatch(); var solverBaB = new BranchAndBoundSolver(input.Items, input.Capacity); var solverRand = new RandomSolver(input.Items, input.Capacity); var solverGreedy = new GreedySolver(input.Items, input.Capacity); var solverDynamic = new DynamicProgrammingSolver(input.Items, input.Capacity); stopwatch.Start(); solverBaB.Solve(); stopwatch.Stop(); timeResultsBaB.Add(new DataPoint(i, stopwatch.Elapsed.TotalMilliseconds)); stopwatch.Restart(); solverRand.Solve(); stopwatch.Stop(); timeResultsRand.Add(new DataPoint(i, stopwatch.Elapsed.TotalMilliseconds)); stopwatch.Restart(); solverGreedy.Solve(); stopwatch.Stop(); timeResultsGreedy.Add(new DataPoint(i, stopwatch.Elapsed.TotalMilliseconds)); stopwatch.Restart(); solverDynamic.Solve(); stopwatch.Stop(); timeResultsDynamic.Add(new DataPoint(i, stopwatch.Elapsed.TotalMilliseconds)); } timeAverageGreedy = Math.Round((timeResultsGreedy.Sum(x => x.Y) / 100), 4); timeAverageRand = Math.Round((timeResultsRand.Sum(x => x.Y) / 100), 4); timeAverageBaB = Math.Round((timeResultsBaB.Sum(x => x.Y) / 100), 4); timeAverageDynamic = Math.Round((timeResultsDynamic.Sum(x => x.Y) / 100), 4); }
private void RunGreedyVsNoGreedy() { var resultsFile = $"{ResultsFolder}greedy_vs_ilp_{DateTime.Now.ToString("yyyy-dd-M-HH-mm-ss")}.csv"; using (var writer = new StreamWriter(resultsFile)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteHeader(typeof(GreedyVsILPResult)); csv.NextRecord(); } for (int i = 1; i <= NumberOfInstances; i++) { using (var stream = File.Open(resultsFile, FileMode.Append)) using (var writer = new StreamWriter(stream)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.Configuration.HasHeaderRecord = false; var instanceFile = $"{InstancesFolder}/Exact{i}.txt"; var configFile = $"{ConfigsFolder}tune_Exact{i}_0.prm"; var cinemaILP = CinemaReader.Read(instanceFile); var cinemaGreedy = CinemaReader.Read(instanceFile);; var solverILP = new ILPSolver(cinemaILP); var timesILP = solverILP.Solve(false, Options.Debug, paramFile: configFile); var greedySolver = new GreedySolver(cinemaGreedy); var timesGreedy = greedySolver.Solve(); var result = new GreedyVsILPResult { InstanceFile = instanceFile, ConfigFile = configFile, TotalNumberOfGroups = cinemaILP.TotalNumberOfGroups, TotalNumberOfPeople = cinemaILP.TotalNumberOfPeople, ILPTime = timesILP["Total"], GreedyTime = timesGreedy["Total"], SeatedGreedy = cinemaGreedy.CountSeated(), SeatedILP = cinemaILP.CountSeated(), ValidGreedy = cinemaGreedy.Verify(), ValidILP = cinemaILP.Verify(), Capacity = cinemaGreedy.InitialCapacity }; csv.WriteRecord(result); csv.NextRecord(); } } }
private void Greedy_Click(object sender, RoutedEventArgs e) { if (input == null) { MessageBox.Show("You should choose data first", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } else { var stopwatch = new Stopwatch(); var solver = new GreedySolver(input.Items, input.Capacity); stopwatch.Start(); var solution = solver.Solve(); stopwatch.Stop(); itemsGrid.DataContext = solution.Items; allItemsGrid.DataContext = input.Items; resultTextBlock.Text = "Capacity: " + solution.Capacity + ". Total value = " + solution.Value + ". Total weight = " + solution.TotalWeight + "." + " Time: " + stopwatch.Elapsed; } }
private void RunTryGreedyFirst() { var resultsFile = $"{ResultsFolder}greedy_first_{DateTime.Now.ToString("yyyy-dd-M-HH-mm-ss")}.csv"; using (var writer = new StreamWriter(resultsFile)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteHeader(typeof(TryGreedyFirstResult)); csv.NextRecord(); } for (int i = 1; i <= NumberOfInstances; i++) { using (var stream = File.Open(resultsFile, FileMode.Append)) using (var writer = new StreamWriter(stream)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.Configuration.HasHeaderRecord = false; var instanceFile = $"{InstancesFolder}/Exact{i}.txt"; var configFile = $"{ConfigsFolder}tune_Exact{i}_0.prm"; var cinema = CinemaReader.Read(instanceFile); var greedyCinema = CinemaReader.Read(instanceFile); var greedySolver = new GreedySolver(greedyCinema); var totalTime = Utils.TimeAction(() => { var times = greedySolver.Solve(); if (cinema.TotalNumberOfPeople != greedyCinema.CountSeated()) { var ilpCinema = CinemaReader.Read(instanceFile); var ilpSolver = new ILPSolver(ilpCinema); times = ilpSolver.Solve(Options.Tune, Options.Debug, Options.TuneOutputFile, configFile); cinema = ilpCinema; } else { cinema = greedyCinema; } }, "Time"); var result = new TryGreedyFirstResult { InstanceFile = instanceFile, ConfigFile = configFile, TotalNumberOfGroups = cinema.TotalNumberOfGroups, TotalNumberOfPeople = cinema.TotalNumberOfPeople, TotalTime = totalTime, Seated = cinema.CountSeated(), Valid = cinema.Verify(), Capacity = cinema.InitialCapacity }; csv.WriteRecord(result); csv.NextRecord(); } } }
public void Run() { var totalTime = Utils.TimeAction(() => { var cinema = CinemaReader.Read(Options.InstanceConfig.InstanceFile); Dictionary <string, string> times = new Dictionary <string, string>(); Console.WriteLine("Solving: " + Options.InstanceConfig.InstanceFile); Console.WriteLine(cinema); if (Options.GreedyOnly) { var solver = new GreedySolver(cinema); if (Options.Debug) { Console.WriteLine("Solving via Greedy only"); } times = solver.Solve(); } else if (Options.ILPOnly) { var solver = new ILPSolver(cinema); if (Options.Debug) { Console.WriteLine("Solving via ILP only"); } times = solver.Solve(Options.Tune, Options.Debug, Options.TuneOutputFile, Options.InstanceConfig.ConfigFile); } else { if (Options.Debug) { Console.WriteLine("Solving via both"); } var greedyCinema = CinemaReader.Read(Options.InstanceConfig.InstanceFile); var greedySolver = new GreedySolver(greedyCinema); times = greedySolver.Solve(); if (cinema.TotalNumberOfPeople != greedyCinema.CountSeated()) { var ilpCinema = CinemaReader.Read(Options.InstanceConfig.InstanceFile); var ilpSolver = new ILPSolver(ilpCinema); times = ilpSolver.Solve(Options.Tune, Options.Debug, Options.TuneOutputFile, Options.InstanceConfig.ConfigFile); cinema = ilpCinema; } else { cinema = greedyCinema; } } Console.WriteLine(cinema); Console.WriteLine("People seated:" + cinema.CountSeated() + " out of " + cinema.TotalNumberOfPeople); Console.WriteLine($"Valid cinema:{cinema.Verify()}"); }, "Time"); Console.WriteLine($"Total Solving Time: {totalTime}"); }