Привет, ребята, я изучаю Джулию и целочисленное программирование, но я застрял в одном месте
Как смоделировать «тогда» в julia-jump для целочисленного программирования Leanring.
Застрял здесь
#Define the variables of the model
@variable(mo, x[1:N,1:S], Bin)
@variable(mo, a[1:S]>=0)
#Assignment constraint
@constraint(mo, [i=1:N], sum(x[i,j] for j=1:S) == 1)
#@constraint (mo, PLEASE HELP )
Условие x[i,j] <= a[j]/s[i]^2
выше также можно записать как x[i,j] - (1/s[i]^2)*a[j] <= 0
в более стандартной форме.
В таких случаях вам обычно нужно использовать ограничения Big-M. Итак, это будет:
a_ij >= s_i^2 - M*(1-x_ij)
где M
— «достаточно большое» число. Это означает, что если x_ij == 0
неравенство всегда будет истинным (и, следовательно, как бы выключенным). С другой стороны, когда x_ij == 1
M
-часть будет обнулена, и уравнение будет выполнено.
В терминах JuMP код будет выглядеть так:
const M = 10_000
@constraint(mo, [i=1:N, j=1:S], a[i, j] >= s[i]^2 - M*(1 - x[i, j]))
Однако, если s[i]
является внешним параметром, а не переменной модели, вы можете просто использовать x[i,j] <= a[j]/s[i]^2
, предложенный @DanGetz. Однако, когда s[i]
есть @variable
, вы действительно хотите избежать деления или умножения переменных друг на друга. Таким образом, этот подход с большим М является более общим для всех вариантов использования.
Большое спасибо за подробное объяснение :) это помогло.
в дополнение: что, если я хочу ввести переменную y[i,j], определяемую как y[i,j] = a[j]*x[i,j]... как бы я переписал ее целевую функцию с линейной целью и линейные ограничения.? Я пытаюсь решить проблему с упражнениями для обучения. уже спасибо за вашу поддержку.
Как насчет:
x[i,j] <= a[j]/s[i]^2
(не знаю, что такоеs[i]
из вопроса)