Как реализовать! = (Не равно) в lpSolve r - PullRequest
0 голосов
/ 01 июля 2019

Поскольку lpSolve не позволяет использовать! = Для направлений ограничений, каков альтернативный способ получить тот же результат? Я хотел бы максимизировать x1 + x2 с ограничениями: x1 <= 5 и х2! = 5 и продолжайте использовать пакет lpSolve R. </p>

Я пытался использовать комбинацию> <для того, чтобы повторить то же поведение! =, Однако я не получил ожидаемого результата. </p>

f.obj<-c(1,1)
f.con<-matrix(c(1,0,0,1),nrow=2,ncol=2,byrow=TRUE)
f.dir<-c("<=","!=")
f.rhs<-c(5,5)
lp("max",f.obj,f.con,f.dir,f.rhs)$solution

Поскольку lpSolve не поддерживает! =, Я ​​получаю сообщение об ошибке:

Error in lp("max",f.obj,f.con,f.dir,f.rhs): Unknown constraint direction found

EDIT

Я хотел бы максимизировать x1 + x2 с ограничениями: x1 <= 5 и х2 <10 и х2! = 9. Таким образом, решение будет 5 и 8. </p>

1 Ответ

1 голос
/ 01 июля 2019

Вы не можете сделать это, даже теоретически, так как результирующий набор ограничений не закрыт. Это все равно, что пытаться минимизировать x ^ 2 над множеством x> 0. Для любого предложенного решения x0 в этом множестве решение x0 / 2 лучше, поэтому нет оптимального.

Я бы просто использовал x <= 5 в качестве вашего ограничения, и если ограничение не активно (то есть оказывается, что x <5), то вы нашли решение; в противном случае, нет решения. Если решения не существует, вы можете попробовать x <= 5 - eps для произвольно выбранного eps. </p>

ДОБАВЛЕНО:

Если вы хотели, чтобы переменные x1 и x2 были целыми числами, то

x < 10 and x != 9

эквивалентно

x <= 8

Обратите внимание, что lp имеет аргумент all.int, который по умолчанию равен FALSE.

ДОБАВЛЕНО 2:

Если вы просто хотите найти несколько выполнимых решений, тогда, если opt - это значение цели из первого решения, повторно добавьте ограничение (при условии задачи максимизации):

objective <= opt - eps

где eps - произвольная малая постоянная.

Также отметим, что если векторы x1 и x2 являются двумя оптимальными решениями LP, то так как множество ограничений обязательно выпукло, любая выпуклая комбинация этих решений также возможна, и поскольку цель является линейной, все эти выпуклые комбинации также должны быть оптимальный, так что если существует более одного оптимума, то таких оптимальных решений бесконечно много, поэтому вы не можете просто перечислить их.

ДОБАВЛЕНО 3.

Допустимое множество линейной программы образует симплекс (то есть многогранник), и хотя бы одна вершина должна иметь оптимальное значение, если такое оптимальное значение существует. Если существует более одной вершины с одинаковым оптимальным значением, то точки на соединяющей их линии также являются оптимальными значениями. Хотя в этом случае существует бесконечное число оптимальных значений, существует только конечное число вершин, поэтому вы можете перечислить их с помощью пакета vertexenum. Затем оцените цель в каждом. Если есть одна вершина, объективное значение которой больше, чем у всех остальных, то это оптимально. Если их несколько, то мы знаем, что они плюс все выпуклые комбинации из них являются оптимальными. Это может работать, если ваша проблема не слишком велика.

...