増井ラボノート コロンブス日和

最終回 発見プログラミング

この記事を読むのに必要な時間:およそ 2 分

「コロンブスの卵」的なシステムをいろいろ紹介してきたこの連載も今回が最終回になりました。コロンブスといえば「発見」ということで,最終回の今回はプログラミングと発見にまつわる話をします。

発想と発見

新しい発想を得るためには人間が時間をかけてやり方を考えたり試行錯誤したりする必要があります。前回紹介した「Scrapbox」は,少しでも関連のある情報を柔軟に思い出しやすくすることによって,発想活動を支援します。もし発想活動の一部でも計算機にやらせることができればアイデアを出す効率がアップするかもしれません。

プログラミングと発見

失敗から何かを発見したというエピソードはたくさんあります。もちろんただ失敗すれば良いというものではなく,たくさんの試行錯誤をした結果,普通と異なる挙動を見いだしたことが発見につながったということでしょう。実はプログラムを動かすことによっても,さまざまな発見ができます。こういう作業を発見的プログラミングと呼ぶことにします。

今回は,前回紹介したScrapboxの上に書いたJavaScriptコードをブラウザで実行してみたいと思います。Scrapboxにはコード記法というものがあり,プログラムなどのテキストデータをブロック表示してファイルとして外部からURLでアクセスできるので,これを使えばScrapbox上に書いたプログラムをブラウザ上で実行できます。CanvasやSVGを利用するとJavaScriptでブラウザ上に絵を描くことはできますが,初期設定などが必要で面倒なところもあるので,描画などを極端に簡単にしたP5.jsというシステムを利用することにします。

数え上げによる答えの発見

算数の問題を解くときは,理屈を使って計算するのが普通です。たとえば「鶴と亀があわせて30匹いて,足の数は全部で100本でした。鶴と亀は何匹いたでしょう?」のような「つるかめ算」を解く場合,⁠全部が鶴だとすると足の数は60本で,全部が亀だとすると120本になるから……」のように算数的に解くやり方もありますし,

  • t+k=30
  • 2t+4k=100

のような1次方程式を使うこともできます。数学の問題はこのように解析的に解くのが普通ですが,図1のような総当たりプログラムを書けば,数学的知識がなくても力技で答を得ることができます。

図1 Scrapboxでつるかめ算を解く(tsurukame.js)

図1 Scrapboxでつるかめ算を解く(tsurukame.js)

つるかめ算を解くのにこういうプログラムを書く人は少ないと思いますが,このような方法のほうが有利な場合もあります。もし問題が「足の数が100本以上でした」のようなものであった場合,1次方程式で普通に解くことはできませんが,上のような方法ならすべての解を網羅できてしまいます。つまり,論理的に解けなくても,簡単なプログラムを書くことによって発見的に解が得られてしまうことになります。

乱数で答えを発見

つるかめ算の場合は解の候補をすべて数え上げれば答えを発見できるはずですが,総当たりで発見が難しい場合は,乱数を使って試行錯誤的に答えを捜すこともできます。たとえば8-Queen問題を解きたいときは,再帰的に解を探索するアルゴリズムを使うのが常識的ですが,ランダムに行や列を入れ換えることを繰り返すだけでも意外と簡単に解を得ることができます。

まずこのようなデータを用意します。

* . . . . . . .
. * . . . . . .
. . * . . . . .
. . . * . . . .
. . . . * . . .
. . . . . * . .
. . . . . . * .
. . . . . . . *

2つの行をランダムに交換してみると,次のように少しだけ良い結果が得られることがあります。

* . . . . . . .
. * . . . . . .
. . . * . . . .
. . * . . . . .
. . . . * . . .
. . . . . * . .
. . . . . . * .
. . . . . . . *

これを何度も繰り返してよさげなものを残していくと,最終的に次のような答えを得ることができます。

. . * . . . . .
* . . . . . . .
. . . . . . * .
. . . . * . . .
. . . . . . . *
. * . . . . . .
. . . * . . . .
. . . . . * . .

人間は数え上げ操作が苦手ですから,8-Queenのような問題に対しては試行錯誤的に取り組んで答えを見つけることが多いですが,試行錯誤を計算機に実行させることによって,解を発見できる場合も多いでしょう。

著者プロフィール

増井俊之(ますいとしゆき)

1959年生まれ。慶應義塾大学環境情報学部教授。ユーザーインターフェースの研究者。東京大学大学院を修了後,富士通半導体事業部に入社。以後,シャープ,米カーネギーメロン大学,ソニーコンピュータサイエンス研究所,産業技術総合研究所,Appleなどで働く。2009年より現職。携帯電話に搭載される日本語予測変換システム『POBox』や,iPhoneの日本語入力システムの開発者として知られる。近著に『スマホに満足してますか? ユーザインターフェースの心理学』。

コメント

コメントの記入