Алгоритм створення шкільного розкладу


95

Мені цікаво, чи є відомі рішення для алгоритму створення шкільного розкладу. В основному, мова йде про оптимізацію "розподілу годин" (як для викладачів, так і для класів) для даних асоціацій клас-предмет-викладач. Ми можемо припустити, що у нас є набори класів, предметів уроків та вчителів, пов’язаних між собою на вході, і що розклад повинен відповідати між 8 ранку та 4 вечора.

Я думаю, що, мабуть, немає точного алгоритму для цього, але, можливо, хтось знає хорошу апроксимацію або підказки для її розробки.


2
Дякую за всі відповіді. Схоже, алгоритм вимагає додаткових досліджень. Я вважав би це гарним предметом для магістерської роботи чи невеликого комерційного застосування. Якщо я напишу його, я повідомлю Вас тут;)
канд

10
Як сказав Ян Рінгроуз із StackOverflow на інше запитання, "у програмному забезпеченні для планування є ще багато PHD".
Reed Debaets 02

Відповіді:


87

Ця проблема заповнена NP !
У двох словах потрібно вивчити всі можливі комбінації, щоб знайти перелік прийнятних рішень. Через різницю обставин, за яких проблема виникає в різних школах (наприклад: Чи існують обмеження щодо класів ?, Чи частково деякі класи поділяються на підгрупи ?, Це щотижневий графік? та ін.) не існує добре відомого класу проблем, який відповідає усім проблемам планування. Можливо, проблема рюкзака має багато елементів подібності з цими проблемами в цілому.

Підтвердженням того, що це одночасно важка проблема і проблема, для якої люди постійно шукають рішення, є перевірка цього (довгого) списку (переважно комерційних) інструментів планування програмного забезпечення

Через велику кількість задіяних змінних, найбільшим джерелом яких, як правило, є бажання викладача; -) ..., як правило, недоцільно розглядати перелік усіх можливих комбінацій . Натомість нам потрібно вибрати підхід, який відвідує підмножину просторів проблем / рішень.
- Генетичні алгоритми , цитовані в іншій відповіді, (або, здається , IMHO ) добре підготовлені для здійснення такого типу напівпровідникового пошуку (Проблема полягає в тому, щоб знайти хорошу функцію оцінки для кандидатів, яку слід зберегти для наступного покоління)
- Графік Підходи до переписування також корисні для цього типу комбінаторних задач оптимізації.

