Excel Solver: определить ограничение равным нулю ИЛИ больше

7853
Nuno Nogueira

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

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

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

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

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

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

2
Файл, на который вы ссылаетесь, поднимает флаг предупреждения о том, что он может быть удален в ближайшее время и требует входа в систему. SU - это база знаний, и основная концепция заключается в том, что люди предоставляют ответы на вопросы и ответы, которые будут устойчивыми и помогут другим с подобными проблемами. Если связанный файл важен для вашего вопроса, основные элементы должны быть включены в вопрос на постоянной основе, чтобы любой читатель мог получить к ним доступ. fixer1234 8 лет назад 0

2 ответа на вопрос

2
Goblin Alchemist

Итак, 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 несколько раз вручную утомителен, я считаю, что его можно автоматизировать с помощью макросов.

Спасибо, это такая распространенная проблема во многих компаниях, я не могу поверить, что решатель не может справиться с этим: поставщик запрашивает минимальный объем покупки, вот и все. Если у вас есть время, пожалуйста, посмотрите на мой отредактированный вопрос выше, где я разместил ссылку на файл, который я использую. Спасибо. Nuno Nogueira 8 лет назад 0
@NunoNogueira, пожалуйста, смотрите мое редактирование. Видимо правильный ответ 4 625,00 € Goblin Alchemist 8 лет назад 0
Большое спасибо, это такое сложное решение общей проблемы, я ищу альтернативу решателю. В любом случае, вы, кажется, поняли это правильно, поэтому я принимаю ваш ответ. Nuno Nogueira 8 лет назад 0
1
Karl

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

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

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

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

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

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

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

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

Спасибо, это звучит как логичное объяснение, хотя я не могу его реализовать. В моем вопросе выше, я добавил файл, который я использую, если у вас есть время, не могли бы вы посмотреть? Спасибо вам большое! Nuno Nogueira 8 лет назад 0
Привет, большое спасибо за твои усилия помочь мне! Теперь это имеет больше смысла, хотя проблема еще не решена: минимальное требование в 500 на заказ не выполнено. Nuno Nogueira 8 лет назад 0
Я думаю, я понял: ограничения C5 <= C14 * C16 должны быть: C5 <= C14 * C16 + C15. То же самое для следующего. Nuno Nogueira 8 лет назад 0
Я получил следующие возможные (и считаю оптимальные) результаты без изменения ограничений, как вы говорите: Открытие инвентаря 450 50 100 425 50 Закупки 800 0 500 725 0 500 Продажи 350 400 450 400 375 250 Закрытие запасов 450 50 100 425 50 300 Холдинг стоимость 1250 500 650 1250 475 850 Общая стоимость 4975 Karl 8 лет назад 0
На самом деле, я нашел более простое решение, «вдохновленное» вашим. Посмотрите: https://docs.google.com/spreadsheets/d/1vGB7cHkiz5TZrcufECA2EpOfo9mFgxn6nF9gdBl-rrE/edit?usp=sharing Nuno Nogueira 8 лет назад 0
@NunoNogueira, пожалуйста, помните, что это решение может не работать. Я провел несколько экспериментов над простой задачей с очевидным решением, и такая нелинейная формула дает неверные результаты, которые зависят от начальных условий. Добавление дополнительной переменной с «двоичным» ограничением и умножение на нее или добавление сравнения «IF» также не работает должным образом. По-видимому, Solver не любит разрывы, а также смешивает двоичные и непрерывные переменные ... Goblin Alchemist 8 лет назад 1
Это верно, я должен был исправить решение, найденное вручную. Nuno Nogueira 8 лет назад 0

Похожие вопросы