球面上の最も離れた点
球面上で最も離れた点の配置は、どんな形をしているでしょうか?
例えば地球のような球面の上で、お互いに反発し合う磁石のような点を幾つか置いたとすると、磁石はどの位置で落ち着くでしょうか?
(反発する磁力は地面の中は通らず、球の表面を通じて働くものとします。)
磁石が2個なら話は簡単で、北極と南極のように、ちょうど反対の位置にくるでしょう。
磁石が3個だったら、赤道の上で正三角形を成すような形に置かれることでしょう。
磁石が4個だったなら、正4面体の頂点を成すような形に置かれることでしょう。
磁石が5個だったら?
・・・簡単にはわからないでしょう。
磁石が6個だったなら、正8面体の頂点を成すような形に置かれることでしょう。
磁石が7個だったら?
・・・これは、かなりの難問ではないでしょうか?
そこで、プログラムを作って試してみることにしました。
* 球面上の最も離れた点 Java applet >> http://brownian.motion.ne.jp/memo/Hello3D_Sphere6/
・プログラム・ソース >> http://brownian.motion.ne.jp/memo/Hello3D_Sphere6/Hello3D_Sphere6.java
・N=4、局所解
しかしながら、何度もプログラムを実行すると、まれにこんな形になることがあります。
磁石が1平面上に、正方形に並んでいます。
本当は正4面体が最も離れた形なのでしょうけれど、たまたまぴったり正方形に並んだ場合、
そこでつりあいがとれて、動きが止まってしまうのです。
この状態から、ほんの少しでもずれが生じれば正4面体に移行すると思うのですが、
とにかくこのプログラムでは「途中でひっかかって止まる」ことが起こり得るわけです。
・N=5
磁石が5個の場合は、こんな形になりました。
1個が北極、もう1個が南極、残りの3個が赤道上で正三角形。
・N=5、局所解
磁石が5個の場合でも、1平面上に、5角形に並ぶことがありました。
たまにしか出ませんけど。
・N=7
さて、これが問題の、磁石が7個の場合です。
1個が北極、1個が南極、残りの5つは赤道付近にあるのですが、完全に赤道上には並びません。
赤道付近の5個のうち、3個が北半球寄りに、残る2個が南半球寄りに位置します。
5つの点に順番に番号を付けるなら、1番,3番,4番が北半球寄り、2番,5番が南半球寄りです。
アプレットをマウスでぐりぐり回してみれば、なんとなくわかると思います。
・N=9
ええと、見てのとおりなんですけど・・・何と説明すればいいのだろうか。
・N=12 -- 局所解
しかしながら、12個の磁石はいつでも必ず正20面体になるとは限りませんでした。
しばし「途中で引っかかって」、中途半端な形に落ち着くことが起こります。
途中でひっかかる率は「磁石の反発力の強さ」によって変わってきます。
反発力をギリギリまで強くすると、途中で引っかからずに正20面体になることが多くなります。
逆に反発力を弱くすると、途中で引っかかって中途半端な形になることが多くなります。
磁石の数が増えてゆくと、どうやらこの「途中で引っかかる」現象が本格的に立ち現われてくるようです。
磁石がお互いに反発しあって動くと、唯一の答に向かって滑らかに移行するのではなくて、
途中に幾つかの「引っかかり」があるのではないか。
答は唯一ではなくて、中途半端な局所解が幾つかあるのではないだろうか・・・そんな風に私は予想しています。
(誰か、知っている人いる?)
・N=20
磁石が20個の場合、予想される答は正12面体です。
しかしながら、このプログラムの結果は正12面体にはなりませんでした。
正20面体であれば、面の形が5角形になるはずです。
上の結果はそれとは違います。それなりの形にはなっていると思うのですが・・・
これも1つの局所解なのだろうか、それともプログラムが悪いのか・・・
よくわかりません。もっとよく調べないと。
これもN=20の、別の結果です。
さっきのものとは、また少し違っているように見えます。
・N=100
プログラム自体は、磁石が100個であっても動作します。
N=20の場合に正多面体にはならなかったので、それ以上の数では、
もはや最良の答になっているという保証はありません。
磁石がそれなりに散らばっている、といった感じです。
おまけ:
今回のプログラムを作っている途中でできたおまけです。
見た目にはこっちの方がきれいですね。
* 球面上を流れる点 Java applet >> http://brownian.motion.ne.jp/memo/Hello3D_Sphere4/
・プログラム・ソース >> http://brownian.motion.ne.jp/memo/Hello3D_Sphere4/Hello3D_Sphere4.java