2016-01-30 3 views
1

Я пытаюсь решить программу конуса в Matlab, вызывая MOSEK, изменяя границу на одном из ограничений.Оптимизация в параллельном режиме в Matlab с помощью Mosek

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

testBounds=[0.1, 0.15, 0.2, 0.25, 0.3]; 
clear prob; 

[r, res] = mosekopt('symbcon'); 
prob.c = [0 0 0 1 1 1]; 

% Specify the non-conic part of the problem. 
prob.a = sparse([1 1 2 0 0 0]); 
prob.buc = 1; 
prob.blx = [0 0 0 -inf -inf -inf]; 
prob.bux = inf*ones(6,1); 

% Specify the cones. 
prob.cones.type = [res.symbcon.MSK_CT_QUAD, res.symbcon.MSK_CT_RQUAD]; 
prob.cones.sub = [4, 1, 2, 5, 6, 3]; 
prob.cones.subptr = [1, 4]; 

for i=1:5 
    % Specify the changing bound 
    prob.blc = testBounds(i); 

    % Optimize the problem. 
    [r,res]=mosekopt('minimize',prob); 

    % Display the primal solution. 
    res.sol.itr.xx' 
end 

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

ответ

1

Проблемы с вашим кодом является вашим использованием переменной prob. Хотя на алгоритмическом уровне он независим, потому что каждая итерация цикла использует собственный параметр для blc и не использует никаких предыдущих данных, parfor не поддерживает это использование. Самый простое решение не изменять переменную prob, но вместо того, чтобы скопировать его в каждой итерации, что делает prob широковещательные и prob2 локальными переменный:

parfor ii=1:5 
    % Specify the changing bound 
    %copy broadcast variable prob to a temporary variable prob2 
    %this way the iteration has writing capabilities 
    prob2=prob 
    prob2.blc = testBounds(ii); 

    % Optimize the problem. 
    [r,res]=mosekopt('minimize',prob2); 

    % Display the primal solution. 
    res.sol.itr.xx' 
end 

Еще одна проблемы с вашим кодом пути вы возвращаете данные. parfor не имеет порядка при обработке данных, поэтому просто отображение его на консоли не даст вам никаких полезных результатов. Это тоже медленно. Я не знаю, что именно вам нужно и что такое типы данных, поэтому я не коснулся этой части кода. Код в моем ответе делает вычисления, но не возвращает никаких результатов, потому что res и r являются временными переменными.

1
N=5; 
r = cell(1,N); 
res = cell(1,N); 
for ii=1:N 
    % Specify the changing bound 
    prob2=prob; 
    prob2.blc = testBounds(ii); 

    % Optimize the problem. 
    [r{ii},res{ii}]=mosekopt('minimize',prob2); 

    % Display the primal solution. 
    res{ii}.sol.itr.xx' %'// better not display at all during calculation 
end 

parfor не допускает создания переменных в пределах своих границ. Поэтому я решил переклассифицировать r и res в качестве ячеек, которые могут выполнять выходное хранилище. См вопроса prob/prob2 в @Daniel's answer

+0

Ваш код не работает, 'prob' должен быть широковещательной переменной, поскольку он создается вне цикла и не индексируется, но изменяется, что возможно только для сокращений и разрезанных переменных. Parfor также позволяет создавать переменные, но они только временны и не видны снаружи или для других итераций. – Daniel

Смежные вопросы