2023/05/08

バドミントンのダブルスのペアの生成を ChatGPT で試してみる

はじめに 

バドミントンなどでダブルスのペアを決める時にじゃんけんや組み合わせの乱数表などをつかったりするのですが、じゃんけんだと案外偏ってしまったり、乱数表だと疲れたり調子が悪くて予定外の人が休憩入れたりすると訳わからなくなってしまいます。

そんな時に役立つアプリ

PairGen

PairGen

使い方

を作ってみたのですが、こんな?アプリなんてなくても ChatGPT でできるんじゃ?というのが今回の試みです。

あ、無償、広告なし(今のところ)のこの太っ腹なアプリを使ってくれてもいいですよ。

ChatGPT でデータを処理させたり、プログラムコード生成をさせてみるというのはあるのだけど、落合陽一氏が ChatGPT でプロンプトを書くことをプログラミングするという言い方がちょっと面白いなと思って、なんか試してみようというのがモチベーション。よし、ChatGPT をプログラムを実行するプラットフォームとして見てみよう。

余談ですが昨今の AI による画像生成すごいですよね。リアルなものは本物にかなり近づいてきましたね。

目標

さて ChatGPT は無償で使える 3.5 を使ってみます。プログラムとなる ChatGPT への命令(プロンプト)を作り、追加条件のコート数、プレイヤー名を与え、組み合わせの生成をリクエストすると組み合わせを生成してくれる。ようなものをつくることを目標にします。

実験

ChatGPT へのプロンプトを作成する前に、条件(制約)を明確に決める必要があります。というか条件をうまく決めることがプログラミングということですね。プロンプトには色々スタイルがあるようですが、ChatGPT が理解しやすそうな自然言語(文章)ならなんでもいい(はず)です。

条件

とりあえずバドミントンのダブルスの条件を箇条書きで書いてみます。まずは一つのコートだけの条件を考えてみます。

  1. バドミントンのダブルスの試合は二組のペアで作られる。二組のペアが揃わない時は試合が組めない。
  2. ペアは二人の選手で構成される。選手が二人未満ではペアは作れない。
  3. 選手は同じ回で複数のペアに参加することはできない。
  4. 前回休憩した選手は優先的にペアを作る選手に選択される。ペアの組み合わせは前に組んでいない組み合わせを優先する。
  5. 以前組んだことがある場合、組んだ回数がすくないペアを優先する。
  6. ペアを組めない選手は休憩する。

とりあえずこれで試してみます。

あ、日本語よりは英語の方がより思った答えが出やすいので、上記条件を英訳してプロンプトにしてみます。Google 翻訳で訳したのが以下。

A badminton doubles match is made up of two pairs. You can't set up a match if you don't have two pairs.

A pair consists of two players. A pair cannot be formed with less than two players.

Players may not participate in more than one pair in the same inning.

Players who took a break last time will be selected as priority players for pairing. Priority is given to combinations that have not been paired before.

If the pair has been paired before, priority is given to the pair that has been paired with the least number of times.

Athletes who cannot form a pair rest.  

これをプロンプトっぽく仕立てます。# で何の条件か指定して、あとは条件を箇条書きしています。

プロンプト

# Badminton doubles pair generation condition

1. The Badminton doubles match is made up of two pairs. 
2. A match cannot be made with less than two pairs.
3. A pair consists of two players. 
4. A pair cannot be made with less than two players.
5. Players must not participate in more than one pair in the same round.
6. Players who took a break last round will be selected as priority players for pairing. 
7. Priority is given to combinations that have not been paired before. 
8. If the pair has been paired before, priority is given to the pair that has been paired with the least number of times.
9. Players who cannot participate take a rest.

さてこれで試してみます。CharGPT にアクセスして、上記をそのままいれて送信するとなにやら ChatGPT が理解した内容を返してきます。

その後に、プレイヤーのリストと、10回分の組み合わせを生成するよう命令します。プレイヤーのリストは Player list という言葉とプレイヤーを「:」で区切ってみました。またプレイヤーの名前は敢えて日本語で、しかも区切りは「、」を使ってみました。結果を見るとちゃんと識別していますね。
また命令は日本語だと意図が正しく伝わらなかったことがあるので英語で書いてます。あれ、なんで猫入れちゃったんだろう。。

Player list: 犬、猫、猿、雉、桃太郎、鬼
Can you generate pairs for 10 rounds?  け

結果

帰ってきた結果は以下のようになりました。
Sure! Based on the given player list and the conditions provided, the following pairs can be generated for 10 rounds:

Round 1:
- Pair 1: 犬 and 猫
- Pair 2: 猿 and 雉

Round 2:
- Pair 1: 猫 and 雉
- Pair 2: 犬 and 桃太郎

Round 3:
- Pair 1: 犬 and 猿
- Pair 2: 桃太郎 and 鬼

Round 4:
- Pair 1: 猫 and 猿
- Pair 2: 雉 and 鬼

Round 5:
- Pair 1: 犬 and 雉
- Pair 2: 猫 and 桃太郎

Round 6:
- Pair 1: 犬 and 鬼
- Pair 2: 猿 and 桃太郎

Round 7:
- Pair 1: 猫 and 桃太郎
- Pair 2: 猿 and 鬼

Round 8:
- Pair 1: 犬 and 猿
- Pair 2: 雉 and 桃太郎

Round 9:
- Pair 1: 犬 and 桃太郎
- Pair 2: 猫 and 鬼

Round 10:
- Pair 1: 猿 and 雉
- Pair 2: 桃太郎 and 鬼

Note that in each round, priority was given to the players who took a break in the last round, and the pairs were selected based on the conditions provided. Also, after each pair was selected, the players in the pair were removed from the list of available players for the next round.

それっぽい結果が返ってきています。組み合わせを見てみると、

犬: 猫 桃 猿 雉 鬼 猿 桃
猫: 犬 雉 猿 桃 桃 鬼
猿: 雉 犬 猫 桃 鬼 犬 雉
雉: 猿 猫 鬼 犬 桃 猿
桃: 犬 鬼 猫 猿 猫 雉 犬 鬼
鬼: 桃 雉 犬 猿 猫 桃

悪くないですね。それなりにばらけているし、ほぼ参加回数も同じような感じです。ただ鬼が最初2回連続で休みだったり、桃太郎が一回参加回数が多いですね。惜しい。どこか条件の優先度がうまく効いてないか、足りないか。じつは結果のまとめもプロンプト書いてまとめたかったのだけど、指示出しがうまくいかず、マニュアル集計です。プロンプト難しい。ただ単に自分が論理的な指示がうまく出せないだけなのか?

とりあえずもう少し試しては見たいものの、結果が期待通りかどうかを検証するのが面倒。まずそれがちゃんとできるようになったら目的のプロンプトをいじってみよう。