パズルの作問について

 独創のプログラミング
 「万が一理論」のプログラミング手法について


 ここで、今回公開したこれらのパズルの作問の手法について少しだけ解説する。
近年パソコンが普及し性能の高い物が自由に使えるようになり、これまでは出来なかったような事がプログラム次第で色々と可能になってきた。
 「万が一理論」はパソコンの出始めの頃から、私が20年来温めているプログラミング理論である。
 メインクロックが1GHz超の昨今のパソコンの世界では「万が一」(1万回に1回)の事が毎秒10万回も起こっている。人間にとっての「万が一」は不可能とか滅多にないというイメージであるが、パソコンの世界では「万が一」は一秒間に10万回も起こる。極めて日常的に当たり前に起こる事象という事になる。
 つまり、人間が一生掛けても実現出来なかったような事が、「万が一」でも出来る可能性があればパソコンの世界ではできると言う事である。
 私が最初にこのプログラミング手法を考えたのは今から20年程前の事である。
高校で電気基礎という教科を教えているときに、生徒が最初につまずく「キルヒホッフの法則」という単元がある。生徒は法則自体はすぐに理解して3元1次連立方程式を作ることが出来るようになるのだがその計算が出来ない。基本的には中学の数学で解ける方程式だが、半数以上の生徒が計算途中の小数や分数の計算で間違えたりして、お手上げの状態になってしまう状況だった。本当は計算が出来ないだけなのに、結果的に「キルヒホッフの法則」は難しくて理解出来なかったという印象を生徒が持ってしまうのが非常に残念だったので、出来るだけ途中の計算が簡単な問題を作問しようと考えて、答えが簡単な整数になる問題を自動的にたくさん作れないかと考えたときに思い付いたのがこのプログラミング手法である。

 具体的な例を挙げて説明すると

 例えば未知数X,Y,Zの3元1次連立方程式の問題を作問するとしよう。
易しい問題にして途中の計算が簡単になるように答えが1,2,3などの単純な整数になるような問題を作りたい。
X,Y,Zの係数をあらかじめ適当に決めて
  3X+4Y+5Z=a
  4X−2Y+6Z=b
 −2X+3Y+2Z=c
とする。
次に、答えをX=1,Y=2,Z=3と決めて a,b,cを求めると
  a= 3×1+4×2+5×3=26
  b= 4×1−2×2+6×3=18
  c=−2×1+3×2+2×3=10
となるので
  3X+4Y+5Z=26
  4X−2Y+6Z=18
 −2X+3Y+2Z=10
 このように、はじめに答えを特定の整数の数値に決めておいてから式を作ればとりあえず当初の目的を満足する問題が一問出来るので、「世の中に目的とする形の問題は存在している」と言える。

 このような作問法は一般的なプログラミングの手法であるが、「万が一理論」のプログラミングでは「世の中に目的とする形の問題は存在している」と言う点に着目してプログラムのアルゴリズムを考える。
 X,Y,Zにかかるすべての係数を乱数で全く無作為に設定し行列式で計算し答えをチェックする。そして、その答えが「3つとも整数になった時に完成」と言うアルゴリズムを組む。いつ出来上がるかは分からないが、前述の式のように「世の中に目的とする形の問題は存在している」ので何万回、何億回試行したとしてもいつかは必ず出来る。
 このプログラムで100問程問題を作り実際に授業で使ってみたところ途中の計算が簡単なのでほとんどの生徒が自分の力で解けるようになった。自分の力で答えを出すことが出来たという正解のよろこびはその後の学習にも非常に大きく良い影響を与える。現在でも使っている最初の実用的な「万が一理論」のプログラムである。そのプログラムは当時の東京都工業高等学校電気教育研究会で発表した。
 このようなプログラムでも、パソコンの性能がどんどん向上しているので結果が出るまでの時間もどんどん私達の生活時間に近づいてきた。これまでのプログラムミングは一行でも短く1秒でも早く情報を処理できるようなアルゴリズムが要求されていた。それに対し「万が一理論」ではあえて遠回りをしながら「万が一」の可能性を模索する。予め作為的に色々な要素を設定しないので出来上がった問題が非常に新鮮である。「万が一理論」によるプログラミングは一見邪道のようなプログラミング手法であるが、現在のようにパソコンの性能がどんどん向上していく中で十分実用的な新しいプログラミング理論として面白いのではないかと思う。
「万が一理論」では、ルールに合った問題を作ると言う以外の作為的な指示は一切与えていないので、どんな問題が出来上がるかは(またはルールによっては出来ないかも含めて)プログラム制作者にとってもまったくの未知数なのだ。
 今回の5種類の新作パズルも「万が一理論」で作成した。これからも「万が一理論」のプログラミング手法から実用的な物を生み出す「ものづくり」の可能性を追究していきたい。
 
                                      2006.2.3 菅野正人

     戻る