Я пытаюсь написать простой общий параллельный код для минимизации функции в MATLAB. Идея очень проста, по сути:
parfor k = 1:N
(...find a good solution xcurrent with cost fcurrent ... )
% keep best current value
fmin = min(fmin,fxcurrent)
end
Это прекрасно работает, потому что fmin - это редукционная переменная, и поэтому я могу использовать эту конструкцию для обновления текущего наилучшего значения.
Однако я не смог найти хороший элегантный способ сохранить (или сохранить) лучшее текущее решение ("xcurrent").
Как мне отслеживать лучшее решение, найденное до сих пор?
Другими словами, если текущее значение строго меньше, чем fmin, как я могу сохранить xcurrent (с учетом ограничений, накладываемых параллельными циклами в MATLAB)?
[Конечно, серийная версия тривиальна, просто добавьте
if fxcurrent < fmin;
xbest = xcurrent;
end;
но это не работает в цикле parfor.]
Несколько подходов, которые приходят на ум:
Я мог бы просто хранить все решения и затраты (используя нарезанные переменные), но это крайне неэффективно для памяти (число итераций N очень велико, а сами решения очень велики).
Точно так же я мог бы использовать редукционную переменную (set или matrix) и сделать:
solutionset = [solutionset,xcurrent]
но это почти так же плохо с точки зрения требований к памяти.
- Я также могу сохранять xcurrent на диск каждый раз, когда улучшается решение.
Я пытался найти более простое решение, но ничего не было очень полезно.
Вопрос, кажется, хорошо определен (так что это не так, как в других задачах, где результат может зависеть от порядка итерации), но я не смог найти элегантный способ сделать это.
Заранее извиняюсь, если я упускаю что-то очевидное, и большое спасибо заранее!