public Solution GetSolution(WeeklyEventAssignment[] existingAssignments) { foreach (var assignment in existingAssignments) { var eventIndex = Array.IndexOf(events, assignment.Event); if (eventIndex != -1) { var slotId = TimeSlot.ToId(assignment.TimeSlot, data.Days, data.SlotsPerDay); solution.Result[eventIndex].TimeSlotId = slotId; solution.Result[eventIndex].RoomId = assignment.RoomId; solution.TimeslotEvents[slotId].Add(eventIndex); } } // itarate through all the events to complete the path for (var i = 0; i < eventsCount; i++) { // chose next event from the list var e = mmasData.SortedEventList[i]; if (solution.Result[e].TimeSlotId == -1) { var timeslot = GetTimeSlotId(e); solution.Result[e].TimeSlotId = timeslot; int[] assignedRooms = existingAssignments .Where(a => TimeSlot.ToId(a.TimeSlot, data.Days, data.SlotsPerDay) == timeslot) .Select(a => a.RoomId) .ToArray(); solution.Result[e].RoomId = data.Rooms.Where(r => data.SuitableRoom(events[e].Id, r.Id) && !assignedRooms.Contains(r.Id)) .Select(r => r.Id) .Shuffle(solution.rg) .DefaultIfEmpty(data.Rooms[solution.rg.Next(data.Rooms.Length)].Id) .First(); solution.TimeslotEvents[timeslot].Add(e); } } return solution; }
public void SetPheromoneFromExistingAssignments(WeeklyEventAssignment[] assignments) { SetPheromone(MinPherLevel); foreach (var assignment in assignments) { var eventIndex = Array.IndexOf(events, assignment.Event); if (eventIndex != -1) { var slotId = TimeSlot.ToId(assignment.TimeSlot, data.Days, data.SlotsPerDay); Pheromones[eventIndex, slotId] = MaxPherLevel; } } }
public void AddAssignment(WeeklyEventAssignment assignment) { Event e = assignment.Event; EventAssignment current; if (!assignments.TryGetValue(e, out current)) { current = new EventAssignment(e); assignments.Add(e, current); } if (assignment.Week == 1) current.FirstWeekAssignment = assignment; else current.SecondWeekAssignment = assignment; }
static XElement MakeWeekAssignmentElement(WeeklyEventAssignment was) { if (was == null) return null; var weekTag = string.Empty; switch (was.Week) { case 1: weekTag = "FirstWeek"; break; case 2: weekTag = "SecondWeek"; break; default: throw new ArgumentException("week"); } return new XElement(weekTag, new XAttribute("room", was.RoomId), new XAttribute("day", was.TimeSlot.Day), new XAttribute("slot", was.TimeSlot.Slot)); }
static Solution Schedule(TimeTableData problemData, int week, WeeklyEventAssignment[] guidingAssignments = null) { TimeTableData timeTable = problemData; problemData.PrepareSuitableTimeSlots(false); MMASData mmasData = new MMASData(timeTable, week, EVAPORATION, MIN_PHERAMONE); bool secondWeek = guidingAssignments != null; if (secondWeek) mmasData.SetPheromoneFromExistingAssignments(guidingAssignments); else mmasData.ResetPheromone(); Solution bestSoFarSolution = new Solution(problemData, week); bestSoFarSolution.RandomInitialSolution(); bestSoFarSolution.ComputeFeasibility(); bestSoFarSolution.ComputeHcv(); int currIter = 0; int lastImprIter = 0; while (currIter - lastImprIter < 200) { Solution bestIterSolution = Enumerable.Range(0, ANTS_NUMBER) .AsParallel() .Select(_ => { var ant = new Ant(timeTable, mmasData, week); return !secondWeek ? ant.GetSolution() : ant.GetSolution(guidingAssignments); }) .Min(); // apply local search until local optimum is reached or a steps limit reached if (secondWeek) { DEFAULT_MAX_STEPS = Math.Min(DEFAULT_MAX_STEPS + 50, 5000); bestIterSolution.ResolveOnlyWeekSpecificConflicts = true; } bestIterSolution.LocalSearch(bestIterSolution.IsFeasible ? 3000 : DEFAULT_MAX_STEPS); // output the new best solution, if found if (bestIterSolution.CompareTo(bestSoFarSolution) < 0) { bestIterSolution.CopyTo(bestSoFarSolution); lastImprIter = currIter; } // update pheromones mmasData.EvaporatePheromone(); mmasData.SetPheromoneLimits(); if (bestIterSolution.ResolveOnlyWeekSpecificConflicts) mmasData.DepositPheromone(bestIterSolution); else mmasData.DepositPheromone(bestSoFarSolution); currIter++; Console.WriteLine("iter: {0}, HCV: {1}, SCV: {2}", currIter, bestSoFarSolution.Hcv, bestSoFarSolution.Scv); } bestSoFarSolution.ComputeHcv(); bestSoFarSolution.ComputeScv(); Console.WriteLine("RAW: HCV: {0}, SCV: {1}", bestSoFarSolution.Hcv, bestSoFarSolution.Scv); problemData.PrepareSuitableTimeSlots(true); bestSoFarSolution.TryResolveHcv(); bestSoFarSolution.ComputeHcv(); bestSoFarSolution.ComputeScv(); Console.WriteLine("RESOLVE: HCV: {0}, SCV: {1}", bestSoFarSolution.Hcv, bestSoFarSolution.Scv); bestSoFarSolution.LocalSearch(10000, 1, 1); //try to resolve scv bestSoFarSolution.ComputeHcv(); bestSoFarSolution.ComputeScv(); Console.WriteLine("RESULT: HCV: {0}, SCV: {1}", bestSoFarSolution.Hcv, bestSoFarSolution.Scv); return bestSoFarSolution; }