Как реализовать! = (Не равно) в lpSolve r

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

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

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

РЕДАКТИРОВАТЬ

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


person David    schedule 01.07.2019    source источник


Ответы (1)


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

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

ДОБАВЛЕН:

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

x < 10 and x != 9

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

x <= 8

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

ДОБАВЛЕНО 2:

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

objective <= opt - eps

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

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

ДОБАВЛЕНО 3.

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

person G. Grothendieck    schedule 01.07.2019
comment
Что ж, я не могу найти подходящий пример. Моя идея заключалась в том, чтобы предоставить простой пример, чтобы понять, как я могу воспроизвести! = Без его использования. На самом деле у меня огромная проблема оптимизации, и я хотел бы вернуть определенное количество оптимальных решений. Поскольку lpSolve предоставляет только одно оптимальное решение, моя идея заключалась в том, чтобы сделать n итераций (равных количеству желаемых оптимальных решений) и на каждой итерации добавлять ограничения, поскольку новые x1, x2, x3, x4, .... равны! = ( не равно) к предыдущим оптимальным решениям. Простите за недопонимание. Если у вас есть идеи, я был бы признателен! - person David; 02.07.2019
comment
См. Новый раздел ДОБАВЛЕНО 2 - person G. Grothendieck; 02.07.2019
comment
Что вы предлагаете для eps? - person David; 02.07.2019
comment
Возможно 1е-5. Зависит от масштабов вашей проблемы. - person G. Grothendieck; 02.07.2019
comment
Добавлены ДОБАВЛЕННЫЕ 3 раздела. - person G. Grothendieck; 02.07.2019