Если условие в целевой функции Cplex - PullRequest
0 голосов
/ 27 апреля 2018

Я новичок в Cplex. Я решаю задачу целочисленного программирования, но у меня проблема с целевой функцией. Проблема в том, что у меня есть какой-то проект, у которого есть срок оплаты D, и если проект запаздывает, то у меня есть штраф за опоздание b, поэтому он выглядит как b * (cn-D). Где cn - реальное время завершения проекта, и это переменная решения.

Это должно выглядеть так if (cn-D)>=0 then b*(cn-D)==0

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

1 Ответ

0 голосов
/ 29 апреля 2018

Стандартный способ моделирования это:

min sum(i, penalty(i)*Tardy(i))
Tardy(i) >= CompletionTime(i) - DueDate(i)
Tardy(i) >= 0

Tardy является неотрицательной переменной и никогда не может стать отрицательной. Другие количества:

  • penalty: константа, указывающая стоимость, связанную с заданием i, опоздавшим на одну единицу времени.
  • CompletionTime: переменная, которая содержит время завершения задания i
  • DueDate: константа с датой выполнения задания i.

Вышеуказанная сумма измеряется. Иногда мы также хотим измерить количество: количество запоздалых заданий. Это сделано для предотвращения запоздалости многих рабочих мест. В самом общем случае можно иметь как сумму, так и количество в цели с разными весами или штрафами.

Существует практически неограниченное количество статей, показывающих составы MIP по моделям планирования, которые включают опоздания. Вместо того, чтобы изобретать велосипед, может быть полезно проконсультироваться с некоторыми из них и посмотреть, что другие сделали, чтобы сформулировать это.

...