2012-10-19 15 views
8

私はMatlabをEC2と併用したいと思っています。基本的に厄介な並列問題ですから、必ずしも並列ツールボックスが必要なわけではありません。Matlab/Octave with EC2

ここのブログを読む:

http://aws.typepad.com/aws/2008/11/parallel-comput.html

ホワイトペーパーへのリンクを、実際にはサービスが米国とカナダでのみ利用可能であることを述べているWebページが表示されます(私は英国ベースのよ)あなたの興味を登録することができます。

また、ライセンスに問題があるようですか?私は各CPUのための新しいライセンスを購入する必要がある場合は、私のための非スターター。

私のプログラムは実際にはlsqminのような大きなMATLAB関数を使用していないので、理論的にはOctave(私は思う)に簡単に変換できるはずです。

Matlabを使用して上記の理由でEC2を使用することができない場合は誰でもEC2でOctaveを使用する方法を教えていただけますか?追加ライセンスを必要としない

function [output]=DElambda(de,data,OF) 

P1=zeros(de.d,de.nP); 
Pu=zeros(de.d,de.nP); 

for i=1:de.d 
P1(i,:)=de.min(i,1)+(de.max(i,1)-de.min(i,1))*rand(de.nP,1); 
end 


P1(:,1:de.d)=diag(de.max); 
P1(:,de.d+1:2*de.d)=diag(de.min); 


for i=1:de.nP 
betas(:,i)=NSS_betas(P1(:,i),data); 
end 

Params=vertcat(betas,P1); 

Fbv=NaN(de.nG,1); 
Fbest=realmax; 



F=zeros(de.nP,1); 
P=zeros(de.nP,1); 


for i=1:de.nP 

F(i)=OF(Params(:,i)',data); 

P(i)=pen(P1(:,i),de,F(i)); 
F(i)=F(i)+P(i); 


end 

[Fbest indice] =min(F); 
xbest=Params(:,indice); 


Col=1:de.nP; 

for g=1:de.nG 
P0=P1; 
rowS=randperm(de.nP)'; 
colS=randperm(4)'; 
RS=circshift(rowS,colS(1)); 
R1=circshift(rowS,colS(2)); 
R2=circshift(rowS,colS(3)); 
R3=circshift(rowS,colS(4)); 

%mutate 
Pm=P0(:,R1)+de.F*(P0(:,R2)-P0(:,R3)); 
%extra mutation 
if de.R>0 
    Pm=Pm+de.r*randn(de.d,de.nP); 
end 

%crossover 
PmElements=rand(de.d,de.nP)<de.CR; 
%mPv(MI)=mP(Mi); 
if de.oneElementfromPm 
    Row=unidrnd(de.d,1,de.nP); 
    ExtraPmElements=sparse(Row,Col,1,de.d,de.nP); 
    PmElements=PmElements|ExtraPmElements; 
end 

P0_Elements=~PmElements; 
Pu(:,RS)=P0(:,RS).*P0_Elements+PmElements.*Pm; 
%%%need to add penalty!!!!!!!!!!!! 
%select vector to enter next generation 

for i=1:de.nP 
betasPu(:,i)=NSS_betas(Pu(:,i),data); 
end 



ParamsPu=vertcat(betasPu,Pu); 
flag=0; 
for i=1:de.nP 
    %for j=1:dates 
    %Ftemp=feval(OF,Pu(:,i)',data,j); 
    Ftemp=OF(ParamsPu(:,i)',data); 
    %end 
    %Ftemp=OF(Pu(:,i),data); 
    Ptemp=pen(Pu(:,i),de,F(i)); 
    Ftemp=Ftemp+Ptemp; 

    if Ftemp<=F(i); 
     P1(:,i)=Pu(:,i); 
     F(i)=Ftemp; 
     if Ftemp < Fbest 
     Fbest=Ftemp; xbest=ParamsPu(:,i); flag=1; 
     end 
    else 
     P1(:,i)=P0(:,i); 
    end  
end 

if flag 
    Fbv(g)=Fbest; 
end 

end 

output.Fbest=Fbest; output.xbest=xbest; output.Fbv=Fbv; 
end 



function penVal=pen(mP,pso,vF) 

minV=pso.min; 
maxV=pso.max; 
ww=pso.ww; 

A=mP-maxV; 
A=A+abs(A); 

B=minV-mP; 
B=B+abs(B); 

C=ww*((mP(1,:)+mP(2,:))-abs(mP(1,:)+mP(2,:))); 
penVal=ww*sum(A+B,1)*vF-C; 


end 
+0

問題の性質は何ですか?つまり、何を計算/計算したいのですか? –

+0

私は、約2000の異なるデータセットを実行するのに約8時間かかる最適化アルゴリズムを使用しています。各データセットの最適化は完全に独立しており、容易に分割することができます。残念ながら、最適化はオプティマイザで使用されるパラメータに敏感ですので、この作業を複数回実行してオプティマイザを調整することに直面しています。 – Bazman

+1

私はコードを私と共有することは許されていないと仮定します(データではなく、コードのみ)。私はMatlabのコードを改良してC++に変換するのにかなりの経験を持っていますが、特に最適化の文脈で必要なところでは、私はしばらくそれをやっておらず、手を汚さないようにしています:) –

答えて

6

ひとつのアイデアは、あなたのEC2インスタンス上でMATLAB Compiler Runtime(MCR)を展開することです。次に、MATLAB Compilerを使用してコードの実行可能ファイルを作成し、それらのEC2インスタンスで実行します。

MCRは、 アプリケーションを配布するためのMATLAB Compilerに付属しており、ロイヤリティフリーで導入することができます。

この方法をさらに使いたい場合は、使用可能なEC2インスタンス間で作業を分散するローカルジョブキューを実行することを検討してください。 Thisは、これを行う方法に関する素敵な記事です。