Замість того, щоб зосередитися на конкретних реалізаціях програми автоматичного генератора розкладу, я хотів би запропонувати декілька стратегій, які можна застосувати на рівні визначення проблеми .
Загальне обґрунтування полягає в тому, що в більшості реальних проблем планування планування вимагатимуть певних компромісів, а не всіх обмежень, висловлених та передбачених: будуть повністю задоволені. Тому ми допомагаємо собі шляхом:

  • Визначення та ранжування всіх відомих обмежень
  • Скорочення проблемного простору вручну, забезпечуючи набір додаткових обмежень.
    Це може здатися протиречувальним, але, наприклад, надаючи початковий, частково заповнений графік (скажімо, приблизно 30% часових інтервалів), таким чином, щоб повністю задовольняти всі обмеження, і, вважаючи цей частковий графік незмінним, ми значно зменшуємо час / простір, необхідний для отримання рішень-кандидатів.
    Інший спосіб, за допомогою якого допомагають додаткові обмеження, - це, наприклад, "штучне" додавання обмеження, яке перешкоджає викладанню деяких предметів у деякі дні тижня (якщо це тижневий графік ...); цей тип обмежень призводить до зменшення простору проблем / рішень, без, як правило, виключення значної кількості хороших кандидатів.
  • Забезпечення того, що деякі обмеження проблеми можна швидко обчислити. Це часто пов'язано з вибором моделі даних, яка використовується для представлення проблеми; ідея полягає в тому, щоб мати можливість швидко вибрати (або обрізати) деякі з варіантів.
  • Визначити проблему та дозволити порушити деякі обмеження кілька разів (як правило, до кінцевих вузлів графіка). Ідея тут полягає або у видаленні деяких обмежень для заповнення останніх кількох слотів у розкладі, або в тому, щоб програма автоматичного генератора розкладу не соромилася завершувати весь розклад, замість того щоб надати нам список із дюжини або приблизно таких правдоподібних кандидатів. Людина часто перебуває в кращому положенні, щоб закінчити головоломку, як зазначено, можливо, порушуючи деякі контранти, використовуючи інформацію, яка, як правило, не передається автоматизованій логіці (наприклад, правило "Немає математики в другій половині дня" іноді може бути порушено для класу "просунутого математики та фізики"; або "Краще порушити одне з вимог пана Джонса, ніж одне з пані Сміт ... ;-))

Читаючи цю відповідь, я розумію, що дуже сором’язливо надати певну відповідь, але вона, тим не менше, повна практичних пропозицій. Я сподіваюся, що ця допомога, зрештою, є "важкою проблемою".


1
Чудова, точна та детальна відповідь, дякую за підказки та згадки про NP-повноту (це було і моє здогадування).
канд

3
Чи є у вас якесь посилання, яке пояснює NP-повноту цієї проблеми?
Дон,

49

Це безлад. королівський безлад. Щоб додати відповіді, вже дуже повні, я хочу вказати на свій сімейний досвід. Моя мати була вчителькою і раніше брала участь у процесі.

Виявляється, наявність комп’ютера для цього не тільки важко кодувати як таке, але це також важко, оскільки існують умови, які важко визначити для попередньо запеченої комп’ютерної програми. Приклади:

  • викладач викладає як у вашій школі, так і в іншому інституті. Зрозуміло, що якщо він закінчить урок там о 10.30, він не зможе розпочати роботу у вас о 10.30, оскільки йому потрібен певний час для поїздок між інститутами.
  • двоє вчителів одружені. Загалом, вважається гарною практикою не мати двох одружених вчителів в одному класі. Тому ці два викладачі повинні мати два різні класи
  • двоє вчителів одружені, а їхня дитина навчається в одній школі. Знову ж таки, вам доведеться перешкодити двом вчителям викладати в конкретному класі, де знаходиться їхня дитина.
  • школа має окремі приміщення, як одного дня клас в одному інституті, а інший день в іншому.
  • школа має спільні лабораторії, але ці лабораторії доступні лише у певні будні (з міркувань безпеки, наприклад, де потрібен додатковий персонал).
  • деякі викладачі мають переваги щодо вільного дня: хтось віддає перевагу в понеділок, хтось у п’ятницю, хтось у середу. Хтось воліє приходити рано вранці, хтось воліє приходити пізніше.
  • у вас не повинно виникати ситуацій, коли ви маєте урок, скажімо, історію на першій годині, потім три години математики, потім ще годину історії. Це не має сенсу ні для учнів, ні для вчителя.
  • ви повинні розподілити аргументи рівномірно. Немає сенсу мати перші дні тижня лише математикою, а потім решту тижня лише літературою.
  • ви повинні дати деяким викладачам дві години поспіль на тести для оцінювання.

Як бачите, проблема не NP-повна, вона NP-божевільна.

Отже, що вони роблять, це те, що у них є великий стіл з маленькими пластиковими вставками, і вони переміщують вставки, поки не буде отриманий задовільний результат. Вони ніколи не починають з нуля: вони зазвичай починають з розкладу попереднього року та вносять корективи.


12
"NP-insane" - чудове ім'я;) Я згоден, що це справді складна проблема, дякую за коментарі щодо "реального" лікування цієї проблеми. Мій батько і моя дівчина теж викладачі, і я знаю, що в більшості шкіл є столи з пластиковими вставками - це наводить мене на думку про можливий алгоритм цієї проблеми - адже, якщо чоловік зможе її вирішити, можливо, можна буде написати це як алгоритм.
канд

10
те, що ви хочете написати, - це експертна система: система, складена з купи евристичних правил. Окрім експертних систем, це поле, де генетичні алгоритми є одними з найкращих ставок. Складність полягає не у вирішенні проблеми, і не тільки. Складність полягає також у формулюванні проблеми та її обмежень.
Стефано Боріні 02

1
Ви маєте рацію, проблема вимагає забезпечення складного набору умов та обмежень, які, напевно, мають рейтинг "прийнятного" рішення. Я погоджуюсь з генетичними алгоритмами, вони повинні добре відповідати цій проблемі, також я думаю, що буде краще починати розробку з простих наборів умов і вдосконалювати її, оскільки буде отримано правильну відповідь на них.
канд

1
Ви також можете безпосередньо перекласти ці обмеження та цілі на MAXSAT. Алгоритми MAXSAT, як правило, надійніші, ніж генетичні алгоритми, але у вас може виникнути вибух із-за таких цілей, як математичні класи, які слід розподілити протягом тижня.
Жуль

26

Міжнародний конкурс 2007 розкладів було планування уроку доріжки і іспит планування доріжки. Багато дослідників брали участь у цьому конкурсі. Було випробувано багато евристики та метаевристики, але врешті-решт локальна метаевристика пошуку (наприклад, пошук за Табу та модельоване відпалювання) чітко обіграла інші алгоритми (наприклад, генетичні алгоритми).

Погляньте на 2 фреймворки з відкритим кодом, які використовували деякі фіналісти:

  • JBoss OptaPlanner (Java, відкритий код)
  • Unitime (Java, відкритий код) - більше для університетів

17

Одним із моїх напівтермінових завдань було створення шкільного столу з генетичним алгоритмом.

Ціла таблиця - це один "організм". У підході загальних генетичних алгоритмів відбулися деякі зміни та застереження:

  • Були вироблені правила щодо "незаконних столів": два класи в одному класі, один вчитель викладає дві групи одночасно і т. Д. Ці мутації негайно визнали летальними, а замість "померлого" негайно виник новий "організм". Початковий був створений низкою випадкових спроб отримати законну (якщо вона безглузда). Смертельна мутація не враховувалася до кількості мутацій в ітерації.

  • Мутаційні "мутаційні" мутації були набагато частіше, ніж мутаційні. Зміни відбувалися лише між частинами гена, які мали сенс - відсутність заміни вчителя класом.

  • Невеликі бонуси були призначені за об’єднання певних 2 годин разом, за призначення послідовно однакових загальних класів для тієї самої групи, за збереження робочого часу вчителя та навантаження класу безперервно. Помірні бонуси призначалися за правильне проведення навчальних занять з даного предмету, збереження навчальних годин у межах облігацій (вранці чи вдень) тощо. Великі бонуси були присвоєння правильної кількості заданого предмету, заданого навантаження для вчителя тощо.

  • Вчителі можуть створювати свої графіки навантаження "хочу працювати тоді", "нормально працювати тоді", "не люблю працювати тоді", "не можу працювати тоді", із встановленими належними вагами. Цілі 24 години були законним робочим часом, крім нічного часу було дуже небажано.

  • Функція ваги ... о так. Функція ваги була величезним, жахливим продуктом (як при множенні) ваг, присвоєних вибраним ознакам та властивостям. Це було надзвичайно круто, одна властивість легко міняла його на порядок вгору чи вниз - і в одному організмі було сотні чи тисячі властивостей. Це призвело до ВЕЛИЧЕЗНИХ чисел як вагових коефіцієнтів, і як прямий результат для використання обчислень потрібно використовувати бібліотеку bignum (gmp). Для невеликого тестового прикладу з приблизно 10 груп, 10 викладачів та 10 навчальних кабінетів початковий набір починався з примітки 10 ^ -200someething і закінчувався 10 ^ + 300something. Це було абсолютно неефективно, коли було більш плоским. Крім того, значення зростали набагато ширше, ніж більші "школи".

  • Якщо врахувати час обчислень, між невеликою популяцією (100) протягом тривалого часу та великою популяцією (10 тис .+) протягом менших поколінь було мало різниці Обчислення за той же час давали приблизно однакову якість.

  • Розрахунок (на деяких процесорах з частотою 1 ГГц) зайняв би близько 1 години для стабілізації близько 10 ^ + 300, створюючи графіки, які виглядали цілком приємно, для згаданого тесту 10x10x10.

  • Проблему легко паралелізувати, забезпечивши мережевий пристрій, який міняв би найкращі зразки між комп'ютерами, на яких запущено обчислення.

Отримана програма ніколи не бачила денного світла, щоб отримати хорошу оцінку за семестр. Це показало певні обіцянки, але я ніколи не мав достатньої мотивації додати будь-який графічний інтерфейс та зробити його придатним для широкої громадськості.


5
Тож відкрийте його та рекламуйте, і спробуйте залучити до нього деяких науковців? Повторно використовувати його для подальших проектів? Технічно така програма, як лише для 300 співробітників, коштувала б школам грошей, щоб скласти оптимальні графіки, і вони не проти витратити кілька днів, щоб генетично розрахувати оптимальні графіки. Подумайте про пакетну обробку. Привіт, апаратні та програмні контракти;)
jcolebrand

