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; }
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; }
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; }