第1講 計算パズル集 レポート(抜粋)
□ 小町算□ ナルシスティック数(ナルシスト数)
ナルシスト数は有限個しか存在しない(最大61桁)ことは簡単に証明できます。
意外と簡単にすべてのナルシスト数を求めることができました。(簡単な枝刈と多倍長演算処理が必要)
ソースプログラム : les01-ex03-HPI
実行結果 : les01-ex03-HPI-N61-log
□ スターリングの公式
単純な計算では、オーバフローやアンダーフローが発生して精度良く求めることが難しく、工夫が必要です。(これが出題の意図)
多倍長演算ライブラリを使うのが普通ですが、ちょっと別のアプローチをしてみました。
ソースプログラム : les01-ex04 les01-ex04-99(近似式版)
実行結果 : les01-ex04-log les01-ex04-99-log
平方根を求める漸化式には、良く知られたニュートン法の漸化式(2次のオーダーで収束)があります。
これより、収束の速い漸化式は作れないのだろうかということで、少し考えて得られたのが、レポートに記載した方法です。
このアプローチは、一般のn次方程式の根を求める漸化式を導くことができます。
また、授業では、ニュートン法の2次関数近似を用いた漸化式(3次のオーダーで収束)を学びました。
この方法は、2次方程式を解くため平方根を求めます。そのため、初期値によっては虚数になることもありちょっと面倒です。
□ 立方根を求める漸化式
平方根と同じアプローチで3次のオーダーで収束する新しい漸化式を作ってみました。
それとニュートン法(2次のオーダーで収束)の漸化式との比較をおこないました。
ソースプログラム : les02-ex98
実行結果 : les02-ex98-log
ソースプログラム : les02-ex04 (ニュートン法による2次関数近似)
実行結果 : les02-ex04-log
□ 方程式 X**3 - X + 1 = 0 の根を求める漸化式
同じアプローチで3次のオーダーで収束する漸化式を作ってみました。
それとニュートン法(2次のオーダーで収束)の漸化式との比較をおこないました。
ソースプログラム : les02-ex97
実行結果 : les02-ex97-log
補足:M.HiroiさんのHP(2013.09.29のMemorandum)で平方根の話があり、仙波先生のHPを参考文献にあげられています。
そのとき、M.Hiroiさんから漸化式に関する論文(deepgreenと同じ漸化式)を教えていただきました。また、計算量という観点から、新しい漸化式とニュートン法(1次近似)とを比較すると、ニュートン法が優位という指摘をいただきました。この点はdeepgreenも納得です。
deepgreenは、floating演算を使うのは大学の演習以来で数十年ぶりです。当時を懐かしく思いだしたりしました。
第3〜6講 部分集合生成問題、順列生成の開発T、U、V レポート(抜粋:その1、その2)
このあたりの講義は、Solver開発で良く使われる関数なので目新しい話はありません。ほんの少し補足しておきます。 Hyper-Robot Solver(4体)
簡単な説明 : Hyper-Robot-Solver
ソースプログラム : HR-max-goal
実行結果 : HR-max-goal-summary
第7〜9講 マッチ棒問題T、U、発表会 レポート(抜粋:発表資料、詳細)
講義の折り返しということで、各自の解法を発表することになりました。
□ マッチ棒の配置問題
M 行 N 列に配置されたマッチ棒から r 本のマッチ棒を取り除くとき、孤立点ができないような配置がいくつあるかを求める問題です。
発表課題にはなっていませんが、状態遷移行列を作ることができるので高速に解くことができます。
この場合、状態遷移行列のメモリ使用量の制約からどこまで解けるかが決まることが多いです。(今回もそうなりました)
また、孤立点を判定するビット演算 (setsuzoku) もおもしろいと思います。
状態遷移行列を用いた解法プログラム
ソースプログラム : les07-ex02-HPI
実行結果 : les07-ex02-HPI-log
2週間と少し時間があったので、いくつかの解法を試みました。
ソースプログラム : les07-ex03-base
実行結果 : les07-ex03-N5-log
[2] LBE(Lower Bound Estimater)を用いた高速化
パラメータが r, s と2つあるので、LBEをどのようにつくるのか難しい問題です。もっとも短絡的なのは、s を無視する方法(LBE0)ですが、
やはり、結果は思わしくありません。ちょっと修正しただけで、4.8倍となったのだからOKという見方もあるかもしれませんが。
LBE3を実装したプログラム
ソースプログラム : les07-ex03-mod14
実行結果 : les07-ex03-mod14-N6-log
[3] 部分解合成法(HalfJoin)を用いた高速化
deepgreenが好きなアプローチです。実装が大変なので気安く取り組めないのが難点です。
今回はRSbandというLBEの新たな試みと比較する意味で開発してみました。やはり、HalfJoinは強力です。
HalfJoin最新版
ソースプログラム: les07-ex03-mod160
実行結果 : les07-ex03-mod160-N7-log
---[ 7, 7] / ( 0,26) :
544 ( 163767) 1617
msec
===[ 7,
7]
total 2197 msec
---[ 8, 8] / ( 0,33) : 16 ( 5413) 960 msec
===[ 8,
8]
total 5556 msec
---[ 9, 9] / ( 0,42)
: 672 (
1107541) 94491 msec
===[ 9,
9]
total 134411 msec
---[10,10] / ( 0,51) : 16 ( 12242) 29815 msec
===[10,10]
total 377526 msec
先生は、M,Nが偶数のとき解の数が16になっていることを気にしておられました。何か必然性がありそうな感じです。
第10講 カタラン数 ・ ・ ・ 特になし
第11講 畳敷詰問題T、U レポート(抜粋)
□ 状態遷移行列を用いた解法
あまり多くはないのですが、状態遷移を行列で表現できる場合があります。その場合、問題を高速に解くことができます。
今回の問題はそのようなケースです。 おそらく、通常の探索法では20x20の畳敷詰問題を解くことができないでしょう。
Solverを作る時、選択枝の1つとしてちょっと考えてみるのも面白いでしょう。
畳敷詰問題のSolver(状態遷移行列を用いた解法プログラム)
ソースプログラム : les11-ex99-BSE
実行結果 : les11-ex99-BSE-log
Home |
Up |
Back |
Next |