matlabに実装されたCPLEXの例-RCPSP

matlabに実装されたCPLEXの例-RCPSP

多くの人が実行できないか、不便なので、昨年書いたコードをネットワークディスクに投稿しました。ダウンロードしてご覧ください。実行しただけでコードは問題ありません。リンクと抽出コードを貼り付けます
リンク:https://pan.baidu.com/s/1AQtgE5RIBq8HeMjuxekJCw抽出コード:3g71
昨年、cplexを使用して数学モデルを解きたいと思いました。ブログで模倣する例を​​見つけたいと思いました。演習はできましたが、すべてを見つけることができませんでした。ネット上に適切なものはありませんが、幸いなことに兄弟からのコードがあります。

matlabでCPLEXを呼び出す方法はたくさんあるので、ここでは紹介しません。例に直接。このコードは例としてRCPSPを使用しています。RCPSPに精通している人はそれだけが必要です。RCPSPに精通していない場合は問題ありません。数学モデルを添付します。

リソースに制約のあるプロジェクトスケジューリングの問題の説明:ここに画像の説明を挿入
数学モデル
アタッチコード
%CPLEX matlab実装
%matlab
関数のRCPSPのcplexコードsolution = cplex_function()
%定義されたすべての変数、プロジェクト情報を
グローバルに格納ケース
%想定最大時間
H = sum(Case.dur) ;
%変数binを0に定義します。1値fullは完全な行列、非スパース行列を表します
x = binvar(Case.job_count、H、 'full');
%リソースの上限は定数
r = Caseです。 .Con_R;
%中間変数intを整数値として定義します。整数値は任意の整数にすることができます
C = intvar(1);
%目的関数
Objective = min©;


Constraints = [];
%ジョブ時間の制約
%durはジョブ期間
x2 = sum(x、2);
for i = 1:Case.job_count
Constraints = [Constraints、x2(i)== Case.dur(i)] ;
end
for j = 1:Case.job_count
for i = 1:H
Constraints = [Constraints、x(j、i)* i <= C];
end
end

%precは、ジョブ間の制約を表します%j = 2の
制約の直前と直後
:Case.job_count
Pjj = [];
for jj = 1:j
if(jj〜 = j && Case.prec(jj、j)== 1)
Pjj = [Pjj jj]; index = 1:length(Pjj)の
終了
終了

d = 1:H
last = 0の場合
jの直前のタスクの場合; dd = 1:d-1の場合は
last = last + x (Pjj(index)、dd);
end
Constraints = [Constraints、Case.dur(Pjj(index))x(j、d)<= last];
end
end
end

j = 1:Caseのジョブ期間制約%。 JOB_COUNT
Cases.Timesする:D = 1%
制約= [制約、D
、X(J、D)<= Paras.T]

%端
ジョブが中断することができない%
Case.job_count:J = 1
日間= 1:H-1
dur_instant = 0;
for q = d + 2:H
dur_instant = dur_instant + x(j、q);
end
Constraints = [Constraints、Case.dur(j)* x(j、d)-Case.dur(j)* x(j、d + 1)+ dur_instant <= Case.dur(j)];
end
end
%リソース制約
%rは、d = 1:Hの
場合k = 1:4の
場合の指定されたリソースの数を表し
ますtotal_alloc = 0;
for j = 1:Case.job_count
total_alloc = total_alloc + x(j、d)* Case.res(j、k);
end
Constraints = [Constraints、total_alloc <= r(k)];
end
end
Constraints = [Constraints、0 <C <H];%目的関数の
制約C %制約が作成されます。次は解決プロセスです。すべて同じ
オプション= sdpsettings( 'solver'、 'cplex'、 'showprogress'、1、 'verbose'、2) ;
%これは最大解時間
options.cplex.MaxTime = 36000です。
options.cplex.NodeDisplayInterval = 1;
sol = optimize(Constraints、Objective、options);
if strcmp(sol.info、 'Successfullysolved(CPLEX-IBM)')== true
solution.Objective = value(Objective);
display(solution.Objective);
solution.feasibility = '実行可能'
solution.info = sol.info;
solution.x = value©;
for j = 1:Case.job_count
for t = 1:H
if(double(x(j、t))== 1)
solution.st(j)= t;
ブレーク;
エンド
エンド
エンド

elseif strcmp(sol.info、 '最大反復回数または制限時間を超えました(CPLEX-IBM)')== true
solution.Objective = value(Objective);
display(solution.Objective);
solution.feasibility = '不明';
solution.info = sol.info;
else
solution.feasibility = '実行不可能';
solution.solvertime = sol.solvertime;
solution.x = value©;
終わり

このコードが快適に見える場合は、次のWebページをクリックしてコードをダウンロードできます。直接コピーすることをお勧めします。ダウンロード後、中国語の説明が文字化けします
[1]:https://github.com/XXUZEXIN/CPLEX。ギット

おすすめ

転載: blog.csdn.net/qq_39158406/article/details/90765051