1
Звучить чудово! Цікаво, чи можна було виконати функцію ваги з поплавками в діапазоні 0..1.
Крейг МакКвін

1
@Craig: Щось таке рівне призведе до популяції, яка з часом стагнувала або навіть вироджувалась за якістю, оскільки випадкові мутації сприяли більшим негативним змінам, ніж розведення / відбір могли компенсувати. Тільки надзвичайно крута функція якості дасть стійке зростання. Звичайно, функцію можна було нормалізувати, але все ж ген "набагато кращого" повинен мати на порядок вищі шанси вижити.
SF.

9

Ця проблема є більш жорсткою, ніж здається.

Як вже натякали інші, це проблема, яка повна NP, але давайте проаналізуємо, що це означає.

В основному це означає, що ви повинні розглянути всі можливі комбінації.

Але "подивіться на" не говорить вам багато, що вам потрібно робити.

Створити всі можливі комбінації легко. Це може призвести до величезного обсягу даних, але у вас не повинно виникнути великих проблем із розумінням концепцій цієї частини проблеми.

Друга проблема полягає в тому, щоб судити, чи є дана можлива комбінація хорошою, поганою чи кращою за попереднє "хороше" рішення.

Для цього вам потрібно не просто "чи можливе рішення".

Наприклад, чи той самий учитель працює 5 днів на тиждень протягом X тижнів поспіль? Навіть якщо це робоче рішення, це може бути не кращим рішенням, ніж чергування двох людей, щоб кожен вчитель виконував по одному тижні. О, ти не думав про це? Пам’ятайте, це люди, з якими ви стикаєтесь, а не просто проблема розподілу ресурсів.

