Я создаю модель для оптимизации заказов на закупку.
Сумма заказа должна быть больше 500 или равна нулю.
Как определить такое ограничение в Solver?
Я попробовал бинарное ограничение, а также несколько разных формул, но ничего не работает.
По сути, мне нужно уметь выражать свои мысли OR
в Solver, как это сделать?
EDIT: по следующей ссылке вы можете увидеть файл Excel, который я использую: кликните сюда
решение1
То есть 0 разрешено, 1 не разрешено, 499 не разрешено, а 501 разрешено? Похоже на несмежную область. Так что это не чисто оптимизационная задача, а своего рода комбинаторная задача. Боюсь, Solver не справится с этим.
Вам следует проанализировать два варианта использования по отдельности:
- Сумма равна нулю (фиксированное значение, простой расчет);
- Сумма составляет 500 или больше (оптимизируйте в Solver, используя ограничение >=500);
а затем сравните эти два случая, используя формулу ЕСЛИ.
РЕДАКТИРОВАТЬ:
Я попытался использовать «двоичные» и «целочисленные» ограничения, как предлагал Карл, но они не сработали.
- Создайте двоичную переменную 0-1 и непрерывную переменную >=500, а затем используйте IF, чтобы скопировать непрерывную переменную или записать 0 в значение покупки.
- Создайте бинарную переменную 0-1 и непрерывную переменную >=500, а затем рассчитайте покупки как их произведение
- Создайте целочисленную переменную >=499, а затем используйте IF, чтобы заменить 499 на 0 для значения покупки.
Во всех случаях результат часто был неверным и зависел от начальных условий. Видимо, Solver не любит такие вещи.
Затем я подумал о том, чтобы применить мое вышеприведенное предложение ко всем шести значениям закупок и оптимизировать их независимо, например, оптимизировав сумму затрат за все месяцы. Но оказалось, что они не являются независимыми: начальный запас зависит от предыдущего месяца, а оптимальная закупка за месяц зависит от того, была ли сделана закупка в предыдущем месяце. Поэтому невозможно добавить простой IF к каждому месяцу.
Лучшее, что я могу сделать, это следующее.
Я добавил бинарную переменную 0-1 и непрерывную переменную >=500 и рассчитал ежемесячные покупки с помощью IF. Но я оптимизировал только непрерывные переменные с помощью Solver. Бинарные переменные являются параметром. То есть мы выбираем месяцы, когда будет сделана покупка, затем используем Solver для расчета стоимости этих покупок, а затем отмечаем итоговую общую стоимость.
Это следует повторить для всех комбинаций покупок и непокупок. Количество таких комбинаций равно 2 6 = 64. Но на самом деле, если вы ничего не купите в январе, у вас останется отрицательный остаток на конец периода, что недопустимо. Поэтому допустимых комбинаций всего 32. Я добавил формулы для расчета двоичных значений из индекса комбинации, выполнил итерацию индекса 32 раза, каждый раз вручную запускал Solver и копировал результаты «только как значения» для каждой комбинации.
В результате минимальная стоимость составляет 4 625,00 €, и для достижения этой стоимости возможны две комбинации.
Вот файл, загруженный в Google Docs, со снимком экрана Solver.
Многократный запуск Solver вручную утомителен, я считаю, что это можно автоматизировать с помощью макросов.
решение2
Создайте бинарную переменную, добавив ограничение, указывающее, что значение переменной (в целевой функции) является бинарным. Коэффициент этой переменной в целевой функции должен быть равен 0. Затем вы добавляете следующие ограничения, как обычно:
-500B+X>=0 (никогда не опускаться ниже 500)
-MB+X<=0 (в сочетании с предыдущими силами ограничения 0, когда B равен 0)
B= Двоичная переменная1
M=Очень большое положительное число (больше, чем X, быть не может)
X= непрерывная переменная
[Редактировать]
Я понимаю, что вы хотите сделать что-то вроде этого (я также внес некоторые изменения в ваш файл таблиц, но я не могу поделиться здесь файлом Excel, над которым я работал):