Как реализовать алгоритм распределения мест для юниоров

у нас есть около 1000 свободных мест для наших лекций в нашем унисе, и потребовалось около 2000 мест (возможно, 500 студентов требовали по 4 места).
Я разрабатываю webapp с CakePHP, который позволяет учащимся составлять список желаний и вводить 4 лекции на блок с приоритетами от 1 до 4. (Затем это входит в базу данных MySQL)

Теперь выполняется веб-интерфейс, выполняются действия администратора (добавлять лекции, добавлять лекторов и т. Д.). Осталось только написать алгоритм распределения.

Как мне лучше всего это сделать? MySQL-скрипт кажется полезным, но mysql не очень дружелюбен, когда дело доходит до циклов и if-конструкций, не так ли?
Было бы разумно экспортировать данные где-нибудь и позволить другому языку справиться с этой проблемой?

Изменить: dnagirl запросил дополнительную информацию об алгоритме: у нас нет бизнес-правил для алгоритма. Мы адаптировали существующее (очень дорогое) приложение от кого-то другого в другом университете, у которого есть правила, которые мы только что адаптировали.
То, что он делает (и то, что я пытаюсь клонировать, чтобы сохранить большую плату за семестр), заключается в следующем:

  • События (лекции, упражнения и т. Д.) Все относятся к блоку (блок, например, международная политика, которая может содержать 4 или 5 различных событий)
  • Студенты могут подать заявку на до 4 событий на блок с приоритетами от 1 до 4.
  • Алгоритм работает на каждый блок. Для каждого блока разделите учащихся на разные группы в соответствии с их ранжированием. (Рейтинг – «чем выше, тем лучше». Нормальный рейтинг от 0 до 20)
  • Из группы студентов с самым высоким рейтингом, произвольно выбирайте один. Дайте ему место в случае, если он выбрал приоритет 1. Если это мероприятие заполнено, дайте ему место, которое он выбрал с приоритетом 2; и т. д., до 4.
  • Выберите следующего ученика и сделайте то же самое, пока у каждого ученика с этим ранжированием не будет места. Затем переходите к следующему нижнему рангу и делайте все снова. Когда этот блок будет закончен, сделайте все снова со следующим блоком, пока не будут выполнены все блоки.

Я знаю, что этот алгоритм – не лучшее решение, но я думал, что сейчас буду клонировать его, а может быть, после этого буду работать над улучшением логики / возможностей.

Solutions Collecting From Web of "Как реализовать алгоритм распределения мест для юниоров"

Вероятно, вам нужен какой-то генетический алгоритм:

  • Создать случайное распределение студентов по лекциям
  • Рассчитать баллы (выполненные пожелания высокие, забронированные лекции производят штраф и т.д.)
  • Внесите изменения (например, переместите одного ученика на другую лекцию). Если счет увеличивается, сохраните его, в противном случае отклоните.
  • Продолжайте повторять, пока не будет найдено никаких изменений, которые увеличивают оценку: вы нашли местный минимум
  • Повторите все это несколько раз, чтобы найти другие локальные минимумы. Затем перейдите к лучшему решению.

Вам нужно будет выполнить несколько тестов и настроить весы, чтобы понять это правильно.

MySQL на самом деле не очень подходит для этого; вам лучше решить это на PHP, а затем упорствовать в один ход. Если производительность недостаточно, вы можете даже рассмотреть возможность ее реализации на C ++, но я предлагаю вам сначала попробовать PHP и посмотреть, достаточно ли это. Это не похоже на то, что вы будете запускать это каждые 2 секунды.