как решить эту проблему комбинаторного алгоритма - PullRequest
7 голосов
/ 04 мая 2010

У меня есть N человек, каждый из которых должен сдать T экзамены. Каждый экзамен занимает «некоторое» время, например 30 мин (нет такой вещи, как рано заканчивать). Экзамены должны проводиться перед экзаменатором.

Мне нужно назначить каждому человеку сдавать каждый экзамен перед экзаменатором в течение общего периода времени, но избегая перерывов на обед, используя минимальное количество экзаменаторов в течение минимального времени (то есть нет / минимум экзаменаторов не работает)

Существуют следующие ограничения:

  • Никто не может быть в 2 местах одновременно
  • каждый человек должен сдавать каждый экзамен один раз
  • никто не должен проходить экспертизу дважды

Я понимаю, что оптимальным решением, вероятно, является NP-Complete, и что мне, вероятно, лучше всего использовать генетический алгоритм для получения наилучшей оценки (похожей на эту? Рекомендации по программному обеспечению плана рассадки (действительно ли такой зверь даже существуют?) ).

Меня устраивает, как работают генетические алгоритмы, с чем я борюсь, так это как программно моделировать проблему так, чтобы я МОЖЕТ манипулировать параметрами генетически ..

Если бы каждый экзамен занимал одинаковое количество времени, то я бы разделил период времени на эти длины и просто создал бы матрицу временных интервалов против экзаменаторов и отбросил кандидатов. Однако, поскольку время каждого теста не обязательно то же самое, я немного растерялся, как подойти к этому.

В настоящее время я делаю это:

  • составьте список всех «тестов», которые должны быть проведены, между каждым кандидатом и экзаменом
  • начните с столько экзаменаторов, сколько существует тестов
  • неоднократно повторять все экзамены для каждого: найти внеплановый тест, который подходит для экзаменатора (на основе ограничений)
  • продолжаться до тех пор, пока все тесты, которые можно запланировать, не станут
  • если есть какие-либо внеплановые тесты, увеличьте количество экзаменаторов и начните снова.

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

Ответы [ 5 ]

1 голос
/ 04 июня 2010

Я бы порекомендовал использовать для этого SAT-решатель. Хотя проблема, вероятно, сложная для NP, хорошие SAT-решатели часто могут обрабатывать сотни тысяч переменных. Посмотрите Chaff или MiniSat для двух примеров.

1 голос
/ 03 июня 2010

Как предложил julienaubert , решение (которое я назову график ) представляет собой последовательность кортежей (дата, студент, экзаменатор, тест), которая охватывает все соответствующие комбинации тестов учащихся. (все ли N студенты сдают все Т-тесты?). Я понимаю, что один экзаменатор может тестировать несколько студентов одновременно. В противном случае потребуется огромное количество экзаменаторов (по крайней мере, по одному на каждого учащегося), в чем я действительно сомневаюсь.

Два кортежа A и B конфликтуют, если

  • студент такой же, тест другой, период времени перекрывается
  • экзаменатор такой же, тест другой, период времени перекрывается
  • студент уже работал с экзаменатором на другом тесте

Обратите внимание, что конфликты tuple отличаются от конфликтов schedule (которые должны дополнительно проверять наличие повторной проблемы с экзаменатором).

Нижние границы:

  • число E экзаменаторов должно быть> = общее количество тестов наиболее перегруженных студентов
  • общее время должно быть больше, чем общая продолжительность тестов наиболее переутомленного студента.

Простой, жадный график может быть построен следующим способом:

  1. Возьми самого переутомленного студента и назначение тестов в случайном порядке, каждый с другим экзаменатором. Немного упаковка для мусора может быть использована для повторного заказа тесты, так что обеденный час хранится бесплатно Это будет счастливым студент: он закончит в минимально возможное время.
  2. Для каждого другого учащегося, если он должен сдать любой запланированный тест, поделитесь временем, местом и экзаменатором с ранее запланированным тестом.
  3. Возьмите самого переутомленного студента (как в: наибольшее количество внеплановых тестов) и назначьте кортежи, чтобы не нарушать никаких ограничений, добавив больше времени и экзаменаторов, если это необходимо
  4. Если у кого-либо из студентов есть внеплановые тесты, перейдите к пункту 2.

