Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
nestudent.ru_46905.doc
Скачиваний:
22
Добавлен:
12.09.2019
Размер:
2.07 Mб
Скачать

Алгоритм «отжига»

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

@Таблица 8.6. Стратегии последовательных приближений

===========214

При медленном остывании металла, соседние кристаллы сливаются друг с другом. Молекулы в одном из кристаллов покидают состояние с минимальной энергией и принимают порядок молекул в другом кристалле. Энергия получившегося кристалла большего размера будет меньше, чем сумма энергий двух исходных кристаллов. Если охлаждение происходит достаточно медленно, то кристаллы становятся очень большими. Окончательное распределение молекул представляет состояние с очень низкой энергией, и металл при этом будет очень твердым.

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

Метод отжига использует аналогичный подход для поиска наилучшего решения задачи. Во время поиска решения программой, она может застрять в локальном оптимуме. Чтобы избежать этого, программа время от времени вносит в решение случайные изменения, даже если очередное изменение и не приводит к мгновенному улучшению результата. Это может помочь программе выйти из локального оптимума и отыскать лучшее решение. Если это изменение не ведет к лучшему решению, то вероятно, через некоторое время программа его отбросит.

Чтобы эти изменения не возникали постоянно, алгоритм изменяет вероятность возникновения случайных изменений со временем. Вероятность P возникновения одного из подобных изменений определяется формулой P = 1 / Exp(E / (k * T)), где E — увеличение «энергии» системы, k — некоторая постоянная, и T — переменная, соответствующая «температуре».

Вначале температура должна быть высокой, поэтому и вероятность изменений P = 1 / Exp(E / (k * T)) также достаточно велика. Иначе случайные изменения могли бы никогда не возникнуть. С течением времени значение переменной T постепенно снижается, и вероятность случайных изменений также уменьшается. После того, как модель дойдет до точки, в которой она никакие изменения не смогут улучшить решение, и температура T станет достаточно низкой, чтобы вероятность случайных изменений была мала, алгоритм заканчивает работу.

Для задачи о формирования портфеля, в качестве прибавки «энергии» E выступает уменьшение прибыли решения. Например, при удалении позиции, которая дает прибыль 10 миллионов, и замене ее на позицию, которая приносит 7 миллионов прибыли, энергия, добавленная к системе, будет равна 3.

Заметьте, что если энергия велика, то вероятность изменений P = 1 / Exp(E / (k * T)) мала, поэтому вероятность больших изменений ниже.

Алгоритм отжига в программе Heur устанавливает значение постоянной k равным разнице между наибольшей и наименьшей прибылью возможных инвестиций. Начальная температура T задается равной 0,75. После выполнения определенного числа случайных изменений, температура T уменьшается умножением на постоянную 0,95.

=========215

Public Sub AnnealTrial(K As Integer, max_non_changes As Integer, _

max_back_slips As Integer)

Const TFACTOR = 0.95

Dim i As Integer

Dim non_changes As Integer

Dim t As Double

Dim max_profit As Integer

Dim min_profit As Integer

Dim doit As Boolean

Dim back_slips As Integer

' Найти позицию с минимальной и максимальной прибылью.

max_profit = Items(1).Profit

min_profit = max_profit

For i = 2 To NumItems

If max_profit < Items(i).Profit Then max_profit = Items(i).Profit

If min_profit > Items(i).Profit Then min_profit = Items(i).Profit

Next i

t = 0.75 * (max_profit - min_profit)

back_slips = 0

' Выбрать случайное пробное решение

' в качестве начальной точки.

Do While AddToSolution()

' Вся работа выполняется в процедуре AddToSolution.

Loop

' Использовать в качестве пробного решения.

best_profit = test_profit

best_cost = test_cost

For i = 1 To NumItems

best_solution(i) = test_solution(i)

Next i

' Повторять, пока в течение max_non_changes изменений

' подряд не будет улучшений.

non_changes = 0

Do While non_changes < max_non_changes

' Удалить случайную позицию.

For i = 1 To K

RemoveFromSolution

Next i

' Добавить максимально возможное число позиций.

Do While AddToSolution()

' Вся работа выполняется в процедуре AddToSolution.

Loop

' Если изменение улучшает пробное решение, сохранить его.

' Иначе вернуть прежнее значение решения.

If test_profit > best_profit Then

doit = True

ElseIf test_profit < best_profit Then

doit = (Rnd < Exp((test_profit - best_profit) / t))

back_slips = back_slips + 1

If back_slips > max_back_slips Then

back_slips = 0

t = t * TFACTOR

End If

Else

doit = False

End If

If doit Then

' Сохранить улучшение.

best_profit = test_profit

best_cost = test_cost

For i = 1 To NumItems

best_solution(i) = test_solution(i)

Next i

non_changes = 0 ' Хорошее изменение.

Else

' Reset the trial.

test_profit = best_profit

test_cost = best_cost

For i = 1 To NumItems

test_solution(i) = best_solution(i)

Next i

non_changes = non_changes + 1 ' Плохое изменение.

End If

Loop ' Продолжить проверку случайных изменений.

End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]