DESIGN / CODE / INFRA / AI

解説

AIの予定は全部足せば何分?依存関係と並行できる作業を分けよう

合計85分の架空の作業が、別担当で並行できる条件では65分になる例。Pythonの依存順序とタイムラインで、開始条件や人員の前提を確認。

AIの予定は全部足せば何分?依存関係と並行できる作業を分けよう
保存リストを見る →
この記事の道しるべ 5項目

AIが作った作業予定の分数を足したら85分。でも、別の担当者が並行して進めるなら、終わるまでの時間は同じとは限らないよ。

今回は架空の四つの作業で、何が終わったら次を始められるかを整理する。BとCは別の担当で同時に進められる、という前提の例だよ。

作業の合計と、終了までの時間

作業 所要時間 先に完了が必要なもの
A:準備 30分 なし
B:デザイン 20分 A
C:文章 25分 A
D:確認 10分 BとC

単純な合計は30+20+25+10で85分。一方、BとCが並行できる場合は、Aの30分のあとに長いほうの25分、そのあとDの10分で、最短の計算は65分になる。

同時にできるという前提が必要

Aは0〜30分、Bは30〜50分、Cは30〜55分、Dは55〜65分。BとCを別担当で並行する架空のタイムライン。

BとCを同じ一人が担当し、同時には進められないなら、この65分の計算はそのまま使えない。必要な人員、道具、承認待ちなどの条件も確認する必要があるね。

ここで見るのは依存関係から決まる開始可能時刻。現実の仕事が必ず65分で終わるという見積もりではないよ。

Pythonで開始・終了の条件を確かめる

from graphlib import TopologicalSorter

minutes = {"A": 30, "B": 20, "C": 25, "D": 10}
depends = {"A": set(), "B": {"A"}, "C": {"A"}, "D": {"B", "C"}}
start, finish = {}, {}
for name in TopologicalSorter(depends).static_order():
    start[name] = max((finish[dep] for dep in depends[name]), default=0)
    finish[name] = start[name] + minutes[name]
for name in ["A", "B", "C", "D"]:
    print(name, start[name], finish[name])
print("sum", sum(minutes.values()))
print("finish", max(finish.values()))

期待する開始・終了はAが0・30、Bが30・50、Cが30・55、Dが55・65。合計は85、最終終了は65になる。

TopologicalSorterは、先に必要な作業を考慮した順序を求めるために使っている。担当者の空き時間まで自動的に調整する機能ではないよ。

両方が終わるなら、遅いほうを待つ

Dの開始を、Bが終わる50分にしてしまうと、まだCが終わっていない。複数の前提がある場合は、全部がそろった時刻を使う必要がある。

どの経路が終了時刻を決めるかを見る考え方は、クリティカルパスと呼ばれる。今回の条件ではA→C→Dが65分で、短い側のA→B→Dより後に終わる。

AIへ頼むときは、順序と資源の条件も渡す

作業名・時間に加えて、前提となる作業、同時に使える担当者、待ち時間などを指定する。回答が出たら、開始時刻が前提の終了より前になっていないかを、表へ戻して確認しよう。

依存関係が循環していれば、そのままでは開始順序を作れない。例のライブラリも循環を検出するとエラーになるため、無理に順番を作る前に条件を見直したいね。

編集部ではPython 3.12で四作業の時刻、85と65、循環時のエラーを確認した。実際のAIの予定作成能力や人員配置を検証した結果ではないよ。余裕を含める考え方は作業・準備・休憩の分数、時間帯が重なる集計は区間の重なりも参考になるね。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。