Какой алгоритм для присвоения сдвигов (дискретная проблема оптимизации)

Используя locale (как объясняется в ответе в этом потоке - в Валюта Angular Js, символ euro после ) кажется самым правильным способом сделать это, но это не кажется чтобы предложить гибкость, чтобы поместить символ валюты или имя, где вы хотите, относительно значения, на которое вы ссылаетесь. Если вам нужно иметь свой символ валюты после вашего значения, вы можете иметь отдельное поле product.currency и интерполировать его после (или до) вашего значения цены.

Итак, если у вас есть product.price = 40 и product.currency = '€', вы можете отобразить его как 40 € с {{product.price}} {{product.currency}}. Или € 40 путем изменения полей: {{product.currency}} {{product.price}}.

Возможно, вы захотите отформатировать значения product.price через десятичный канал, если вы это сделали ( https://angular.io/api/common/DecimalPipe ). - Таким образом, «40,00 €» будет: {{product.amount | number:'2.2-2'}} {{product.currency}}.

fyi - в этом случае у меня, вероятно, есть отдельное поле product.currency и product.currencySymbol (например, «USD» и «$» соответственно), но затем вы получаете больше возможностей из locale, как указано в другом ответе, указанном выше. Но если вам нужно поместить название или символ валюты в другое место относительно значения, чем то, что Angular позволит вам делать через свои родные каналы, и хотите использовать валюту, специфичную для записи или настройки, с которой вы работаете без жесткого кодирования его символа или имени на странице (например, если у вас есть несколько валют, которые вы показываете), это один из способов сделать это динамически.

19
задан Michael Borgwardt 23 February 2009 в 12:47
поделиться

6 ответов

Это - трудная проблема для решения хорошо. Было много научных работ на этом предмете особенно в , поле Operations Research - видит, например медсестра rostering бумаги 2007-2008 или просто Google "медсестра rostering исследование операций". Сложность также зависит от аспектов, таких как: сколько дней для решения; какие "запросы" могут медсестра выполнять; "циклический" список; действительно ли это - долгосрочный план, или это должно обработать короткий срок rostering "восстановление", такое как болезнь и подкачивает и т.д. и т.д.

алгоритм, который Вы описываете, эвристика подход. Можно найти, что можно настроить его для работы хорошо на один конкретный экземпляр проблемы, но как только "что-то" изменяется, это не может работать так хорошо (например, локальные оптимумы, плохая сходимость).

Однако такой подход может соответствовать зависящий Ваши конкретные бизнес-потребности - например, насколько важный это для получения оптимальным решение, проблемная схема, которую Вы описываете ожидаемый остаться такими же, что является потенциальными сбережениями (деньги и ресурсы), насколько важный восприятие медсестрой качества их списков, что является бюджетом для этой работы и т.д.

11
ответ дан 30 November 2019 в 04:48
поделиться

Umm, Вы знали, что некоторые ILP-решатели делают вполне хорошее задание? Попробуйте AIMMS, Mathematica или набор программирования GNU! 600 Переменных, конечно, намного больше, чем теорема Lenstra решит легко, но иногда эти решатели ILP имеют хороший дескриптор и в AIMMS, можно изменить переходящую стратегию немного. Плюс, существуют действительно быстрые 100%-приближений для ILPs.

4
ответ дан 30 November 2019 в 04:48
поделиться

Я решил проблему присвоения сдвига для крупного завода-изготовителя недавно. Сначала мы пытались генерировать чисто случайные расписания и возвратить любого, который передал эти is_schedule_valid тест - алгоритм нейтрализации. Это было, конечно, медленно и неопределенно.

Следующий мы попробовали генетические алгоритмы (как Вы предположили), но не мог найти хорошую функцию фитнеса, которая закрылась на любом эффективном решении (потому что самое маленькое изменение может сделать все расписание ПРАВО или НЕПРАВИЛЬНО - никакие точки для почти).

Наконец мы выбрали следующий метод (который работал отлично!):

  1. Рандомизируют входной набор (т.е. задания, сдвиг, штат, и т.д.).
  2. Создают допустимый кортеж и добавляют его к Вашему предварительному расписанию.
  3. , Если не допустимый кортеж может быть создан, откат (и инкремент) последний добавленный кортеж.
  4. Передача частичное расписание к функции, которая тестирует could_schedule_be_valid, то есть, могло это расписание быть допустимым, если бы остающиеся кортежи были заполнены возможным способом
  5. , Если !could_schedule_be_valid, просто откатывайте (и инкремент) кортеж, добавленный в (2).
  6. , Если schedule_is_complete, return schedule
  7. Goto (2)

Вы инкрементно создаете частичный сдвиг этот путь. Преимущество - то, что некоторые тесты для действительного расписания могут легко быть сделаны на Шаге 2 (предварительные тесты), и другие должны остаться на Шаге 5 (заключительные тесты).

Удача. Мы потратили впустую дни, пробуя первые два алгоритма, но получили рекомендуемый алгоритм, генерирующий действительные расписания немедленно за менее чем 5 часов разработки.

кроме того, мы поддерживали добавление префикса и добавление постфикса присвоений, которые будет уважать алгоритм. Вы просто не рандомизируете те слоты на Шаге 1. Вы найдете, что решения не должны быть в какой-либо степени оптимальными. Наше решение является O (N*M) как минимум, но выполняется в PHP(!) меньше чем за половину секунды для всего завода-изготовителя. Красота находится в исключении плохих расписаний быстро с помощью пользы could_schedule_be_valid тест.

люди, которые привыкли делать его вручную, не заботятся, требуется ли час - они просто знают, что не должны делать этого вручную больше.

3
ответ дан 30 November 2019 в 04:48
поделиться

Одна вещь, которую можно сделать, состоит в том, чтобы попытаться искать симметрии в проблеме. Например, можно ли рассматривать всех медсестер как эквивалентных в целях проблемы? Если так, затем только необходимо рассмотреть медсестер в некотором произвольном порядке - можно постараться не считать решения таким образом, что любая медсестра я планируюсь перед любой медсестрой j где я > j. (Вы действительно говорили, что отдельные медсестры предпочли времена сдвига, который противоречит этому примеру, хотя, возможно, это - менее важная цель?)

0
ответ дан 30 November 2019 в 04:48
поделиться

Динамическое программирование а-ля Bell? Отчасти кажется, что существует место для него: перекрывающиеся подпроблемы, оптимальные подструктуры.

0
ответ дан 30 November 2019 в 04:48
поделиться

Майк,

Не знаю, у вас есть хороший ответ на это, но я уверен, что программирование ограничений является билет. В то время как GA может дать вам ответ, CP предназначен для того, чтобы дать вам много ответов или сказать вам, если нет возможности. Поиски на «программное программирование ограничений» и планирование должно поднять множество информации. Это относительно новая область и методы CP хорошо работают на многих типах проблем, где традиционные методы оптимизации падают.

2
ответ дан 30 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

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