Имитация отжига с максимизацией реальной стоимости

0

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

float weight[5]={2, 3, 5, 4, 3}; // weight
float value[5]={10, 20, 15, 25, 5}; // value of corresponding item
float bagSize = 11.0; 

По жесткому расчету мы знаем, что наилучшим решением является {1,1,0,4,1,0}. Однако я не получаю это решение.

Я объясню код c++ в псевдокоде, чтобы избежать всех длинных кодов.

While (temperate > 1){
  1) Generate random values between (0,1) to fill the 5 sized array for each item
  2) Perform random swapping of values in the 5D array above.
  3) Calculate the fitness and new weight
  4) Save the best solution. 
}

В основном это мой код. Мой вопрос

  1. На шаге 2 при выполнении подкачки в настоящее время я обмениваю элементы массива. Правильно ли это? Или мне следует отслеживать предыдущее решение и заменить текущий элемент (i) на предыдущий элемент решения? (Это всего лишь идея).
  2. При использовании реальных значений в массиве, как я могу сказать системе во время выполнения, что предыдущее решение было близко к максимальной границе, потому что в моей текущей реализации я непрерывно генерирую случайные значения на первом шаге, которые повторяются до тех пор, пока система не остынет.

Наконец, возможно, в моей реализации есть какая-то огромная ошибка, я очень благодарен, если мне помогут в этой проблеме

  • 2
    Это даже не похоже на имитацию отжига, вы должны исправить свой псевдокод или, что еще лучше, включить фактическую реализацию, поскольку она должна быть длиной не более 20 строк.
  • 0
    Также обратите внимание, что моделируемый отжиг не гарантирует нахождения глобального максимума, за исключением определенных классов проблем и с очень медленным охлаждением (даже тогда, когда Metropolis-Hastings сходится к равномерной выборке из режимов распределения, вы должны быть уверены, что Вы видите все режимы, а затем рассчитываете пригодность для каждого из них.) И особенно для этих болезненных комбинаторных задач, моделируемый отжиг может быть очень хрупким. Запуск для X итераций приводит вас к близкому решению, но вам нужны X * (10 ^ 6) итераций, чтобы иметь разумный шанс получить лучшее в мире.
Показать ещё 2 комментария
Теги:
machine-learning
artificial-intelligence
simulated-annealing

1 ответ

2

Ваш псевдокод не моделирует отжиг. Вы случайно прыгаете в пространстве поиска без каких-либо целей.

Ваш первый вопрос:

На шаге 2 при выполнении подкачки в настоящее время я обмениваю элементы массива. Правильно ли это? Или мне следует отслеживать предыдущее решение и заменить текущий элемент (i) на предыдущий элемент решения? (Это всего лишь идея).

Вы должны реализовать функцию, называемую perturb. Этот perturb должен обменивать ваши значения массива. Симулированное отжиг, так как его название подразумевает использование концепции отжига. Это означает, что вы начинаете жарко. Ваша функция perturb сильно изменяет значения. Затем ваше решение начинает охлаждать, что означает, что функция perturb немного изменяет значения.

См. Следующую презентацию

z Постепенное охлаждение жидкости...

  • При высоких температурах молекулы свободно перемещаются
  • При низких температурах молекулы "застревают",

Согласно вашему решению, вы получаете свою случайность в следующей строке.

2) Выполните случайную замену значений в массиве 5D выше.

Вот как вы должны применять постепенное охлаждение.

  • 2a) int MaxRandomValueToAddToArrayValues = 20;
  • 2b) Как я нашел 20, это знание домена. В соответствии с вашими значениями и наилучшим решением 20 кажется хорошей позицией.
  • 2c) Выполните случайную замену значений в массиве 5D выше, используя эту границу
  • 2d) постепенно уменьшайте MaxRandomValueToAddToArrayValues. Например, для каждых 10 итераций вы можете уменьшить его на 0,1.

Ваш второй вопрос:

При использовании реальных значений в массиве, как я могу сказать системе во время выполнения, что предыдущее решение было близко к максимальной границе

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

  • 0
    Спасибо за ваше объяснение. Я вижу все, что я делаю не так. Просто вопрос, в моем утверждении выше, как вы сказали, что я просто ищу без цели, и я думаю, что это первый шаг? Если я исключу первый шаг, и где я случайно назначаю значения и реализую что-то вроде возмущения, как вы сказали. Извините, я совершенно заблудился в этом искусственном интеллекте.
  • 0
    Также на самом деле я получил этот псевдокод из Википедии, и он говорит, выберите несколько соседей, для которых я реализовал шаг 1 в цикле выше. en.wikipedia.org/wiki/Simulated_annealing
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню