Excel Solver: определить ограничение равным нулю ИЛИ больше, чем
Я создаю модель для оптимизации заказов на покупку.
Заказываемая сумма должна быть больше 500 или равна нулю.
Как определить такое ограничение в Солвере?
Я пробовал бинарное ограничение, а также несколько разных формул, но, похоже, ничего не работает.
В основном мне нужно уметь выразить OR
в Солвере, как мне это сделать?
РЕДАКТИРОВАТЬ: в следующей ссылке вы можете увидеть файл Excel, который я использую: Нажмите здесь
2 ответа
So 0 is allowed, 1 is not allowed, 499 is not allowed, and 501 is allowed? Looks like a non-contiguous area. So it's not a pure optimization problem but also a kind of combinatorial problem. I'm afraid Solver can't handle this.
You should analyze two use cases separately:
- The amount is zero (fixed value, simple calculation);
- The amount is 500 or greater (optimize in Solver using constraint >=500);
and then compare these two cases using an IF formula.
РЕДАКТИРОВАТЬ:
I tried to use "binary" and "integer" constraints as Karl suggested but they did not work.
- Create a binary variable 0-1 and a continuous variable >=500, and then use IF to either copy the continuous variable or write 0 to the purchases value
- Create a binary variable 0-1 and a continuous variable >=500, and then calculate purchases as their product
- Create an integer variable >=499, and then use IF to replace 499 by 0 for the purchases value
In all cases, the result was often wrong and depended on initial conditions. Apparently Solver doesn't like such things.
Then I thought about applying my above proposal to all six purchase values, and optimizing them independently, for example, by optimizing the sum of costs for all months. But it turns out that they are not independent: the opening inventory depends on the previous month, and the optimal purchase for a month depends on whether a purchase was made in the previous month. So it't not possible to add a simple IF to each month.
The best I could do is the following.
I added a binary variable 0-1 and a continuous variable >=500, and calculated each month's purchases using IF. But I optimized only the continuous variables using Solver. The binary variables are a parameter. That is, we select the months when a purchase will be made, then use the Solver to calculate the values of these purchases, and then note the resulting total cost.
This should be repeated for all combinations of purchases and non-purchases. The number of these combinations is 2 6 =64. But actually, if you don't purchase anything in January, you end up with a negative closing inventory which is not allowed. So there are only 32 valid combinations. I added formulae to calculate the binary values from the combination index, iterated the index 32 times, launched the Solver each time by hand and copied the results "as values only" for each combination.
В результате минимальная стоимость составляет 4 625,00 евро, и есть две комбинации для достижения этой величины.
Вот файл, загруженный в Документы Google, со снимком экрана Solver.
Запуск Solver несколько раз вручную утомителен, я считаю, что его можно автоматизировать с помощью макросов.
Создайте двоичную переменную, добавив ограничение, в котором указано, что значение переменной (в целевой функции) является двоичным. Коэффициент этой переменной в целевой функции должен быть равен 0. Затем вы добавляете следующие ограничения, как обычно делаете:
-500B + X> = 0 (никогда не превышать 500)
-MB + X <= 0 (в сочетании с предыдущими ограничивающими силами 0, когда B равно 0)
B = двоичная переменная1
M = очень большое положительное число (может быть больше X)
X = непрерывная переменная
[Редактировать]
Я понимаю, что вы хотите сделать что-то вроде этого (я также внес некоторые изменения в ваш файл листов, но я не могу поделиться файлом Excel, над которым я работал здесь):