У меня есть следующие OF
, чтобы минимизировать затраты на цепочку поставок:
mdl.minimize(mdl.sum((cs+ch+cf+cv*d[j])*q[j] for j in arcs) + mdl.sum(α*(eh+et*d[j])*q[j] for j in arcs) + mdl.sum(β*(gh+gt*d[j])*q[j] for j in arcs) + mdl.sum(X[f]*cjf for f in comb))
Где cs, ch, cf, cv, eh, et, gh, gt, cjf, α and β
- это ряд постоянных параметров.
d[j]
- это расстояние между исходной i
и конечной j
, которые объединены в список arcs
или кортежей.
q[j]
- это переменная потока между исходной i
и конечной j
in arcs
.
X[f]
- это двоичная переменная для открытия объекта в пункте назначения j
с емкостью f
, возможные комбинации j
и f
перечислены в comb
.
Первый constraint 1
гарантирует, что поток q[i,j]
из источника i
не превышает его максимальную доступность материала dQ
в i
. D[(i, j)]
- это двоичный параметр, равный 1
, если расстояние между исходной i
и конечной точкой j
меньше или равно пороговому значению, иначе значение D[(i, j)]
равно 0
. (Этот параметр помогает нам ограничить расстояние транспортировки.)
for i in I: mdl.add_constraint(mdl.sum(q[(i, j)]*D[(i, j)] for j in J) <= Qi[i])
Второй constraint 2
гарантирует, что поток q[i,j]
к пункту назначения j
равен пропускной способности открытого объект в пункте назначения j
с мощностью f
.
for j in J: mdl.add_constraint(mdl.sum(q[(i, j)]for i in I) == mdl.sum(X[(j,f)] for f in F))
Но тогда нам нужен другой constraint 3
, который обеспечивает сумму мощностей f
в объектах, открытых в направления j
должны быть как можно ближе к общей потребности в мощностях E
. Допустим, есть потребность в энергии в размере 100 МВт E = 100
, тогда мы хотим снизить стоимость OF
предложения, но также убедиться, что мы достигли спроса E
. В противном случае минимизация затрат будет равна 0. Это ограничение можно сформулировать следующим образом:
mdl.add_constraint(mdl.sum(X[j,f]for j in J for f in F) == E)
К сожалению, это решение невозможно. Если мы заменим ==
на <=
, то это выполнимо, но при минимальных затратах, а емкость далеко не максимальная. Нам не нужно, чтобы это было строгим ограничением, но мы хотим максимально приблизиться к E
, открыв несколько пунктов назначения в пунктах назначения j
с разной емкостью f
. (Например, у нас может быть один пункт назначения с 20 МВт, один с 5 МВт, два по 30 МВт и еще один с 15 МВт, чтобы достичь 100 МВт, открыв 5 пунктов назначения)
Один из способов - заставить модель открыться N
количество локаций j
, однако у нас набор из 128 локаций. Чтобы найти минимальную стоимость и максимальную емкость из диапазонов сценария ios от N=1
до N=128
, нам нужно запустить эту модель 128 раз.
Помимо вышеупомянутого ограничения у нас есть 3 дополнительных ограничения:
- Мы можем выбрать только пункт назначения
j
, чтобы построить объект и открыть его только с одной вместимостью f
. - Сумма пунктов назначения
j
до open больше 0. - Нет отрицательного потока
q
между исходными i
и местами назначения j
Есть ли способ:
- Сделать
constraint 3
менее привязанным, но все же попытаться достичь E
при минимальных затратах? - Измените форму
OF
, чтобы объединить минимальную стоимость с максимальной емкостью?
Важно отметить, что мы не хотим запускать модель 128 раз. Мы хотим, чтобы модель выбирала пункты назначения j
для открытия объекта и соответственно выбирала мощность f
, чтобы минимизировать общую стоимость поставки и максимизировать установленную мощность. В нашем случае e также было бы очень маловероятно открыть только одно направление j
, чтобы удовлетворить весь спрос E
. Вместо этого у нас было бы несколько j
с меньшей f
емкостью, которые в сумме приближаются к E
.