public void HeurusticRoomChoose(string filename) { var data = Data.ReadXml(dataPath + filename, "120", "4"); Console.WriteLine($"Dataset: {data.Name}"); Console.WriteLine($"Courses: {data.Courses.Count} Lectures: {data.Courses.Sum(c => c.Lectures)}"); var formulation = ProblemFormulation.MinimizeRoomCost; var newrooms = CreateRoomsFixedSize(data, 25, 1); data.SetRoomList(newrooms); var solutions = new List <Dictionary <Room, int> >(); for (var overcapacity = 0; overcapacity < 100; overcapacity += 10) { var model = new RoomChoose(data, formulation, overcapacity); model.Optimize(); var usedrooms = model.GetUsedRooms(); solutions.Add(usedrooms); DisplayRoomStats("testest", usedrooms, data); } var nsizes = newrooms.Select(r => r.Capacity).Distinct().ToList(); nsizes.Add(0); nsizes.Sort(); // nsizes.RemoveAt(nsizes.Count-1); Console.WriteLine("\nAccumulated Timeslots Free / #lecture (>n):"); Console.WriteLine($"Cost;{string.Join(";", nsizes.Select(r => "n" + r))}"); foreach (var sol in solutions) { var availRoomsHours = nsizes.ToDictionary(n => n, n => sol.Where(rkv => rkv.Key.Capacity > n).Sum(rt => rt.Value * data.TimeSlots.Count)); var freeTimeslots = nsizes.ToDictionary(n => n, n => availRoomsHours[n] - data.Courses.Where(a => a.NumberOfStudents > n).Sum(c => c.Lectures)); Console.WriteLine( $"{sol.Sum(s => s.Value*s.Key.Cost)};{string.Join(";", nsizes.Select(r => $"{((double) availRoomsHours[r] / data.Courses.Where(a => a.NumberOfStudents > r).Sum(c => c.Lectures)) -1:0.00}")) }"); } }
public void MaximizeRoomUtilizationSimplemodel(string filename) { var data = Data.ReadXml(dataPath + filename, "120", "4"); Console.WriteLine($"Dataset: {data.Name}"); Console.WriteLine($"Courses: {data.Courses.Count} Lectures: {data.Courses.Sum(c => c.Lectures)}"); var formulation = ProblemFormulation.MinimizeRoomCost; var newrooms = CreateRooms(data); data.SetRoomList(newrooms); var model = new RoomChoose(data, formulation); model.Optimize(); var usedrooms = model.GetUsedRooms(); DisplayRoomStats("optimizedLowerBound", usedrooms, data); var roomcalc = new RoomCombinations(data); Assert.LessOrEqual(Math.Abs(roomcalc._minCost - usedrooms.Sum(r => r.Key.Cost * r.Value)), 1e-1, "something wrong"); }