Навіть якби один учитель міг працювати повний робочий день протягом 16 тижнів поспіль, це може бути неоптимальним рішенням порівняно з рішенням, коли ви намагаєтесь чергувати вчителів, і такий баланс дуже важко вбудувати в програмне забезпечення.

Підводячи підсумок, вироблення хорошого рішення цієї проблеми буде коштувати багато, багатьом людям. Отже, нелегку проблему можна розбити та вирішити. Будьте готові визначити деякі цілі, які не є 100%, і називаючи їх "достатньо хорошими".


1
Ну, я б стверджував, що досить важко знати всі обмеження на самому початку, для цього потрібен досвід і розслідування справи. Я волів би розділити проблему на дві окремі частини та розробити їх одночасно. Першим буде загальна структура алгоритму - сказати, як він повинен заповнювати "наступне покоління розкладу", а не проект механізму, без занадто багато "предметної логіки" позаду (ймовірно, генетичний алгоритм). Другий - постачальник правил із набором обмежень, які перевіряють "правильність" розкладу - спочатку він може бути простим, а пізніше вдосконаленим.
cand

8

Мій алгоритм розкладу, реалізований у FET (Безкоштовне програмне забезпечення розкладу, http://lalescu.ro/liviu/fet/ , успішний додаток):

Алгоритм евристичний. Я назвав це "рекурсивний обмін".

Вхідні дані: набір дій A_1 ... A_n та обмеження.

Вихідні дані: набір разів TA_1 ... TA_n (часовий інтервал кожної діяльності. Для простоти тут виключені кімнати). Алгоритм повинен розміщувати кожну діяльність у часовий інтервал, дотримуючись обмежень. Кожен TA_i знаходиться між 0 (T_1) та max_time_slots-1 (T_m).

Обмеження:

C1) Основні: перелік пар дій, які не можуть бути одночасними (наприклад, A_1 та A_2, оскільки вони мають одного вчителя або однакових учнів);

C2) Багато інших обмежень (тут виключаються для простоти).

Алгоритм розкладу (який я назвав "рекурсивний обмін"):

  1. Сортуйте заходи, спочатку найскладніші. Не критичний крок, але пришвидшує алгоритм, можливо, в 10 разів і більше.
  2. Спробуйте помістити кожну діяльність (A_i) у дозволений часовий інтервал, дотримуючись наведеного вище порядку, по одному. Шукайте доступний слот (T_j) для A_i, в якому ця діяльність може бути розміщена відповідно до обмежень. Якщо доступно більше слотів, виберіть випадковий. Якщо жоден недоступний, виконайте рекурсивний обмін:

    a . Для кожного часового інтервалу T_j розгляньте, що трапиться, якщо ви помістите A_i у T_j. Буде список інших видів діяльності, які не погоджуються з цим кроком (наприклад, діяльність A_k знаходиться в тому самому слоті T_j і має того самого викладача або тих самих учнів, що A_i). Зберігайте список суперечливих дій для кожного часового інтервалу T_j.

    b . Виберіть слот (T_j) з найменшою кількістю конфліктуючих дій. Скажімо, список дій у цьому слоті містить 3 дії: A_p, A_q, A_r.

    c . Помістіть A_i в T_j і зробіть A_p, A_q, A_r нерозподіленими.

    d . Рекурсивно спробуйте розмістити A_p, A_q, A_r (якщо рівень рекурсії не надто великий, скажімо 14, і якщо загальна кількість рекурсивних викликів, підрахованих з кроку 2), на A_i не є занадто великою, скажімо 2 * n), як на кроці 2).

    e . Якщо успішно розміщено A_p, A_q, A_r, поверніться з успіхом, інакше спробуйте інші часові інтервали (перейдіть до кроку 2 b) і виберіть наступний найкращий часовий інтервал).

    f . Якщо всі (або розумну кількість) часових інтервалів були спробувані безуспішно, поверніться безуспішно.

    g . Якщо ми знаходимось на рівні 0, і ми не мали успіху в розміщенні A_i, розмістіть його, як у кроках 2 b) та 2 c), але без рекурсії. Зараз у нас є 3 - 1 = 2 додаткові заходи для проведення. Перейдіть до кроку 2) (тут використовуються деякі методи уникнення їзди на велосипеді).


1
FET був для мене дуже корисним. Дякую @Liviu Lalescu!
Ноель Леварес

6

ОНОВЛЕННЯ: з коментарів ... теж повинен мати евристику!

Я хотів би піти з Prolog ... потім скористатися Ruby або Perl або чимось іншим, щоб очистити своє рішення в красивішу форму.

teaches(Jill,math).
teaches(Joe,history).

involves(MA101,math).
involves(SS104,history).

myHeuristic(D,A,B) :- [test_case]->D='<';D='>'.
createSchedule :- findall(Class,involves(Class,Subject),Classes),
                  predsort(myHeuristic,Classes,ClassesNew),
                  createSchedule(ClassesNew,[]).
createSchedule(Classes,Scheduled) :- [the actual recursive algorithm].

Я (все ще) переживаю щось подібне до цієї проблеми, але використовую той самий шлях, про який я щойно згадав. Пролог (як функціональна мова) справді полегшує вирішення проблем, що стосуються NP-Hard.


1
Пролог, безумовно, є чудовою мовою для висловлення необхідних проблем, однак, як ви зазначаєте: проблема ВИП-повна, якщо не NP-Жорстка. Це означає, що Prolog може бути недостатньо швидким для практичної реалізації.
Poindexter

3
якщо це має якесь відношення до NP, і ми не будемо задоволені наближенням, будь-який детермінований алгоритм буде експоненційно смоктати :)
Габріель Шчербак

1
Тоді метою є впровадження ефективної евристики ... наприклад, для виконання простого алгоритму планування 9 завдань потрібно 3.078 с, але при найменшій евристиці WindowFirst ця сама проблема займає лише: 0,123 с
Дебати Ріда

2
HAHA, пролог (окремо) НІКОЛИ НІКОЛИ ЦЕ НЕ РОЗВ'ЯЗАЄ. Вибачте за великі літери, але у мене була така сама ідея 10 або 15 років тому, і я повністю зазнав невдачі. Не те щоб це було повільно, ні. Це просто не могло вирішити жодного справжнього світу;)!
Каруссел


5

Ось кілька посилань, які я знайшов:

Шкільний розклад - перераховує деякі пов'язані проблеми

Гібридний генетичний алгоритм шкільного розкладу

Планування службових програм та інструментів


1
Планування посилання на утиліти та інструменти мертве
Баран

@Baran Використовуйте зворотну машину, і ви знайдете список
srijanshukla

3

У цій роботі досить добре описується проблема шкільного розкладу та їх підхід до алгоритму: " Розробка SYLLABUS - інтерактивний планувальник на основі обмежень для шкіл та коледжів ". [PDF]

Автор повідомляє мені, що програмне забезпечення SYLLABUS все ще використовується / розробляється тут: http://www.scientia.com/uk/


3

Я працюю над широко використовуваним механізмом планування, який робить саме це. Так, це NP-Complete; найкращі підходи спрямовані на наближення оптимального рішення. І, звичайно, існує безліч різних способів сказати, який із них є «найкращим» рішенням - чи важливіше, щоб ваші вчителі були задоволені своїм розкладом, або щоб учні, наприклад, брали участь у всіх своїх класах?

Абсолютно найважливішим питанням, яке вам потрібно вирішити на початку, є те, що робить один із способів планування цієї системи кращим за інший ? Тобто, якщо у мене є графік, коли місіс Джонс викладає математику в 8 років, а містер Сміт викладає математику в 9 років, це краще чи гірше, ніж та, коли вони обоє викладають математику в 10 років? Це краще чи гірше, ніж такий, коли місіс Джонс викладає у 8, а містер Джонс викладає у 2? Чому?

Головна порада, яку я дав би тут, - якомога більше розподілити проблему - можливо, курс за курсом, можливо, вчитель за викладачем, може, кімната за кімнатою - і спочатку попрацювати над вирішенням підзадачі. Там у вас повинно вийти з декількох рішень на вибір, і вам потрібно вибрати одне, як найбільш вірогідне оптимальне. Потім, робота над створенням «попередніх» підпроблем враховує потреби пізніших підпроблем при оцінці їх потенційних рішень. Тоді, можливо, попрацюйте над тим, як вийти з ситуації, що зафарбована в кут (припускаючи, що ви не можете передбачити такі ситуації в попередніх підзадачах), коли потрапляєте в стан "немає дійсних рішень".

Прохід на оптимізацію локального пошуку часто використовується, щоб "відшліфувати" кінцеву відповідь для кращих результатів.

Зверніть увагу, що зазвичай ми маємо справу з дуже обмеженими ресурсами системами планування шкіл. Школи не переживають рік з великою кількістю порожніх кімнат або вчителів, які сидять у вітальні 75% дня. Підходи, які найкраще працюють у середовищах, багатих на рішення, не обов’язково застосовуються в навчальних програмах.


2

Я розробив комерційні алгоритми як для розкладу занять, так і для розкладу іспитів. Для першого я використав цілочисельне програмування; для другої - евристика, заснована на максимізації цільової функції шляхом вибору свопів слотів, дуже схожих на оригінальний ручний процес, який був розроблений. Їх головне у прийнятті таких рішень - це здатність відображати всі реальні обмеження; і щоб графіки людей не могли бачити шляхи вдосконалення рішення. Врешті-решт, алгоритмічна частина була досить простою та простою у впровадженні порівняно з підготовкою баз даних, користувальницьким інтерфейсом, можливістю звітувати про статистику, як використання приміщення, освіта користувачів тощо.


1

Як правило, обмежене програмування є хорошим підходом до цього типу планування. Пошук "програмування обмежень" та планування або "планування на основі обмежень" як у переповненні стека, так і в Google створить кілька хороших посилань. Це не неможливо - просто трохи важко подумати, використовуючи традиційні методи оптимізації, такі як лінійна або цілочисельна оптимізація. Один результат буде - чи існує графік, який задовольняє всім вимогам? Це саме по собі, очевидно, корисно.

Удачі !


1

Ви можете взяти це за допомогою генетичних алгоритмів, так. Але не слід :). Це може бути занадто повільним, а налаштування параметрів може зайняти занадто багато часу тощо.

