コード例 #1
0
        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;
        }
コード例 #2
0
 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;
         }
     }
 }
コード例 #3
0
        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;
        }
コード例 #4
0
 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));
 }
コード例 #5
0
        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;
        }