示例#1
0
 public Gene(Slot slot, Event evt, Room room, bool cannotChange)
 {
     this.slot = slot;
       this.evt = evt;
       this.room = room;
       this.cannotChange = cannotChange;
 }
        /* Checks for any clashes between groups and rooms for a particular slot */
        public bool doClashesExist(Slot s, Event e, Room r)
        {
            int indexOfSelectedSlot = Program.slots.IndexOf(s);
              bool clashes = false;
              int i = 0;

              // ensure there are no index out of bound errors
              if ((indexOfSelectedSlot + e.getDuration()) >= Program.slots.Count)
            clashes = true;

              /* Check that there are no clashes for any hours of the event */
              while ((i < e.getDuration()) && (!clashes))
              {
            List<Gene> eventsAtThisTime = new List<Gene>();

            foreach (Gene g in chromosome)
            {
              if (g.getSlot() == s)
            eventsAtThisTime.Add(g);
            }

            int j = 0;
            while ((j < eventsAtThisTime.Count) && (!clashes))
            {
              if ((eventsAtThisTime[j].getEvent().getGroups().Intersect(e.getGroups()).Count() > 0) ||
              (eventsAtThisTime[j].getRoom() == r && r != Program.lunchRoom))
            clashes = true;
              j++;
            }

            s = Program.slots[++indexOfSelectedSlot];
            i++;
              }
              return clashes;
        }
示例#3
0
 public Gene()
 {
     this.slot = new Slot();
       this.evt = new Event();
       this.room = new Room();
       cannotChange = false;
 }
        public bool enoughTimeInDay(Slot s, Event e)
        {
            List<Slot> remainingSlotsInDay = new List<Slot>();
              for (int i = 0; i < Program.slots.Count; i++)
              {
            if ((Program.slots[i].getDay() == s.getDay()) && (Program.slots[i].getWeek() == s.getWeek()))
              remainingSlotsInDay.Add(Program.slots[i]);
              }

              if (((remainingSlotsInDay.IndexOf(s) + e.getDuration()) > remainingSlotsInDay.Count))
            return false;
              else
            return true;
        }
