お知らせ
お知らせ
CLOSE

生成AIが切り開く数理最適化(全1記事)

2025.12.24

Brand Topics

PR

鉄道ダイヤの最適化に学ぶ、生成AI活用 複雑なビジネス課題をチャットボットで前に進めるポイント [2/2]

提供:Gurobi Optimization inc.

鉄道時刻表の最適化問題を解くプロセス

今日は1つの例として、私とGurobotの対話を紹介します。題材は鉄道の時刻の最適化です。

問題はこんな感じで書きます。問題設定はすごくシンプルですが、A、B、Cという3つの駅があり、上りと下りの区間があります。これは全部単線ですね。上りと下りと書いていますが、線路は1本だけで単線区間になっています。

上り電車が2本、下り電車が1本あります。走る速度はすべての電車で同じとし、AとBの間は10分で移動、BとCの間は15分で移動するという設定です。

駅に停まる時間は3分です。仕様として設定する条件が少し多い感じがしますが、A、B、Cの停車時間は3分とします。B駅は上りホームと下りホームが1つずつ、AとCはホームが1つしかないので、2本の電車は同時には停まれません。

やってほしいことは、最後の電車がなるべく早く到着駅を出るような時刻表を作ってくださいという問題設定です。

規模はぜんぜん違いますが、東京の都内の電車は過密ダイヤで、たくさん電車を走らせるためにいろいろ押し込んでいるような感じがあります。ここでも、たくさんの電車を押し込まなければいけないような状況を考えています。

これを数理モデルで書きます。人間の視点でまず考えると、3本の電車、上り2本と下り1本について、各電車の到着時刻と出発時刻を変数にします。各駅の出発時刻は、到着時刻の3分後以降にするとします。

前の駅の出発時刻から次の駅の到着時刻までは、移動時間で決まります。例えばA駅を出発する上り電車は、A駅の出発時刻に10分を足したものがB駅の到着時刻になります。

制約条件を踏まえて数式を作る

ここでちょっと問題になるのが、始発駅と終着駅、A駅とC駅です。A駅とC駅は始発駅と終着駅ですが、他の電車と時刻が重ならないようにする必要があります。また、途中駅では同じ方向の電車の時刻が重ならないようにします。

2つの駅の間では、他の電車と時刻が被らないようにします。上り電車と下り電車が同時に運行することがないようにする必要があります。

もちろん私の視点から見ると、上の3つは比較的数式を考えやすいと思います。ただ、この離接制約という「OR」の制約は、知らないとちょっと難しいかなと思います。

今お話ししたことを数式で書くと、電車ごとに到着時刻と出発時刻を表現するために、到着時刻を表す「TimeArr(タイムアライブ)」と、出発時刻を表す「TimeDep(タイムデパーチャー)」という変数を用意します。そこに電車の識別子と駅の識別子を入れます。まずこういった変数が必要だろうと思います。

各駅の出発時刻と到着時刻には「3分後以降に出発する」という条件があります。駅に到着した時刻に3分足したものが次の出発時刻になります、という制約です。

わかりづらいところが出てきた時は、Gurobotが説明

さらに、前の駅の出発時刻に移動時間を足して到着時刻にする制約を書きます。「station1」から「station2」に移動する場合、「station1」の出発時刻に移動時間を足したものが次の駅の到着時間になります。このあたりの数式は特に不思議なところはなく、比較的簡単に書けると思います。

ここで、「3番目の、残りの離接制約の部分が少しわからないので、書き方を教えてください」という質問をGurobotに投げてみます。

実際にこんな質問をGurobotにすると、「こういう制約式を書けばいいですよ」「この制約式の意味はこういう意味ですよ」といった答えを返してくれます。
でも、数式が出てくるとちょっとわかりづらい場合があると思います。そこで「時刻表のイメージで、ここで書いた制約式をわかりやすく説明してください」と質問してみます。そうすると、重ならない場合の条件と、重なる場合のNG(の条件)がこの下に連なっているのですが、「こういう条件を表現する制約なんですよ」という説明をしてくれます。

制約式を読んでわかれば問題ありませんが、「ちょっとわかりづらいな」という時には、その制約式が何を意味しているかをGurobotに聞くことで、より詳細でわかりやすい説明を得ることができます。

実際、Gurobotの中ではGurobiの評価ライセンスではなく、pipライセンスが動きます。あまり大規模な数理モデルの実行はできませんが、比較的小さい数理モデルであれば、Gurobotの中で最適化を行い、プログラムを実行して結果を見ることができます。

問題文だけを渡してプログラムを作ってもらうことも可能

今は人間がだいたいわかるので、(先ほどは)わからないところだけ聞くという使い方をしました。「最初からわからないので、問題文をそのまま渡すとどうなるか」という使い方もできます。

先ほどのスライドにあった問題文を入力してみます。すると、Gurobotのほうから質問してきます。「始発駅と終着駅の関係はこういう関係でいいですか?」といった質問です。

その質問に対して、人間のほうで「1はそのとおりです」「2は決めていいです」「3はそのとおりです」「4もそのとおりです」といったかたちで答えると、このように実際の答えを言葉で表示してくれます。

さらに、簡単な図のようなものも出してきます。参照してほしいKB(ナレッジベース)ですね。「このリンクを見るといいと思いますよ」というナレッジベースのリンクも提示してくれます。

また、実際にGurobotの中で作ったプログラムも添付されます。このようなプログラムが入手できます。

最近のGurobotはかなり改良されていて、コメントも入れてくれるので、わかりやすいプログラムになっています。ちょっと見てわからないところがあれば、再度Gurobotに質問するといいのかなと思います。

答えを検証したい時や、よりわかりやすい表現への調整にも対応

今ちょうど答えを見て、上り区間と下り区間がどこかで衝突しているんじゃないかという答えが出てきたのですが、少しおかしいかもしれないと思い、「なんか重なっていませんか?」という質問をすると、Gurobotのほうで答えの検証を行ってくれます。

「前の電車が出てから次の電車が到着するまで1分空ける」と条件を追加し、その条件を満たす答えをGurobotが作って、わかりやすく答えが出るように調整してくれることもあります。

ここはGurobotに限らず、生成AI全般のいいところだと思います。出てきた答えをわかりやすいかたちで見たいということがあります。データなどだけで見ると、なかなかわかりやすくありません。「わかりやすいかたちで表現してほしい」ということがあると思います。

これはデータの確認、出た答えの確認に非常に有用だと思います。そういったことをGurobotに依頼すると、このように時刻表を作ってくれます。これを見ると、答えが合っているのか合っていないのかがわかります。このような使い方もできます。

チャットボットをうまく使うためのポイント

こちらは「数理モデルを教えて」ということで、数理モデルの説明をしてもらった例です。このあたりの説明はかなり難解な部分もあると思いますが、連続変数を設定したり、先ほどの離接制約を表現するために0-1(ゼロイチ)の変数を作ったりして、「こういうモデルを作っています」とGurobotが説明してくれます。

使ってみて感じるのは、やはりGurobotで作ったプログラムが、みなさまが考えているプログラムをすべて包含できるわけではないということです。ただ、最初のプロトタイプを作る時には、非常に高速にプログラムを書いてくれるので、とても便利かなと思います。

3つ目として、Gurobotに限らずですが、答えの検証は基本的に人手で行う必要があります。どこかを間違えていることもありますし、制約条件を見落としていることもあります。そういったチェックが必要です。

また、数理モデルの解き方は必ずしも1通りではないので、「もっと他のやり方はありませんか?」と聞いてみてもいいと思います。

最後はちょっと感想なんですけど。問題を与える時は、あまり長い文章で与えると間違える可能性が高いかなと感じています。私が書いた例のように、なるべく短い文で与えるほうがいいかなと思います。

現在は、特に会社の意思決定者向けに、Gurobiに関する記事を書いています。これからは専門家向けの記事も増やしていきたいと思っています。こういったブログサイトがGurobiの中にありますので、機会があれば参照していただけると幸いです。

以上で私からの発表は終わりにします。

(会場拍手)

続きを読むには会員登録
(無料)が必要です。

会員登録していただくと、すべての記事が制限なく閲覧でき、
スピーカーフォローや記事のブックマークなど、便利な機能がご利用いただけます。

無料会員登録

すでに会員の方はこちらからログイン

または

名刺アプリ「Eightをご利用中の方は
こちらを読み込むだけで、すぐに記事が読めます!

スマホで読み込んで
ログインまたは登録作業をスキップ

名刺アプリ「Eight」をご利用中の方は

デジタル名刺で
ログインまたは会員登録

ボタンをタップするだけで

すぐに記事が読めます!

関連タグ:

この記事のスピーカー

同じログの記事

この記事をブックマークすると、同じログの新着記事をマイページでお知らせします

コミュニティ情報

Brand Topics

Brand Topics

人気の記事

    新着イベント

      ログミーBusinessに
      記事掲載しませんか?

      イベント・インタビュー・対談 etc.

      “編集しない編集”で、
      スピーカーの「意図をそのまま」お届け!