оптимизация, редукционные переменные и MATLAB parfor - PullRequest
2 голосов
/ 02 марта 2012

Я пытаюсь написать простой общий параллельный код для минимизации функции в 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 на диск каждый раз, когда улучшается решение.

Я пытался найти более простое решение, но ничего не было очень полезно.

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

Заранее извиняюсь, если я упускаю что-то очевидное, и большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Спасибо, поэтому я копирую предложение здесь.

Просто идея - что если вы напишите свою собственную функцию сокращения - в основном просто содержащую блок if и сохранение или вывод?

0 голосов
/ 02 марта 2012

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

Внутренний (последовательный) цикл может использовать нормальную конструкцию if fxcurrent < fmin; xmin = xcurrent; end для обновления своего лучшего решения, а внешний (параллельный) цикл может просто хранить все решения, используя нарезку. В качестве последнего шага вы выбираете лучшее решение из вашего (небольшого) набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...