matlabによる制約最適化-並列計算


以前に作成した制約最適化コードは18のテスト問題で完了する必要があり、ランダム性の影響で複数回のテスト問題が必要で、時間がかかりすぎるため、matlabの並列計算の機能が必要です.

一、parpool関数


まずmatlabコマンドラインにhelp parpoolを入力します.
>> help parpool
parpool - Create parallel pool on cluster

    This MATLAB function enables the full functionality of the parallel language
    features (parfor and spmd) in MATLAB by creating a special job on a pool of
    workers, and connecting the MATLAB client to the parallel pool.

    parpool
    parpool(poolsize)
    parpool(profilename)
    parpool(profilename,poolsize)
    parpool(cluster)
    parpool(cluster,poolsize)
    parpool(___,Name,Value)
    poolobj = parpool(___)

この関数の目的はクラスタ上にパラレルプールを作成することであり、以下に関数の使い方を示す.
parpoolのパラメータprofilename、poolsize、clusterはオプションで、値を指定しない場合はデフォルト設定を使用してパラレルプールを起動します.profilenameは指定したプロファイルからプールを構築し、poolsizeはプールの数を指定します.最大数はカーネル数に関係し、clusterは指定したクラスタからプールを構築します.
parpool('local',func)を使用して、ローカルプロファイルからfuncサイズのパラレルプールを構築します.
parpoolのヘルプ記述では、パラレル言語関数にはparforとspmdがあり、parfor関数はparallel forの略であり、matlabでパラレルループを行うために使用される.spmd関数はSingle Program/Multiple Dataの略であり,単一プログラムマルチタスク並列である.従って,本稿ではspmd関数を次の計算として用いる.

二、spmd関数


matlabコマンドラインにhelp spmdを入力します.
>> help spmd
spmd - Execute code in parallel on workers of parallel pool

    This MATLAB function defines an spmd statement on a single line.

    spmd, statements, end
    spmd(n), statements, end
    spmd(m,n), statements, end

この関数の目的はパラレルプールのworkerパラレル実行コードであることがわかり、以下に関数の使い方を示す.
spmdのパラメータn、mはオプションで、デフォルトではパラレルプール内のすべてのworkerが使用され、使用可能なプールがない場合はmatlabがプールを作成し、すべてのworkerが使用されます.spmd(n)のパラメータnは、計算するmatlab workerの正確な数を指定するために使用され、spmd(m,n)のパラメータm,nはworker個数の範囲を表す.
spmd文のstatementsでは、各workerにlabindexの一意の値があり、numlabsはブロックを並列に実行するworkerの総数を表します.
私は18のテスト問題に対して繰り返し試験を行うので、関数spmd(func)を使用して、パラメータlabindexを問題番号として並列に実行することができます.

三、関数スクリプト


新しいpara_を作成func.mのスクリプトファイルは、最初は2つの関数でテストするつもりで、次のコードを入力します.
func = 2;
parpool('local', func);
spmd(func)
    problem = labindex;
    SRSeDEag
end

matlabは、SRSeDEag(line 1)を誤って使用し、透明度が例外的であるというエラーメッセージを示しています.エラーが検出されたら、スクリプトファイルSRSeDEag.mは関数に変更され、クラスタ内の最適値を返します.
function [Best] = SRSeDEag(Problem)

その後para_を変更func.mスクリプトファイルテスト、matlabは再びエラー情報を報告します:
  parpool (line 104)
Found an interactive session. You cannot have multiple interactive sessions open simultaneously. To terminate the existing session, use
'delete(gcp('nocreate'))'.

上記のコードを追加すると、プログラムテストに合格します.para_func.mスクリプトは最終的に:
delete(gcp('nocreate'));
func = 18;
parpool('local', func);
spmd(func)
    problem = labindex;
    Best = SRSeDEag(problem);
end

四、補充


1.spmd関数の戻りタイプはcompositeであり、Best{problem}でアクセスする.
2.デフォルトのlocalパラレルプールのサイズを変更します.ホームページ->環境->Parallel->Manage Cluster Profiles->local(default)->Edit->Properties->Number of workers to start on your local machine、18に変更します.