Вопрос о постановке задачи в виде линейной программы - PullRequest
0 голосов
/ 08 декабря 2018

У меня следующая проблема:

У нас 180 учеников.Каждый студент должен выбрать один из 6 курсов, чтобы получить степень.Ни один курс не должен иметь более 30 студентов.Кроме того, студенты должны указать три курса с различными предпочтениями: pij = [0, 100].
Цель состоит в том, чтобы найти назначение студентов на курсы таким образом, чтобы:

  • Каждый студентназначен на курс.
  • Нет курсов, в которых обучается более 30 студентов.
  • Сумма предпочтений студента максимальна.

Первый вопрос - сформулировать задачу в виде линейной программы (LP).Моя формулировка выглядит следующим образом:

Максимизировать \sum_{i, j} x_{i, j} p_{i, j},

при условии:

  • x_{i, j} \in { 0, 1 }.
  • \sum_{j = 0}^{5} x_{i, j} = 1, \forall i.
  • \sum_{i = 0}^{179} x_{i, j} = 30, \forall j.

Правильна ли моя формулировка?

Вторая часть вопроса следующая:

Предположим, у нас есть черный ящик, который решает проблему Min Cost Flow (https://en.wikipedia.org/wiki/Minimum-cost_flow_problem). Как использовать этот черный ящик для решения нашей задачи назначения?

Спасибо,

С уважением.

1 Ответ

0 голосов
/ 08 декабря 2018

Ваш I nteger Формулировка линейного программирования (ILP) не совсем верна, в своем последнем ограничении вы пишете, что во всех классах ровно 30 учеников, но это неверно,В классе не может быть более 30 учеников.

Таким образом, формулировка должна выглядеть примерно так:

развернуть ij x ij p ij
в зависимости от:
j x ij = 1, ∀i
i x ij ≤30, ∀j

Что касается максимального потока, вы можете представить каждого студентакак узел в сети, а каждый класс как узел, например, для четырех учеников и трех классов, график выглядит так:

example network with four students and three classes

Здесьвместимость с для студентов с i составляет 1 , поскольку каждый студент может сделать не более одного выбора, поэтому с (с, с i ) = 1 .Вместимость классной комнаты - 30, это означает, что для каждого класса c j , он считает, что c (c i , d)= 30 .Кроме того, емкость между s i и c j также равна 1 (хотя большая емкость не будет иметь значения),поэтому c (s i , c j ) = 1 .

Здесь мы добавляем " cost " ккрая между s i и c j , что равно a (s i ,c j ) = - p ij , поэтому, если предпочтение выше, стоимость ниже.Стоимость остальных ребер равна нулю, поэтому a (s, s i ) = a (c j , d) = 0 .Таким образом, здесь мы назначим потоки (на основе емкости по одному на каждого учащегося, так что общий поток в аудиторию составляет менее 30) и минимизируем стоимость, поэтому минимизируем сумму -p ij s.Если поток существует таким образом, что существует поток 1 из источника s каждому студенту s i , тогда мы можем дать каждому студенту выбор, иОбщая стоимость будет оптимизирована.

...