Как спроектировать функцию вероятности приемлемости для моделируемого отжига с несколькими различными затратами?

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

  • global_finish_time: общее количество дней, охватываемых расписанием.
  • split_cost: количество дней, на которое каждая задача задерживается из-за прерывания другими задачами (это предназначено для предотвращения прерывания задачи после ее запуска).
  • deadline_cost: сумма квадратов количества дней, на которое просрочен каждый пропущенный крайний срок.

Традиционная функция вероятности принятия выглядит так (в Python):

def acceptance_probability(old_cost, new_cost, temperature):
    if new_cost < old_cost:
        return 1.0
    else:
        return math.exp((old_cost - new_cost) / temperature)

До сих пор я объединил свои первые две стоимости в одну, просто добавив их, чтобы я мог передать результат в acceptance_probability. Но на самом деле я бы хотел, чтобы deadline_cost всегда имело приоритет над global_finish_time, а global_finish_time — над split_cost.

Итак, мой вопрос к Stack Overflow: как я могу разработать функцию вероятности принятия, которая учитывает несколько энергий, но всегда считает первую энергию более важной, чем вторая энергия, и так далее? Другими словами, я хотел бы передать old_cost и new_cost как кортежи из нескольких стоимостей и вернуть разумное значение.

Редактировать: После нескольких дней экспериментов с предложенными решениями я пришел к выводу, что единственный способ, который работает достаточно хорошо для меня, — это предложение Майка Данлави, хотя это создает много других трудностей с компонентами затрат, которые имеют разные единицы. Я практически вынужден сравнивать яблоки с апельсинами.

Итак, я приложил некоторые усилия для «нормализации» значений. Во-первых, deadline_cost — это сумма квадратов, поэтому она растет экспоненциально, в то время как другие компоненты растут линейно. Чтобы решить эту проблему, я использую квадратный корень, чтобы получить аналогичную скорость роста. Во-вторых, я разработал функцию, которая вычисляет линейную комбинацию затрат, но автоматически настраивает коэффициенты в соответствии с самой высокой составляющей стоимости, которую мы видели до сих пор.

Например, если набор самых высоких затрат равен (A, B, C), а входной вектор затрат равен (x, y, z), линейная комбинация будет BCx + Cy + z. Таким образом, независимо от того, насколько высоким становится значение z, оно никогда не будет более важным, чем значение x, равное 1.

Это создает «неровности» в функции затрат по мере обнаружения новых максимальных затрат. Например, если C повышается, то BCx и Cy будут выше для заданных (x, y, z) входных данных, как и разница между затратами. Более высокая разница в стоимости означает, что вероятность принятия снизится, как если бы температура была внезапно понижена на дополнительный шаг. На практике, однако, это не проблема, поскольку максимальные затраты обновляются только несколько раз в начале и не меняются в дальнейшем. Я полагаю, что можно даже теоретически доказать сходимость к правильному результату, поскольку мы знаем, что стоимость будет сходиться к более низкому значению.

Одна вещь, которая меня все еще несколько смущает, это то, что происходит, когда максимальные затраты равны 1,0 и ниже, скажем, 0,5. С максимальным вектором (0,5, 0,5, 0,5) это дало бы линейную комбинацию 0,5 * 0,5 * x + 0,5 * y + z, т. е. порядок приоритета внезапно изменился. Я полагаю, что лучший способ справиться с этим — использовать максимальный вектор для масштабирования всех значений до заданных диапазонов, чтобы коэффициенты всегда могли быть одинаковыми (скажем, 100x + 10y + z). Но я еще не пробовал это.


person flodin    schedule 09.07.2009    source источник
comment
Мне было бы интересно узнать, является ли это отраслевой или академической проблемой. С уважением   -  person Howard May    schedule 09.07.2009
comment
Это не академично. Я использую это как альтернативу MS Project. Основная цель программы — облегчить ответ на вопрос, когда ваша команда сможет добавить функцию X в наше программное обеспечение?   -  person flodin    schedule 09.07.2009
comment
Я знаю, что этому вопросу много лет, но для всех, кто наткнется на эту страницу через Google... в нечеткой логике взвешенная сумма эквивалентна логическому ИЛИ, поэтому вы фактически говорите, что условие A ИЛИ условие B и т. д. На самом деле вам нужно A AND B AND C, и для этого вы используете умножение. Есть несколько предостережений (например, ваши веса теперь должны быть степенями), но это намного лучше, чем беспорядок, который вы получаете, пытаясь все в частном случае. Wiki Модель взвешенной суммы и Модель взвешенного продукта для более подробной информации.   -  person Mark Feldman    schedule 15.11.2013


