Matlab/Octave与EC2的结合

8
我希望能够在EC2上使用Matlab,这基本上是一个令人尴尬的并行问题,因此我不一定需要并行工具箱。
阅读这里的博客:

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

链接白皮书的实际上是一个网页,上面说该服务仅在美国和加拿大提供(我在英国),但您可以注册以表示兴趣。
此外,许可证可能存在问题? 如果我必须为每个CPU购买新许可证,那对我来说是不可行的。
我的程序实际上并没有使用任何像lsqmin这样的大型MATLAB函数,因此理论上应该很容易转换为Octave(我想)。
如果由于上述任何原因无法在EC2上使用Matlab,有人能告诉我如何在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

你的问题是什么性质的?我的意思是,你想要计算/计算什么? - Rody Oldenhuis
1
我假设你不能与我分享代码(不是数据,只是代码)?我有相当丰富的经验,特别是在优化的情况下,改进Matlab代码/转换为C++,而且已经有一段时间没有这样做了,一直很想再次动手 :) - Rody Oldenhuis
Rody很高兴让你看一下,我有一个C++编译器(Visual Studio 2008),如果你能转换它就太好了。我目前有一些正在运行的东西,但是一旦机器解冻了,我会发布它。 - Bazman
Rody,我已经发布了主函数,你觉得你能转换它吗?如果需要,我可以私信给你辅助函数和数据。 - Bazman
也许你可以通过电子邮件将所有内容打包成ZIP文件发送给我。我的邮箱是mylastname-at-gmail-dot-com。 - Rody Oldenhuis
显示剩余2条评论
1个回答

6

一种不需要额外许可证的想法是在您的EC2实例上部署MATLAB Compiler Runtime (MCR)。然后使用MATLAB Compiler创建您代码的可执行文件并在这些EC2实例上运行。

MCR由MATLAB编译器提供,可用于分发应用程序,并可以免费部署。

如果您想进一步采取此方法,请考虑运行本地作业队列,将工作分配到可用的EC2实例中。 这篇文章似乎是一个很好的介绍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接