Я должен составить расписание для 6 классов в университете. Ниже приведены классы, которые я придумал.
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: Есть ли способ, которым я могу использовать стек или рекурсию для создания этого расписания?
Я написал простой алгоритм на C #, который может решить проблему расписания с 0 конфликтами между учителями, комнатами и лекциями в одно и то же время.
Его идея довольно проста:
1- Создайте возможные лекции для каждого учителя (учитель + период времени).
2 — генерировать возможные лекции для каждой комнаты (комната + период времени).
3- возьмите случайный период из заданного списка teacher_periods и проверьте две вещи.
а — существует ли этот случайный период в комнатных периодах ??
б — этот случайный период не взят одним и тем же классом студентов?
если эти два условия выполняются, то вам нужно сделать 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;
}
}
}