0

数日間の最適化の後、これは のすべての行に最適な組み合わせを見つけることからなる列挙プロセスの私のコードですW。アルゴリズムは、 の要素がより多くなる ( と呼ばれる) 行列と、制限より下の要素のみを含む行列 ( と呼ばれる) に行列WW分離しLimiteInferioreます。W_legaliW_nlegali

Media(別名 Mean)のようないくつかのパラメーターを使用して、rho_b_legaliアルゴリズムは総コスト関数を最小化します。最後の部分で、目的関数の値が最も低い組み合わせがどこにあるかを見つけて保存しますW_ottimo

ご覧のとおり、アルゴリズムはそれほど「クリーン」ではなく、非常に大きなマトリックス (142506x3000) では非常に遅くなります...だから、誰かが少しスピードアップするのを手伝ってくれませんか?

   for i=1:3000
   W = PesoIncertezza * MatriceCombinazioni';
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   W_legali = W;
   W_legali(W<LimiteInferiore) = nan;

   if i==1
        Media = W_legali;
        rho_b_legale = ones(size (W_legali,1),size(MatriceCombinazioni,1));
   else
        Media = (repmat(sum(W_tot_migl,2),1,size(MatriceCombinazioni,1))+W_legali)/(size(W_tot_migl,2)+1);
        rho_b_legale = repmat(((n_b+1)/i),1,size(MatriceCombinazioni,1));
   end

   [W_legali_migl,comb] = min(C_u .* Media .* (1./rho_b_legale) + (1./rho_b_legale) .* c_0 + (c_1./(i * rho_b_legale)),[],2);

   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   MatriceCombinazioni_2 = MatriceCombinazioni;
   MatriceCombinazioni_2(sum(MatriceCombinazioni_2,2)<2,:)=[];

   W_nlegali = PesoIncertezza * MatriceCombinazioni_2';
   W_nlegali(W_nlegali>=LimiteInferiore) = nan;

   if i==1
        Media = W_nlegali;
        rho_b_nlegale = zeros(size (W_nlegali,1),size(MatriceCombinazioni_2,1));
   else
        Media = (repmat(sum(W_tot_migl,2),1,size(MatriceCombinazioni_2,1))+W_nlegali)/(size(W_tot_migl,2)+1);
        rho_b_nlegale = repmat(((n_b)/i),1,size(MatriceCombinazioni_2,1));
   end

   [W_nlegali_migliori,comb2] = min(C_u .* Media .* (1./rho_b_nlegale) + (1./rho_b_nlegale) .* c_0 + (c_1./(i * rho_b_nlegale)),[],2);

   z = [W_legali_migl, W_nlegali_migliori];

   [z_ott,comb3] = min(z,[],2);

   %Increasing n_b
   if i==1
       n_b = zeros(size(W,1),1);
   end

   index = find(comb3==1);
   increment = ones(size(index,1),1);
   B = accumarray(index,increment);
   nzIndex = (B ~= 0);
   n_b(nzIndex) = n_b(nzIndex) + B(nzIndex);

   %Using comb3 to find where is the best configuration, is in
   %W_legali or in W_nLegali?

   combinazione = comb.*logical(comb3==1) + comb2.*logical(comb3==2);
   W_ottimo = W(sub2ind(size(W),[1:size(W,1)],combinazione'))';

   W_tot_migl(:,i) = W_ottimo;
   FunzObb(:,i) = z_ott;


   [PesoCestelli] = Simulazione_GenerazioneNumeriCasuali (PianoSperimentale,NumeroCestelli,NumeroEsperimenti,Alfa);
   [PesoIncertezza_2] = Simulazione_GenerazioneIncertezza (NumeroCestelli,NumeroEsperimenti,IncertezzaCella,PesoCestelli);

   PesoIncertezza(MatriceCombinazioni(combinazione,:)~=0) = PesoIncertezza_2(MatriceCombinazioni(combinazione,:)~=0); %updating just the hoppers that has been discharged

end
4

1 に答える 1

1

あなたが見るとき、repmatあなたは考えるべきbsxfunです。たとえば、次のように置き換えます。

Media = (repmat(sum(W_tot_migl,2),1,size(MatriceCombinazioni,1))+W_legali) / ...
    (size(W_tot_migl,2)+1);

Media = bsxfun(@plus,sum(W_tot_migl,2),W_legali) / ...
    (size(W_tot_migl,2)+1);

の目的はbsxfun、配列を と同じサイズの行列に実際に複製することなく、repmat のような仮想的な「シングルトン展開」を行うことW_legaliです。

sum(W_tot_migl,2)また、上記のコードでは、 が 2 回計算されることに注意してください。他にも小さな最適化がありますが、変更するとbsxfunかなり改善されるはずです。

の値1./rho_b_legaleは実質的に 3 回計算されます。この商行列を保存します。

于 2013-10-29T07:59:43.900 に答える