parfor problem with fmincon body

2 vues (au cours des 30 derniers jours)
sensation
sensation le 28 Août 2018
Commenté : OCDER le 28 Août 2018
Hi, I was wondering if someone can help me to use here parfor. If the code below is run without parfor, code works well.
When I put parfor rather than for loop I get a msg that " The variable S1 in a parfor cannot be classified."
For each i, I run the code 9 times, where for each k, the variable init_s(i), get the last value of previous S1(end,k,i).
When the code finishes with k=9, the new init_S is got from line 2 and than the process continues as before and so on.
Does anyone know how to adjust the code so I can run parallel computing for each i. So I can use my 12 cores and run each i on one core for k=1:9?
Thanks a lot!!!!
parfor i = 1:M
init_s=maxS;
for k=1:9
options = optimset('MaxFunEvals',Inf,'MaxIter',10000,...
'Algorithm','interior-point','Display','iter');
tic
[x1(:,k,i),fval1(:,k,i)] = fmincon(@(x)revenue(x,N,sumprice1(k,1),init_s(i),inFlow1(:,k,i),alpha_par(i),b_par(i)),x01(:,k,i),A,b(:,k,i),Aeq,beq(k,i),LB(:,k,i),UB(:,k,i),[],options); %good
toc
S1(:,k,i)= storage(init_s(i),inFlow1(:,k,i),x1(:,k,i),N);
init_s(i)=S1(365,k,i);
end
end

Réponses (1)

OCDER
OCDER le 28 Août 2018
Here's a work around, though I don't like the fact that this copies S1... How big is S1? If it's small, maybe not a huge issue.
parfor i = 1:M
init_s = maxS;
for k = 1:9
options = optimset('MaxFunEvals',Inf,'MaxIter',10000,'Algorithm','interior-point','Display','iter');
[x1(:,k,i),fval1(:,k,i)] = fmincon(@(x)revenue(x,N,sumprice1(k,1),init_s(i),inFlow1(:,k,i),alpha_par(i),b_par(i)),x01(:,k,i),A,b(:,k,i),Aeq,beq(k,i),LB(:,k,i),UB(:,k,i),[],options); %good
S1(:,k,i) = storage(init_s(i),inFlow1(:,k,i),x1(:,k,i),N);
T = S1(:,k,i);
init_s(i) = T(365,k,i)
end
end
The trick is that whenever you use parfor, all variables that use the parfor counter variable ("i" in your case) must CONSISTENTLY use the same indexing scheme.
parfor i = 1:M
A(i, 1) = i;
A(i, 2) = i+1; %NOT OK. "(i, 1)" and "(i, 2)" are 2 different indexing.
end
parfor i = 1:M
T = A(i, :);
T(1, 1) = i;
T(1, 2) = i+1;
A(i, :) = T; %OK. Always used the same indexing, "(i, :)".
end
  2 commentaires
sensation
sensation le 28 Août 2018
Thanks for this insight! To answer your question:
S1(j,k,i); j=1:365; k=1:9 and i=1:170;
I did what you suggested but I dont see the iterations any more. I got this msg and the code seems too busy: Analyzing and transferring files to the workers ...done. and then still nothing happen.
Any clue if the parallel processing could actually speed up the work here?
Thanks a lot!
OCDER
OCDER le 28 Août 2018
S seems small enough. To see if parfor is faster, you'll have to do some time tests. Often, it's hard to be certain if the parfor is faster than regular for loops until you test it for your application. Sometimes, it's slower due to overhead in data transfer.
tic
parfor i 1:M
...
end
toc
tic
for i = 1:M
...
end
toc
How fast is it without parfor?

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by