メインコンテンツへスキップ
見出し画像
Photo byvoice_miwa0401

自分の仕事に数学を道具として使う②アナログ・プロセスマイニング

    まげ店長

    Pythonでもいいけど、ここではMathematicaを選択しましょう。

    今回は生成AIを用いてプロセスマイニングをやりたいので、Mathematicaにはプロセス図を描いてもらいましょう。

    画像
    こんな図を、日本語の文章からさらっと描いて欲しいんですよ
    ChatGPTだとCUIベースの図ならば描けます

    Mathematicaは「数式を計算するアプリ」としての認識が高いと思いますが…? 私自身、Raspberry Pi4を買って触ってみましたが(無償で使える)なかなか小難しいアプリだと思っていました。
    実はプログラムが書けるのですが基本的に、このカッコ[ ]だけで書けます。これが通常の言語とは異なるので敬遠されがちだと思います。


    職場で良ーく起こりそうな問題。これをChatGPT4.0にやってもらいます。

    仕事Aは10分、仕事Bは仕事Aの後でないと着手不能で20分、仕事Cも仕事Aの後でないと着手不能で30分、仕事Bと仕事Cが両方とも完了した後に仕事Dは着手可能で15分。 全部で何分かかりますか? この問題をグラフネットワークを使って図示してください。

    ここで改善すべきボトルネックはBではなくCだと判明します。
    答えは合っていますが…

    全体の時間の計算:仕事A: 10分
    仕事B: 仕事Aの後で20分
    仕事C: 仕事Aの後で30分
    仕事D: 仕事Bと仕事Cの後で15分

    最も遅い経路(クリティカルパス)を考慮する必要があります。
    仕事A → 仕事B → 仕事D: 10分 + 20分 + 15分 = 45分
    仕事A → 仕事C → 仕事D: 10分 + 30分 + 15分 = 55分

    したがって、全体の所要時間は55分となります。

    でも、それを上の文章で理解するのは分かりにくいんです。
    (当然、生成AIにこれを質問すれば答えてはくれます)

    絵を描いてもらうとトンデモナイ才能を遺憾なく発揮してくれます。
    うーん、これじゃないですね。

    画像
    論理は強いが、まだまだ論理の描画が難しい

    そのうち、勝手に綺麗なガントチャートも描いてくれると信じるとして、今はこの辺りはMathematicaにやらせましょう。
    色々と試したけど、Claudeが相性が良い!ですね
    ChatGPTとGeminiのMathematicaコードは動かない!(直せない)


    気を取り直してClaudeに仕事を依頼します。

    仕事Aは10分、仕事Bは仕事Aの後でないと着手不能で20分、仕事Cも仕事Aの後でないと着手不能で30分、仕事Bと仕事Cが両方とも完了した後に仕事Dは着手可能で15分。 全部で何分かかりますか? この問題をMathematicaでグラフネットワークを使ってコード化してください。

    現実の問題を日本語で

    dependenciesが逆のようです

    デバッグ中

    …(何回か続ける)…

    デバッグ中

    こうやってデバッグしますか。なるほど… これは勉強になりました。
    ただ単に怪しいと思った箇所を指摘していけばいいんですね。
    (流石にこれは書けないですよ 時間が勿体ない)

    g = Graph[{
      "Start" -> "A", 
      "A" -> "B", 
      "A" -> "C", 
      "B" -> "D", 
      "C" -> "D", 
      "D" -> "End"
    },
      VertexLabels -> {
        "Start" -> "開始",
        "A" -> "仕事A\n10分",
        "B" -> "仕事B\n20分",
        "C" -> "仕事C\n30分",
        "D" -> "仕事D\n15分",
        "End" -> "終了"
      },
      VertexWeight -> {
        "Start" -> 0, "A" -> 10, "B" -> 20, "C" -> 30, "D" -> 15, "End" -> 0
      },
      EdgeStyle -> Directive[Arrow[0.3]],
      GraphLayout -> "LayeredDigraphEmbedding"
    ];
    
    (* 各作業の終了時間を計算 *)
    endTimes = <|
      "A" -> 10,
      "B" -> 10 + 20,
      "C" -> 10 + 30,
      "D" -> 10 + Max[20, 30] + 15
    |>;
    
    totalTime = Max[Values[endTimes]];
    
    GraphPlot[g, VertexLabeling -> True, 
     PlotLabel -> Row[{"合計時間: ", totalTime, "分"}]]
    画像
    やはり図示される方が分かりやすいですね。
    もちろん、所要時間をこの図の中に書いてもらう事も可能です。

    今回はシンプルなプロセスですが、実際にはかなりグチャグチャなプロセス図になってしまいます。計算は生成AIにやらせ、プロセス図はMathematicaにやらせるのが今考えてる方法です。Mathematicaはプロセスが複雑になった時に、自動的に図形を変形してくれるのが便利です。

    画像
    例えばこんな感じ。位置は勝手に計算してくれます

    PythonのNetworkXでも当然プロセス図を描けるので、そこは使いやすい道具を自分で自由に選んでください。
    ※NetworkXはプロセスの位置をかなり細かく指定できます。逆に言うと指定しないと求めているプロセス図にならない事が多いです。


    CoPilotは頑張ってここまでやってくれます。ChatGPTもこんな感じです。
    複雑になると、CUIベースでは理解できません。

    画像
    一番最初に見たときはこれでも感動しました


     
     
     
    18歳からProlog使い。自分の備忘録。 言語学、数学、量子論 Uボート、エニグマ、ロジスティクス 賤民 東欧、中欧 ユダヤ史 サイレントヒル、SIREN