見出し画像

スケジューリング問題を解く⑤-2

⑤-1で書いたグラフをMathematicaのグラフ理論の機能を使うと楽に書けるのですが「2つ以上のグラフを重ねて同じ時間に1人の人しか働けない」というようなリソース制約をつけたりすると自分でキルヒホッフの法則を考えながらコードを書かないとなりません。

これをMathematicaのコードでキルヒホッフの法則を使って書き直すと
Mathematicaにて

1行目で何をMaximize(最大化)させるのかを指定します。
Maximizeで「なるべく早く終わらせたい」ならば
 初日の量*100+翌日の量*10+翌々日の量
を最大化すれば、なるべく早く。つまりフォワードスケジューリングに。
逆に
 初日の量+翌日の量*10+翌々日の量*100
を最大化すれば、なるべく遅く。つまりバックワードスケジューリングに。
そして常にStartとGoalの量は同じにします。そうしないと漏れていきます。

例えばA0B1_AとA1B2_Aは1人日ですから、これと同じ時にA0B2_Bが倍の時間を掛けて2人日で動いていますから全てを足した時に1以下にならないとなりません。表現は色々ありますが例えば
 A0B1_A+A0B2_B<=1
 A1B2_A+A0B2_B<=1

です。(ちょっとコードと違うかも。。。)
この辺りが複数種ネットワーク流の制約になります。
これは楽にネットワーク流を記述出来るPythonのNetworkXでも、Mathematicaのグラフ理論の機能でも再現できません。
(今のところは)

・工場で作らねばならない2種類の製品を間に合わせる。
 ・納期  A:明日 B:明々後日(指定日夜に出来てればいい)
 ・着手可能日 A:今日 B:今日 (材料が来るのが遅い)
 ・必要工数  A:1人日 B:2人日
       (人日=◯人が✕日かかるの意)
 ・作業者は1人しかいない。
 ・いつ、どの順番で着手すれば間に合うか?

の答えは
 初日に 品目Aを着手。完成が明日。
 次の日に品目Bを着手。完成が明々後日。
となります。

この問題程度ならば頭でも解けますが、実際の実務問題になると着手可能日も変わり重なり合う品目の数は何10個、作業者の人数も何10人、そして作業者ごとに可能・不可能のスキル属性も必要になってきます。
そうなると、この方法でないと解けなくなります。

実務上はMathematicaで厳密に計算しなくても、品目別優先順位が経験的に分かりますからExcelでも計算できる事もあります。
(他に方法が無いから、そうせざるをえないのです)

この程度の複雑さの問題なら自力で解けますから、高価なスケジューリングアプリを導入する必要も無いでしょうね。
①でも考えましたがスケジューリング業務に費用を投じても回収できるだけの効果を得るのは大変に難しいんです。

ただ、時系列の目盛りが多くなり、重ね合わせる品目数が増えていくと変数の個数が爆発的に多くなっていきます。
書けないことは無いのですが、Excelで機械的に数式を書かせるなどの工夫が必要になりそうです。私の経験上、クラウドのMathematicaで解こうとすると変数が3,000個を超えた辺りで、Mathematica本体ではなくブラウザの方が耐えきれなくて動かなくなります。
そうなると変数の文字数を短めにするなど、涙ぐましい努力が必要になってきます。

ここまで来ると列生成法をMathematicaで書きたいのですが、これはまだ時間が掛かりそうです。


この記事が気に入ったらサポートをしてみませんか?