2015-07-01 4 views
0

Мне нужно создать расписание для 6 классов в университете. Ниже приведены классы, которые я придумал.C++: программа расписания

class ClassRoom 
{ 
    private: 
    char id[5]; 
    char type; 
    int cap; 
public: 
    void setRoom(); 
    void disp(); 
}c[15]; 
class StudentGroup 
{ 
    int sem; 
    char group[3]; 
    int strength; 
    public: 
    void setGroup(); 
}stud[8]; 
class Course 
{ 
    char courseID[7]; 
    int semNo; 
    char courseCode[5]; 
    char courseName[50]; 
    char type; 
    int lec; 
    int tut; 
    int prac; 
public: 
    void setCourse(); 
}cour[75]; 
class CourseDetails 
{ 
    public: 
    char courseID[7]; 
    char preference[3]; 
    char resourceType; 
    char classPref[3]; 
}; 
class Faculty 
{ 
    char facID[6]; 
    char name[50]; 
    int noCourses; 
    public: 

    CourseDetails cD[6]; 
     void setFaculty(); 
     void disp(); 
}fac[50]; 
class ElecPair 
{ 
    int noPaired; 
    char courseId[10][7]; 
public: 
    void setElecPair(); 
}ePair[10]; 
class Period 
{ 
    int semNo; 
    char className[3]; 
    char courseID; 
    char facID; 
    bool availability; 
}; 
class TimeTable 
{ 
    Period prd[5][7]; 
}tt[6]; 

Я должен создать график с обычными ограничениями:
Ни один учитель не может быть в 2-х классах одновременно.
Студент не может иметь 2 класса одновременно и так далее.
Мне не нужен код, но я хотел бы получить предложения по наилучшему возможному способу создания этого расписания без использования генетического алгоритма.
PS: Можно ли использовать стек или рекурсию для создания этого расписания?

+0

Просьба разъяснить "наилучший путь": короткий код? Самый быстрый алгоритм? Легче повторного использования? Данные ориентированы? Лучше всего для кэша данных? –

+0

да, вы можете сделать это без использования общего алгоритма ........ – RajSharma

+0

Планирование np-hard. GA, вероятно, подходит для использования. В противном случае будет выполняться обратное отслеживание грубой силы. Попробуйте каждое возможное размещение ученика/преподавателя и т. Д., Пока вы не сможете разместить кого-либо, или пока не найдете решение. – twentylemon

ответ

0

Я написал простой алгоритм в C#, который может решить проблему расписания с 0 конфликтами между учителями, комнатами и лекциями в одно и то же время. Его идея довольно проста: 1- Создайте возможные лекции для каждого учителя (учитель + период времени). 2 - создайте возможные лекции для каждой комнаты (комната + период времени). 3- возьмите случайный период из данного списка teacher_periods и проверьте две вещи. a - этот случайный период существует в комнатных периодах? b - это случайный период, не принятый одним и тем же классом студентов? Если эти два условия верны, тогда вам нужно сделать 3 вещи: 1- выберите комнату с тем же периодом и добавьте ее в решение (в списке решений). 2- удалите этот период времени из списков периодов учителя и периодов времени. в противном случае повторите процесс. общественного класса Программа {

static List<Room> rooms ; 

    private static List<Room> GetListeOfRoomsFomSource() 
    { 
     throw new NotImplementedException(); 
    } 

    public static void Main(string[] args) 
    { 
     var listTeachers = GetListeOfTeachersFomSource(); 
     rooms= GetListeOfRoomsFomSource(); 
     foreach (var techer in listTeachers) 
     { 

      var temp = techer.periods.ToList(); 
      var rnd = new Random(); 
      var rnd2 = new Random(); 
      var period = 0; 

      var exist = false; 
      do 
      { 
       if (temp.Count == 0) break; 
       int index = rnd.Next(0, temp.Count - 1); 
       period = temp[index]; 
       exist = CheckIfLectureExist(period, section,techer); 
       temp.Remove(temp[index]); 

      } while (!exist); 
      if (exist) 
      { 
       AddSolution(techer,period); 
      } 
      else 
      { 
       AddNoSolution(); 
       // list.Remove(tc1); 
      } 

     } 




    } 

    private static void AddSolution(Teacher item, int period) 
    { 
     // get a random room with the this given period; 

     var lisOfrooms = new List<Room>(); 
     foreach (var room in rooms) 
     { 
      if (room.periods.Any(x=>x.Equals(period))) lisOfrooms.Add(room); 
     } 
     var rnd2 = new Random(); 
     var r2 = rnd2.Next(0, lisOfrooms.Count()); 
     var availableRoom = lisOfrooms[r2]; 
     // create solution which is a combination of the techer + availableRoom + period + class. 
     //remove the period from the periods of the given techer; 

     //remove the period from the periods of the given room; 
     //r; 
    } 

    private static void AddNoSolution() 
    { 
     throw new NotImplementedException(); 
    } 

    private static bool CheckIfLectureExist(int period, object classRoom ,Teacher teacher) 
    { 
     // chech if this period has an available (free) room in the list of rooms. 
     // chech if this period + classroom + techer does not exist in the solutions to avoid the conflict between classes. 
     throw new NotImplementedException(); 
    } 

    private static List<Teacher> GetListeOfTeachersFomSource() 
    { 
     throw new NotImplementedException(); 
    } 
} 
public class Teacher{ 
    public Teacher (int periodsWeek) 
    { 
     _periodWeek = periodsWeek; 
     GeneratePerids(); 
    } 
    int _periodWeek; 
    public int[] periods {get;set;} 
    public void GeneratePerids(){ 
     for (int i = 0; i < _periodWeek; i++) 
     { 
      //populate periods; 
     } 
    } 

} 
public class Room 
{ 
    public Room (int periodsWeek) 
    { 
     _periodWeek = periodsWeek; 
     GeneratePerids(); 
    } 
    int _periodWeek; 
     public int[] periods {get;set;} 

     public void GeneratePerids(){ 
     for (int i = 0; i < _periodWeek; i++) 
     { 
      //populate periods; 
     } 
     } 

} 
+0

Хотя это может быть ценным советом для решения проблемы, ответ действительно должен продемонстрировать решение. Пожалуйста, [править], чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы подумайте о том, чтобы вместо этого писать это как комментарий. –

+0

реализация слишком велика. но я могу добавить псевдокод, чтобы объяснить это. –

Смежные вопросы