Є успішні й інші підходи. Всі реалізовані в проектах з відкритим кодом:

  • Підхід на основі обмежень
    • Реалізовано в UniTime (не дуже для шкіл)
    • Ви також можете піти далі і скористатися програмуванням Integer. Успішно зроблено о університеті Удіне, а також в університеті Байройт (я там брав участь) за допомогою комерційного програмного забезпечення (ILOG CPLEX)
    • Підхід, заснований на правилах, з евристикою - див. Планувальник Drools
  • Різна евристика - FET і моя власна

Дивіться тут список розкладу програмного забезпечення


0

Я думаю, вам слід використовувати генетичний алгоритм, оскільки:

  • Він найкраще підходить для великих проблемних випадків.
  • Це дає зменшену складність у часі за ціну неточної відповіді (не остаточний найкращий)
  • Ви можете легко вказати обмеження та уподобання, відкоригувавши покарання за придатність до тих, що не виконуються.
  • Ви можете вказати обмеження часу для виконання програми.
  • Якість рішення залежить від того, скільки часу ви збираєтеся витратити на вирішення програми.

    Визначення генетичних алгоритмів

    Підручник з генетичних алгоритмів

    Проект планування занять з GA

Також подивіться: подібне запитання та ще одне


0

Я не знаю, що хтось погодиться з цим кодом, але я розробив цей код за допомогою власного алгоритму і працює для мене в ruby. Сподіваюся, це допоможе тим, хто шукає його в наступному коді, periodflag, dayflag subjectflag та teacherflag - це хеш із відповідним ідентифікатором та значенням прапора, яке є логічним. Будь-яка проблема, зв'яжіться зі мною ....... (-_-)

periodflag.each do | k2, v2 |

            if(TimetableDefinition.find(k2).period.to_i != 0)
                subjectflag.each do |k3,v3|
                    if (v3 == 0)
                        if(getflag_period(periodflag,k2))
                            @teachers=EmployeesSubject.where(subject_name: @subjects.find(k3).name, division_id: division.id).pluck(:employee_id)
                            @teacherlists=Employee.find(@teachers)
                            teacherflag=Hash[teacher_flag(@teacherlists,teacherflag,flag).to_a.shuffle] 
                            teacherflag.each do |k4,v4|
                                if(v4 == 0)
                                    if(getflag_subject(subjectflag,k3))
                                        subjectperiod=TimetableAssign.where("timetable_definition_id = ? AND subject_id = ?",k2,k3)
                                        if subjectperiod.blank?
                                            issubjectpresent=TimetableAssign.where("section_id = ? AND subject_id = ?",section.id,k3)
                                            if issubjectpresent.blank?
                                                isteacherpresent=TimetableAssign.where("section_id = ? AND employee_id = ?",section.id,k4)
                                                if isteacherpresent.blank?
                                                    @finaltt=TimetableAssign.new
                                                    @finaltt.timetable_struct_id=@timetable_struct.id
                                                    @finaltt.employee_id=k4
                                                    @finaltt.section_id=section.id
                                                    @finaltt.standard_id=standard.id
                                                    @finaltt.division_id=division.id
                                                    @finaltt.subject_id=k3
                                                    @finaltt.timetable_definition_id=k2
                                                    @finaltt.timetable_day_id=k1
                                                    set_school_id(@finaltt,current_user)
                                                    if(@finaltt.save)

                                                        setflag_sub(subjectflag,k3,1)
                                                        setflag_period(periodflag,k2,1)
                                                        setflag_teacher(teacherflag,k4,1)
                                                    end
                                                end
                                            else
                                                @subjectdetail=TimetableAssign.find_by_section_id_and_subject_id(@section.id,k3)
                                                @finaltt=TimetableAssign.new
                                                @finaltt.timetable_struct_id=@subjectdetail.timetable_struct_id
                                                @finaltt.employee_id=@subjectdetail.employee_id
                                                @finaltt.section_id=section.id
                                                @finaltt.standard_id=standard.id
                                                @finaltt.division_id=division.id
                                                @finaltt.subject_id=@subjectdetail.subject_id
                                                @finaltt.timetable_definition_id=k2
                                                @finaltt.timetable_day_id=k1
                                                set_school_id(@finaltt,current_user)
                                                if(@finaltt.save)

                                                    setflag_sub(subjectflag,k3,1)
                                                    setflag_period(periodflag,k2,1)
                                                    setflag_teacher(teacherflag,k4,1)
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.