主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

並列処理におけるメ@ @クスパンの最小化

この例では,並列で処理される一連のタスクを扱います。各タスクの処理時間はわかっています。メesc escクスパンは,すべてのタスクを処理するのにかかる時間です。以下の図は2のプロセッサを表しています。色付きの各ボックスの高さは,タスクを処理する時間の長さを表します。各タスクの実行時間はプロセッサごとに異なる場合があります。

目的は,メ,クスパンが最小になるよう,プロセッサのタスクをスケジュ,ルすることです。

問題の設定

この例では,11個のプロセッサと40件のタスクがあります。各プロセッサが各タスクを処理する時間は,配列processingTimeで指定します。この例では,ランダムな処理時間を生成します。

rng默认的再现率%numberOfProcessors = 11;numberOfTasks = 40;processingTime = [10;7;2;5;3;4;7;6;4;3;

processingTime (i, j)は,プロセッサがタスクjを処理するのにかかる時間を表します。

0-1整数計画法を使用して問題を解くために,バescナリ最適化変数配列として过程を作成します。ここで,Process (i,j) = 1は,プロセッサがタスクjを処理することを意味します。

Process = optimvar(“过程”、大小(processingTime),“类型”“整数”下界的,0,“UpperBound”1);

各タスクは1のプロセッサだけに割り当てなければなりません。

Assigneachtask = sum(process,1) == 1;

目的を表すため,非負の最適化変数をという名前で定義します。

Makespan = optimvar(“考”下界的, 0);

各プロセッサがタスクを処理するために必要な時間を計算します。

computetime = sum(process.*processingTime,2);

計算した時間をメ@ @クスパンに関連付けます。メesc escクスパンは,計算した各時間以上になります。

Makespanbound = makespan >= computetime;

メesc escクスパンの最小化を目的とする最適化問題を作成し,問題の制約を含めます。

Scheduleproblem = optimproblem(“目标”考);scheduleproblem.Constraints.assigneachtask = assigneachtask;scheduleproblem.Constraints.makespanbound = makespanbound;

問題を解いて解を表示する

通常の表示を行わずに問題を解きます。

选项= optimoptions(scheduleproblem,“显示”“关闭”);[sol,fval,exitflag] = solve(scheduleproblem,“选项”选项)
索尔=带字段的结构:Makespan: 1.3634进程:[11x40 double]
Fval = 1.3634
exitflag = OptimalSolution

返されたexitflagは,ソルバ,によって最適解が見,かったことを示しています。。

返されたメesc escクスパンは1.3634です。これは効率的なスケジュ,ルでしょうか。確認するために,得られたスケジュ,ルを積み重ね棒グラフとして表示します。まず,スケジュ,ルの行列を作成します。行は,プロセッサが処理したタスクを表します。次に,スケジュ,ルの各エントリの処理時間を求めます。

Processval = round(sol.process);Maxlen = max(sum(processval,2));所需矩阵宽度的%现在计算调度矩阵optimalSchedule = 0 (numberOfProcessors,maxlen);ptime = optimalSchedule;i = 1:numberOfProcessors schedi = find(processval(i,:));optimalSchedule(i,1:长度(调度))=调度;ptime(i,1:length(schedi)) = processingTime(i,schedi);结束optimalSchedule
optimalSchedule =11×1025 38 0 0 0 0 0 0 0 0 4 12 23 32 0 0 0 0 0 0 7 13 14 18 31 37 35 0 0 0 0 0 0 0 0 0 0 0 0 0 6 22 39 0 0 0 0 0 0 0 10 26日28日20 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21日24日27日0 0 0 0 0 0 0 8 33 16 0 0 0 0 0 0 0 3 17 34 0 0 0 0 0 0 0⋮

スケジュ,ルの行列を積み重ね棒グラフとして表示します。それぞれの棒の上部にタスク番号のラベルを付けます。

图酒吧(ptime,“堆叠”)包含(的处理器数量) ylabel (的处理时间)标题(“任务分配给处理器”i = 1:尺寸(optimalSchedule, 1)j = 1:尺寸(optimalSchedule, 2)如果optimalSchedule(i,j) > 0 processText = num2str(optimalSchedule(i,j),“% d”);hText = text(i,sum(ptime(i,1:j),2),processText);集(hText,“VerticalAlignment”“顶级”“HorizontalAlignment”“中心”“字形大小”10“颜色”“w”);结束结束结束

图中包含一个轴。标题为Task Assignments to Processors的轴包含50个类型栏、文本的对象。

積み重ね棒のう,高さが最小のものを見けます。これは,プロセッサが最も早く処理を停止することを表します。次に,高さが最大のものに対応するプロセッサを見けます。

Minlength = min(sum(ptime,2))
Minlength = 1.0652
[~,processormaxlength] = max(sum(ptime,2))
Processormaxlength = 7

最小长度= 1.0652の時点までは,すべてのプロセッサが処理中です。積み重ね棒グラフから,この時点でプロセッサ8の処理が停止することがわかります。processormaxlength= 7のプロセッサが最後に処理を停止するプロセッサであり,停止するのは= 1.3634の時点です。

参考

関連するトピック