Код Microsoft Solver Foundation для интервалов «нижний предел <= D_1 <= верхний предел» ИЛИ «D_1 == 0» в C # - PullRequest
0 голосов
/ 08 марта 2019

Я использую Microsoft Solver Foundation версии 3.0.2.10889 Express Edition для линейного программирования. У меня нет проблем при использовании LP solver. Однако я не могу установить два ограничения интервала для одного решения за один раз. Я хотел бы установить «D_1 == 0», когда «нижняя граница <= D_1 <= верхняя граница» не была удовлетворена. </p>

Я провел поиск и нашел это: Microsoft Solver Foundation для полуцелых Я попытался реализовать это, см. Упрощенный код ниже. Когда я устанавливаю нижний предел для всех решений = 1, все решения разрешаются по крайней мере со значением 1. Чтобы проверить модель больше, я устанавливаю нижний предел для всех решений = 5, надеясь, что Я получу некоторые решения с результатом = 0. Но модель теперь несостоятельна. Кажется, что модель не работает, как я ожидал. нижний предел в модели все еще действует только как минимальное значение. Не таким образом, что когда нижняя граница недопустима, вернуть 0. Это означает, что двоичная не влияет на модель.

SolverContext context = SolverContext.GetContext();
context.ClearModel();

Model model = context.CreateModel();

Decision D_1 = new Decision(Domain.RealNonnegative, "D_1");
Decision D_2 = new Decision(Domain.RealNonnegative, "D_2");
model.AddDecisions(D_1, D_2);

Decision binary = new Decision(Domain.IntegerRange(0, 1), "binary");
model.AddDecisions(binary);

Term woodproduction = 0.5 * D_1 + 0.7 * D_2;
model.AddConstraint("constraint_woodproduction", woodproduction == 20.5);

Term lowerbound = 10;
Term upperbound = 100;

Term C_1 = lowerbound * binary <= D_1 <= upperbound * binary;
model.AddConstraint("constraint_1", C_1);

Term C_2 = lowerbound * binary <= D_2 <= upperbound * binary;
model.AddConstraint("constraint_2", C_2);

model.AddGoal("cost", GoalKind.Minimize, lpgoal);

Solution solution = context.Solve(new SimplexDirective
{
          IterationLimit = -1,
          GetInfeasibility = true, //GetSensitivity = true 
});

Спасибо за любые отзывы, Зденек

...