Ответы (4)


мбекиш прав.

Не могли бы вы составить линейную комбинацию различных энергий и настроить коэффициенты?

Возможно, лог-преобразование их туда и обратно?

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

person Mike Dunlavey    schedule 09.07.2009
comment
Различные количества не всегда имеют совместимые единицы измерения. Например, значение крайнего срока возводится в квадрат, чтобы получить оптимизацию по методу наименьших квадратов, т. е. я предпочитаю откладывать 3 задачи на 1 день каждую, а не 1 задачу на 3 дня. Я обдумывал это, но боюсь, что столкнусь со многими пограничными случаями, когда система работает неправильно, потому что я не правильно расставил коэффициенты (если такая вещь вообще существует). Также см. ответ Макбекишу - person flodin; 09.07.2009
comment
@flodin: Вы хотите, чтобы ваша общая энергетическая поверхность была непрерывной, поэтому я бы стеснялся операторов IF. Кроме того, вы можете сделать это довольно нелинейным, например, иметь квадратичное отталкивание от граничных случаев - просто мысль. - person Mike Dunlavey; 09.07.2009

Я бы воспользовался подсказкой из многоцелевого эволюционного алгоритма (MOEA) и сделал бы его переходным, если все цели одновременно проходят с заданной вами функцией acceptance_probability. Это будет иметь эффект исследования фронта Парето, во многом подобно тому, как стандартный моделируемый отжиг исследует плато решений с той же энергией.

Тем не менее, это отказывается от идеи приоритета первого.

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

person Michael Melanson    schedule 19.08.2010

Я бы рассмотрел что-то вроде:

If (new deadline_cost > old deadline_cost)
  return (calculate probability)

else if (new global finish time > old global finish time)
  return (calculate probability)

else if (new split cost > old split cost)
  return (calculate probability)

else 
  return (1.0)

Конечно, каждое из трех мест, где вы вычисляете вероятность, может использовать другую функцию.

person Howard May    schedule 09.07.2009
comment
Я попробую и вернусь к вам. Я думал о чем-то подобном, но вижу потенциальную проблему в том, что разница X в первом значении представляет ту же вероятность, что и разница X во втором значении. Интуитивно разница во втором значении должна представлять значение, которое в каком-то смысле представляет собой бесконечно меньшую вероятность. Проблема здесь в том, что методом проб и ошибок трудно убедить себя в правильности вашего алгоритма. Это может работать в простых случаях, но создавать странное поведение в сложных сценариях. Я желаю некоторого теоретического подтверждения метода. - person flodin; 09.07.2009
comment
Я предполагаю, что это эвристический подход, который не редкость в NP-полных решениях. - person Howard May; 09.07.2009
comment
Я попробовал это, и он генерирует довольно хорошие решения. Одна проблема заключается в том, что после того, как компонент с наивысшим приоритетом установил оптимальное значение, слишком вероятно, что алгоритм выпрыгнет из этого решения даже при низких температурах. Это логично, поскольку переход от (0, 0) к (1, 0) имеет точно такую ​​же вероятность, как и переход от (0, 0) к (0, 1). Я оставлю вопрос открытым на некоторое время и продолжу экспериментировать, чтобы посмотреть, не появится ли что-нибудь лучше. Прямо сейчас я рассматриваю некоторую разницу в величине вероятности при оценке компонента с более низким приоритетом. - person flodin; 11.07.2009

Это зависит от того, что вы подразумеваете под «имеет приоритет». Например, что, если deadline_cost уменьшится на 0,001, а global_finish_time стоимость возрастет на 10 000? Вы возвращаете 1.0, потому что deadline_cost уменьшилось, и это имеет приоритет над чем-либо еще? Похоже, что это суждение, которое можете сделать только вы, если вы не можете предоставить достаточно исходной информации о проекте, чтобы другие могли предложить свое собственное обоснованное суждение.

person mbeckish    schedule 09.07.2009
comment
Да, сроки всегда важнее общего времени завершения. Даже если глобальное время завершения увеличится на 10 000, я хочу, чтобы система поддерживала более низкую стоимость крайнего срока. Это то, что я пытался объяснить в вопросе, извините, если это неясно. - person flodin; 09.07.2009