示例#5
0
        private void loadXML()
        {
            try
              {
            XmlTextReader reader = new XmlTextReader("data.xml");

            string groupRecord = "";
            Event eventToAdd = new Event();
            List<string> eventGroups = new List<string>();
            Gene fixedEventGene = new Gene();
            Room roomToAdd = new Room();
            string feDay = "";
            string feTime = "";
            while (reader.Read())
            {
              reader.MoveToContent();

              // groups
              string text = reader.Name.ToString();
              if (text == "GroupYear")
            groupRecord += reader.ReadString();
              else if (text == "GroupName")
            groupRecord += reader.ReadString();
              else if (text == "GroupDescription")
              {
            groupRecord += " - " + reader.ReadString();
            groups.Add(groupRecord);
            groupRecord = "";
              }

              // events
              else if (text == "CourseCode")
              {
            eventToAdd = new Event();
            eventToAdd.setCourse(reader.ReadString());
              }
              else if (text == "Activity")
            eventToAdd.setActivity(reader.ReadString());
              else if (text == "Duration")
            eventToAdd.setDuration(Int32.Parse(reader.ReadString()));
              else if (text == "Weekly")
              {
            eventToAdd.setWeekly(Boolean.Parse(reader.ReadString()));
            eventGroups = new List<string>();
              }
              else if (text == "EventGroup")
            eventGroups.Add(reader.ReadString());
              else if (text == "EventRoomSize")
              {
            eventToAdd.setGroups(eventGroups);
            eventToAdd.setRoomSize(reader.ReadString());
            events.Add(eventToAdd);
              }

              // fixed events
              else if (text == "FEDay")
              {
            fixedEventGene = new Gene();
            feDay = reader.ReadString();
            fixedEventGene.setCannotChange(true);
              }
              else if (text == "FETime")
            feTime = reader.ReadString();
              else if (text == "FEWeek")
              {
            fixedEventGene.setSlot(Genetic_Algorithms.Program.findSlot(getDayNum(feDay),
                                                                       Int32.Parse(feTime),
                                                                       reader.ReadString()));
              }
              else if (text == "FEDuration")
            fixedEventGene.getEvent().setDuration(Int32.Parse(reader.ReadString()));

              else if (text == "FECourseCode")
            fixedEventGene.getEvent().setCourse(reader.ReadString());
              else if (text == "FEActivity")
              {
            fixedEventGene.getEvent().setActivity(reader.ReadString());
            eventGroups = new List<string>();
              }
              else if (text == "FEGroup")
            eventGroups.Add(reader.ReadString());
              else if (text == "FERoom")
              {
            fixedEventGene.getEvent().setGroups(eventGroups);

            fixedEventGene.getRoom()._name = reader.ReadString();
            fixedEventGene.getRoom()._size = "";
            fixedEventGene.getRoom()._type = "";

            fixedEvents.Add(fixedEventGene);
              }

              // rooms
              else if (text == "RoomName")
              {
            roomToAdd = new Room();
            roomToAdd._name = reader.ReadString();
              }
              else if (text == "RoomSize")
            roomToAdd._size = reader.ReadString();
              else if (text == "RoomType")
              {
            roomToAdd._type = reader.ReadString();
            rooms.Add(roomToAdd);
              }

              // courses
              else if (text == "CourseName")
            courses.Add(reader.ReadString());

              // external rooms
              else if (text == "ExternalRoomName")
            externalRooms.Add(reader.ReadString());
            }
              }
              catch (Exception exp)
              {
            Console.WriteLine(exp);
              }
        }
 /* this method is required as some places the chromosome is viewed
  * as a Chromosome instead of a List<Gene> */
 public void add(Slot s, Event e, Room r, bool cannotChange)
 {
     chromosome.Add(new Gene(s, e, r, cannotChange));
 }
        public void scheduleEvent(Event e)
        {
            /* Choose a random slot to attempt to schedule this event in */
              Slot selectedSlot = Program.slots[random.Next(Program.slots.Count)];
              if (e.getWeekly() && selectedSlot.getWeek() == "B")
            selectedSlot = getCorrespondingSlot(selectedSlot);

              List<Room> availableRooms = findAvailableRooms(e.getRoomSize(), e.getActivity());
              Room selectedRoom = null;

              bool scheduable = false;

              /* If there is enough time remaining in the day to schedule this event
               * at this slot, try to find a room that is available and does not cause
               * a clash */
              if (enoughTimeInDay(selectedSlot, e))
              {
            int i = 0;
            while ((i < availableRooms.Count) && (!scheduable))
            {
              selectedRoom = availableRooms[i];
              bool clashes = doClashesExist(selectedSlot, e, selectedRoom);
              if (!clashes && e.getWeekly())
            clashes = doClashesExist(getCorrespondingSlot(selectedSlot), e, selectedRoom);
              if (!clashes)
            scheduable = true;
              i++;
            }
              }

              /* if this random slot is not feasible then go from this slot + 1 to the end of the
               * slots list trying to schedule this event in each slot */
              if (!scheduable)
              {
            int selectedSlotIndex = Program.slots.IndexOf(selectedSlot);
            int i = selectedSlotIndex + 2;
            while ((i < Program.slots.Count) && (!scheduable))
            {
              selectedSlot = Program.slots[i];
              if (enoughTimeInDay(selectedSlot, e))
              {
            int j = 0;
            while ((j < availableRooms.Count) && (!scheduable))
            {
              selectedRoom = availableRooms[j];
              bool clashes = doClashesExist(selectedSlot, e, selectedRoom);
              if (!clashes && e.getWeekly())
                clashes = doClashesExist(getCorrespondingSlot(selectedSlot), e, selectedRoom);
              if (!clashes)
                scheduable = true;
              j++;
            }
              }
              i += 2;
            }

            /* go from the beginning of the slots to the slot that was initially chosen - 1
             * only if a slot hasn't been found */
            if (!scheduable)
            {
              i = 0;
              while ((i < selectedSlotIndex) && (!scheduable))
              {
            selectedSlot = Program.slots[i];
            if (enoughTimeInDay(selectedSlot, e))
            {
              int j = 0;
              while ((j < availableRooms.Count) && (!scheduable))
              {
                selectedRoom = availableRooms[j];
                bool clashes = doClashesExist(selectedSlot, e, selectedRoom);
                if (!clashes && e.getWeekly())
                  clashes = doClashesExist(getCorrespondingSlot(selectedSlot), e, selectedRoom);
                if (!clashes)
                  scheduable = true;
                j++;
              }
            }
            i += 2;
              }
            }
              }

              if (scheduable)
              {
            Gene aGene = new Gene(selectedSlot, e, selectedRoom, false);
            bookSlots(selectedSlot, aGene);
              }
              else
            unscheduableEvents.Add(e);
        }
 public bool hasLunchBeenScheduled(Slot s, Event e)
 {
     int numberTimesScheduled = (from g in chromosome
                           where g.getEvent() == e && g.getSlot().getDay() == s.getDay()
                           select g).Count();
       if (numberTimesScheduled == 1)
     return true;
       else
     return false;
 }
        public bool hasEventBeenScheduled(Event e)
        {
            int numberTimesScheduled = chromosome.FindAll(delegate(Gene g) { return g.getEvent() == e; }).Count;
              int expectedNumberOfTimes = Program.events.FindAll(delegate(Event evt) { return evt == e; }).Count * e.getDuration();

              if (e.getWeekly())
            expectedNumberOfTimes *= 2;

              if (numberTimesScheduled == expectedNumberOfTimes)
            return true;
              else
            return false;
        }