Как написать «тогда» как ограничение IP в Джулии

Привет, ребята, я изучаю Джулию и целочисленное программирование, но я застрял в одном месте

Как смоделировать «тогда» в 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 (не знаю, что такое s[i] из вопроса)

Dan Getz 02.11.2022 20:18
jump.dev/JuMP.jl/stable/manual/constraints/… может быть тем, что вы ищете
Bill 02.11.2022 20:29

Условие x[i,j] <= a[j]/s[i]^2 выше также можно записать как x[i,j] - (1/s[i]^2)*a[j] <= 0 в более стандартной форме.

Dan Getz 03.11.2022 00:05
Загадки Python - Генерация простых чисел!
Загадки Python - Генерация простых чисел!
Обычно существует несколько способов решения задач даже пограничной сложности. Как же определить оптимальное и эффективное решение?
4
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В таких случаях вам обычно нужно использовать ограничения Big-M. Итак, это будет:

a_ij >= s_i^2 - M*(1-x_ij)

где M — «достаточно большое» число. Это означает, что если x_ij == 0 неравенство всегда будет истинным (и, следовательно, как бы выключенным). С другой стороны, когда x_ij == 1M-часть будет обнулена, и уравнение будет выполнено.

В терминах 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, вы действительно хотите избежать деления или умножения переменных друг на друга. Таким образом, этот подход с большим М является более общим для всех вариантов использования.

Большое спасибо за подробное объяснение :) это помогло.

sana ullah 03.11.2022 21:19

в дополнение: что, если я хочу ввести переменную y[i,j], определяемую как y[i,j] = a[j]*x[i,j]... как бы я переписал ее целевую функцию с линейной целью и линейные ограничения.? Я пытаюсь решить проблему с упражнениями для обучения. уже спасибо за вашу поддержку.

sana ullah 03.11.2022 21:23

Другие вопросы по теме

Похожие вопросы

Джулия Стохастическое дифференциальное уравнение очень медленно
Есть ли способ сделать это более элегантным? Я не могу найти другой способ написать это
Как использовать библиотеки FFmpeg для извлечения каждого n-го кадра из видео и сохранения его в виде небольшого файла изображения на С++?
Быстрая аппроксимация простых случаев релаксированной двудольной размерности задачи о графах
Почему я не могу наблюдать эффект 4/8-канального ассоциативного кеша в моем тестовом коде
Как проверить значения массива по сравнению с другими значениями массива без сложности O (N ^ 2)
Вычисление данных на лету по сравнению с предварительно вычисленной таблицей
Распараллелить как подгонку модели, так и дноуглубительные работы (glmmTMB + земснаряд)
Перевод распаковки пикселей в галоидный алгоритм
Самый быстрый способ преобразовать непрерывную шестнадцатеричную строку в базу 10 в Python