2

Я создаю модель для оптимизации заказов на покупку.

Заказываемая сумма должна быть больше 500 или равна нулю.

Как определить такое ограничение в Солвере?

Я пробовал бинарное ограничение, а также несколько разных формул, но, похоже, ничего не работает.

По сути, мне нужно иметь возможность выразить OR в Солвере, как мне это сделать?

РЕДАКТИРОВАТЬ: в следующей ссылке вы можете увидеть файл Excel, который я использую: Нажмите здесь

2 ответа2

2

Итак, 0 разрешено, 1 не разрешено, 499 не разрешено, а 501 разрешено? Выглядит как несмежная область. Так что это не просто проблема оптимизации, а своего рода комбинаторная проблема. Боюсь, Солвер не может справиться с этим.

Вы должны проанализировать два варианта использования отдельно:

  • Сумма равна нулю (фиксированное значение, простой расчет);
  • Сумма составляет 500 или больше (оптимизируйте в Солвере, используя ограничение> = 500);

и затем сравните эти два случая, используя формулу IF.


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

Я пытался использовать "двоичные" и "целочисленные" ограничения, как предложил Карл, но они не работали.

  • Создайте двоичную переменную 0-1 и непрерывную переменную> = 500, а затем используйте IF, чтобы либо скопировать непрерывную переменную, либо записать 0 в значение покупки
  • Создайте двоичную переменную 0-1 и непрерывную переменную> = 500, а затем рассчитайте покупки как их продукт
  • Создайте целочисленную переменную> = 499, а затем используйте IF для замены 499 на 0 для значения покупок

Во всех случаях результат часто был неправильным и зависел от начальных условий. Видимо Солвер не любит такие вещи.

Затем я подумал о том, чтобы применить предложенное выше предложение ко всем шести значениям покупки и оптимизировать их независимо, например, путем оптимизации суммы затрат за все месяцы. Но оказывается, что они не являются независимыми: начальный запас зависит от предыдущего месяца, а оптимальная покупка за месяц зависит от того, была ли покупка совершена в предыдущем месяце. Поэтому невозможно добавить простой IF к каждому месяцу.

Лучшее, что я мог сделать, это следующее.

Я добавил двоичную переменную 0-1 и непрерывную переменную> = 500 и рассчитывал покупки за каждый месяц, используя IF. Но я оптимизировал только непрерывные переменные, используя Solver. Бинарные переменные являются параметром. То есть мы выбираем месяцы, когда будет совершена покупка, затем используем Солвер для расчета стоимости этих покупок и затем записываем итоговую общую стоимость.

Это следует повторить для всех комбинаций покупок и не покупок. Количество этих комбинаций составляет 2 6 = 64. Но на самом деле, если вы ничего не купите в январе, вы получите отрицательный закрывающий инвентарь, который не разрешен. Таким образом, есть только 32 допустимых комбинации. Я добавил формулы для вычисления двоичных значений по индексу комбинации, повторил индекс 32 раза, каждый раз вручную запускал Солвер и копировал результаты "только как значения" для каждой комбинации.

В результате минимальная стоимость составляет 4 625,00 €, и есть две комбинации для достижения этой величины.

Вот файл, загруженный в Документы Google, со скриншотом Solver.

Запуск Solver несколько раз вручную утомителен, я считаю, что его можно автоматизировать с помощью макросов.

1

Создайте двоичную переменную, добавив ограничение, указывающее, что значение переменной (в целевой функции) является двоичным. Коэффициент этой переменной в целевой функции должен быть 0. Затем вы добавляете следующие ограничения, как вы это обычно делаете:

-500B+X> = 0 (никогда не превышать 500)

-MB+X <= 0 (в сочетании с предыдущими ограничивающими силами 0, когда B равно 0)

B = двоичная переменная1

M = очень большое положительное число (может быть больше X)

X = непрерывная переменная

[Редактировать]

Я понимаю, что вы хотите сделать что-то вроде этого (я также внес некоторые изменения в ваш файл листов, но я не могу поделиться файлом Excel, над которым я работал здесь):

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .