学校のクラブ活動や、仲間うちで遊びに行くときなど、自動車の乗りあわせを決めるのに苦労することがあります。誰がどの車に乗るのか決めるだけなのですが、ランダムに決めることはできません。物事はそう単純ではないのです。そこで、バイブコーディングで、乗りあわせを行うツールを作ってみましょう。

  • 今回作った自動車の乗りあわせ決定ツール

    今回作った自動車の乗りあわせ決定ツール

乗りあわせツールの仕様を決めよう - なぜ難しいのか?

自動車の乗りあわせを決めるのは、なかなか難しいものです。既に紹介したように、単純にランダムに決めることができないからです。

まず、ドライバー同士は同じ車に乗れませんし、ドライバーの家族は同じ車にしないといけません。また、いつも同じメンバーが参加するわけではないですし、何らかの都合で、この人とこの人は、一緒にしないといけないということもあります。さらに、ドライバーが体調不良になり、組合せを直前で変更する必要がある場合もあります。

そんなわけで、乗りあわせを決める担当になったら結構大変だということが分かるでしょう。

アプリの仕様を決定しよう

最初に決めるのは、どんな仕様にするのかという点です。今回作る乗りあわせツールでは、最初に参加者リストを用意しておいて、必要に応じて、リストから参加者を追加削除できるものにしてみます。

なお、ドライバーとその家族が同じ車になるようにします。そのために、名簿にグループ属性を持たせます。同じグループは必ず、同じ車になるようにします。ただし、ドライバーに対して、車が余る場合もあるので、その場合は、積極的にドライバー同士を組にします。

そして、家族以外の流動可能なメンバーが、なるべく被らないようにも配慮します。組合せの履歴を残しておいて、次に乗りあわせを決めるときには、できるだけ、異なる乗りあわせになるようにします。そのため、何度か仮の組合せを出力するようにして、完全決定したら、組合せを記録するようにします。こうして、条件を列挙してみると、やはり、結構複雑です。

それでは、次のようなプロンプト(指示書)を作って、生成AIに、組合せ決定アルゴリズムを考えてもらいましょう。いきなり、バイブコーディングを始める前に、ChatGPTやGemini、Claudeに相談してみます。

これから、名簿を元にして自動車の乗りあわせを決めるツールを作ります。
次の条件を満たす組合せを決める手順を考えてください。

絶対条件:
- 自動車には最大4人乗れる
- ドライバー同士は同じ車に乗れない
- 家族は必ず同じ車にする
- 家族が異なる男女を2人だけにしない
- 自動車の数はできるだけ少なくする
- 車の乗車人数が不均等にならないように配慮する
できれば満たしたい条件:
- ドライバーが多ければ、ドライバー同士を同じペアにできる
- 組合せの履歴を記録しておいて、できるだけ違う人と組合せになるようにする

今回、ChatGPTのThinkingモードに上記のプロンプトを与えると、次のようなアイデアを出してくれました。

まず名簿の各人をそのまま扱うのではなく、家族単位のグループに変換します。 その後で、以下の作業を行います。

1. 絶対条件を満たせるか事前チェック
2. 車の台数を決める
3. ドライバーを各車に1人ずつ配置
4. 残りの家族グループを順に割り当て
5. 違反が出たら組み替え
6. 履歴や希望条件で点数を付けて最良案を選ぶ

そして、ChatGPTは、作るべき名簿のカラムなどを設計し、擬似的なプログラムコードも出してくれました。どうやら、これだけの材料が揃えばうまく行きそうです。

  • ChatGPTの相談結果

    ChatGPTの相談結果

どんな技術を使うか?

次に決めるのは、このアプリをどんな技術を使ってつくるのかという点です。今回は、自分だけが使うのではなく、仲間うちで名簿をシェアして使いたいので、ブラウザから気軽に使えるWebアプリにしてみましょう。

どんなプログラミング言語でも、大抵Webアプリを作ることができます。しかし、サーバーにファイルをアップロードすれば、すぐに動かすことができるという点で、今回は、PHPで作ってみましょう。組合せの履歴は、JSON形式でファイルに保存していくことにします。

また、無料でバイブコーディングが実践できる、Google Antigravityを利用して作ってみましょう。Antigravityはこちらからダウンロードできます。

  • AntigravityのWebサイト

    AntigravityのWebサイト

なお、Antigravityのインストールや設定に関しては、本連載の11回目を参照してください。

アプリを作成するプロンプトを作ろう

なお、ここまで見てきたように、自動車の乗りあわせツールは、それなりに仕様が大きいプロジェクトになります。そこで、フォルダを作って、そこに、AGENTS.mdという指示書(プロンプト)ファイルを作成して、そこに、今回作るツールの全貌を書き記すことにします。

ここでは、AGENTS.mdには、次のような内容を書き記しました。

# 車の乗りあわせ決定ツール

## 概要

名簿を元にして自動車の乗りあわせを決めるツールです。
PHPを使ってWebアプリケーションとして実装してください。ただし、データベースを使わず、CSV/JSONファイルでデータを保存してください。

## 乗りあわせ決定の条件

次の条件を満たす組合せを決めます。

絶対条件:
- 自動車には最大4人乗れる
- ドライバー同士は同じ車に乗れない
- 家族は必ず同じ車にしてください
- 家族が異なる男女を2人だけにしない
- 自動車の数はできるだけ少なくなるように配車する
- 車の乗車人数が不均等にならないように配慮する

できれば満たしたい条件:
- ドライバーが多ければ、ドライバー同士を同じペアにできる
- 組合せの履歴を記録しておいて、できるだけ違う人と組合せになるようにする
-  1人だけ、または、その家族だけの組がなくなるように配慮する

## 名簿リスト

名簿リストは、次のようなフィールドを持つCSVファイルで与えられます。ファイルは、`data/list.csv`に保存してください。

- 名前
- 家族ID
- 性別
- ドライバーかどうか
- 参加回数

## 画面

PHPで次の画面を実装してください。

### ログイン画面(login)

- ユーザー名とパスワードを入力するフォームです。
- それほど重要な情報ではないので、パスワードは平文で保存するものとします。
- ユーザー名とパスワードは、`data/admin.json`を参照するものとします。次のようなJSON形式のものにします。

{
    "admin1": "password",
    "admin2": "password"
}

### マスター名簿の編集画面(edit_list)

- 名簿を入力するフォームです。
- 上記の名簿を追加・編集・削除できるものにします。

### 今回の参加者選択画面(select_members)

- 名簿から今回の参加者を選択する画面です。
- 参加回数の多い人から順に表示し、チェックボックスで選択できるようにします。
- 決定ボタンを選んだら、乗りあわせ決定画面に遷移します。
- 「名前」と「参加回数」などでソートできるようにしてください(JavaScriptで実現)

### 乗りあわせ決定画面(pairing)

- 参加者リストから、乗りあわせを決定し、候補を表示します。
- 「もう一回」ボタンを押すと、別の候補を表示します。
- 「決定」ボタンを押したら、組合せを履歴`data/history.json`に保存します。
- また、マスター名簿の参加回数を+1します。
- 決定したら履歴画面に遷移します

### 履歴画面(history)

- 最新の組合せは大きくpairing画面と同じものを表示します
- 過去の組合せ(最大5個)は箇条書きのみで表示します


## PHPのルール

PHPはHTMLとプログラムが混ざるとメンテナンス性が悪くなるので、ロジックのPHP(logic/)と、表示用のPHP(templates/)は分離してください。メインプログラムは`index.php`としてください。

ApacheサーバーとPHPの組合せで動くWebアプリケーションとして実装してください。データフォルダ`data`は、`.htaccess`を使ってWebからアクセスできないようにしてください。

## 備考

- 組合せにかかった時間を表示するようにしてください。
- 実装計画書は日本語で作成し、日本語で回答してください。

そして、Antigravityの画面右側にあるチャット欄に「AGENTS.mdを元にして、プログラムを作ってください。」と入力します。そして、そのすぐ下のツールが「Planning」になっていることを確認して、送信ボタン(→)を押します。なお、モデルは、Gemini 3.1 Pro (High)を選んでみました。

すると、Antigravityが、実装計画を作成してくれます。計画を確認して、問題なさそうならば「実装してください」と入力して送信します。

  • Antigravityが作成した実装計画

    Antigravityが作成した実装計画

しばらく待っていると、プログラムが完成します。筆者の場合、4分ほどでプログラムが完成しました。

PHPをインストールして実行しよう

今回のアプリは、PHPで作るようにと指示したので、実際にアプリを実行するには、PHPが必要です。PHPのインストール方法に関しては、本連載の7回目を参照してください。

ちなみに、Windowsの場合で、今回のようにちょっとしたツールを作るだけであれば、PHP本家のこちらからダウンロードして、解凍するだけでも十分でしょう。

テスト実行してみよう

PHPのビルトインサーバーを使って、プログラムを実行するには、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、次のコマンドを実行します。

# プロジェクトのフォルダに移動
cd ここにプロジェクトフォルダのパスを入力
# サーバーを起動
php -S localhost:8888

そして、ブラウザで http://localhost:8888 にアクセスすると、プログラムを試すことができます。

  • PHPのビルトインサーバーで実行したところ

    PHPのビルトインサーバーで実行したところ

なお、実行してみると、ブラウザやターミナルにエラーメッセージが表示される場合があります。その場合は、Antigravityのチャットに貼り付けて、修正をお願いします。すると、すぐにプログラムを修正してくれます。

デザインなど、いくつか修正をお願いすると、次のようにツールが完成しました。AGENTS.mdで指定した画面が思った通りに実装されました。

  • ログイン画面 - パスワードは設定ファイルに指定する

    ログイン画面 - パスワードは設定ファイルに指定する

  • 名簿の編集画面 - 登録と削除ができる

    名簿の編集画面 - 登録と削除ができる

  • 参加者選択画面 - 今回の参加者を選ぶ

    参加者選択画面 - 今回の参加者を選ぶ

  • 乗りあわせ決定画面 - 決定すると履歴が保存される

    乗りあわせ決定画面 - 決定すると履歴が保存される

今回作成したプログラムは、こちらにアップロードしてありますので、興味のある方は見てみてください。

改造してみよう

一通りプログラムが完成したら、少しずつ改良してみましょう。特に、今回は、プログラムの簡易化のために、ログイン画面では、固定のユーザー名とパスワードを入力するようにしていましたが、パスワードを平文ではなく、ハッシュ化して保存するようにしたり、ユーザーが自身でパスワードを変更できるようにすると良いでしょう。

また、自動車には固定で4人しか乗れないという制約を作りましたが、実際には、車種によっては、もっと乗れる車もありますので、ドライバー登録の時に、最大乗車人数を指定できるように改良するのも良いでしょう。さらに、仮の組合せが出てから、手動で2人を選択して交換できるようにすると、もっと実用的になるでしょう。

まとめ

以上、今回は、Antigravityを使って、自動車の乗りあわせツールを作成してみました。仕様を「AGENTS.md」に書いて「プログラムを作って欲しい」とチャット画面に指示するだけでアプリが完成します。

とても簡単に見えますが、実際に思い通りのアプリが完成するかどうかは、指示書である「AGENTS.md」の書き方次第です。しっかりと何をしたいのかを明確に伝えることが重要です。フワッとした指示しかしないと、思い通りになりません。特に、今回のように、乗りあわせの複雑なルールがある場合は、そのルールを矛盾することなく指定することが大切になります。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。これまで50冊以上の技術書を執筆した。直近では、「大規模言語モデルを使いこなすためのプロンプトエンジニアリングの教科書(マイナビ出版)」「Pythonでつくるデスクトップアプリ(ソシム)」「実践力を身につける Pythonの教科書 第2版」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」など。