このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,並列で処理される一連のタスクを扱います。各タスクの処理時間はわかっています。メ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”);结束结束结束
積み重ね棒のう,高さが最小のものを見けます。これは,プロセッサが最も早く処理を停止することを表します。次に,高さが最大のものに対応するプロセッサを見けます。
Minlength = min(sum(ptime,2))
Minlength = 1.0652
[~,processormaxlength] = max(sum(ptime,2))
Processormaxlength = 7
最小长度
= 1.0652の時点までは,すべてのプロセッサが処理中です。積み重ね棒グラフから,この時点でプロセッサ8の処理が停止することがわかります。processormaxlength
= 7のプロセッサが最後に処理を停止するプロセッサであり,停止するのは考
= 1.3634の時点です。