Улучшение выбора, сделанного на шаге 2 выше, имеет решающее значение для улучшения; этот выбор может стать основой для эвристического поиска. Приведенный выше алгоритм пытается свести к минимуму необходимое количество экзаменаторов за счет времени студента (студенты могут закончить один экзамен в начале и другой последний день в день, ничего между ними). Тем не менее, он гарантированно даст юридические решения. Запуск его с разными учащимися может использоваться для генерации «стартовых» решений ГА, которые придерживаются юридических ответов.

В целом, я считаю, что нет «идеального ответа» на проблему, подобную этой, потому что существует так много факторов, которые необходимо учитывать: студенты хотели бы минимизировать общее время, затрачиваемое на изучение себя, как и экзаменаторы ; мы хотели бы свести к минимуму количество экзаменаторов, но существуют также практические ограничения на количество учеников, которых мы можем разместить в комнате с одним экзаменатором. Кроме того, мы хотели бы сделать планирование "справедливым", чтобы никто явно не становился намного хуже, чем другие. Таким образом, лучшее, на что вы можете надеяться, - это позволить этим регуляторам поиграть, узнать результаты (общее время, счастье для каждого студента, счастье для экзаменатора, размеры экзамена, воспринимаемая справедливость) и позволить пользователю изучить пространство параметров и сделать осознанный выбор.

0 голосов
/ 04 июня 2010

Вы могли бы также рассмотреть программирование ограничений. Проверьте Пролог или, для более современного выражения логического программирования, PyKE

0 голосов
/ 03 июня 2010

Вот пример того, как вы могли бы смоделировать его с помощью GA.

Используя вашу запись:

  • N (номер экзаменуемого)
  • T (номер экзамена)

Пусть ген человека выражает полный график бронирований. то есть индивидуум представляет собой список конкретных заказов: (i, j, t, d)

  • я экзаменатор [1, N]
  • j - j-й экзаменатор [1,?]
  • t - это тест, который должен сдать экзаменующийся [1, T]
  • d - начало экзамена (дата + время)

Оцените, используя фитнес-функцию, которая имеет свойство:

  • оштрафовать (строго) за всех экзаменаторов с двойной регистрацией
  • штраф за простоя экзаменаторов
  • штраф за экзаменующихся, которые не были распределены в течение их периода времени
  • вознаграждение за каждый сданный экзамен за период

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

, чтобы сделать это хорошо, рассмотрим:

  • initiation - используйте столько информации, сколько вам нужно, чтобы делать «нормальные» заказы, если это вычислительно дешево.
  • определить правильные операторы GA

Инициирование в здравом смысле:

  • случайный выбор d в течение периода времени
  • случайно переставить (1,2, .., N), а затем выбрать i из этого (избегает дубликатов), то же самое для j и t

правильные операторы GA:

скажем, у вас есть заказ a и b : (A_i, a_j, a_t, A_D) (B_i, b_j, b_t, b_d)

вы можете поменять местами a_i и b_i и поменять местами a_j, b_j, a_d и b_d, но, скорее всего, нет смысла менять местами a_t и b_t.

Вы также можете использовать циклирование, что лучше всего иллюстрировать на примере, если N * T = 4, полное резервирование составляет 4 кортежа, и тогда вы будете циклически перемещаться по i или j или d, например циклически по i:

a_i = b_i
b_i = c_i
c_i = d_i
d_i = a_i
0 голосов
/ 01 июня 2010

Не ограничивайте себя генетическими алгоритмами преждевременно, есть много других подходов .

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

...