Skip to content

【エイト・クイーン】超高速化手法を詳細説明。N-Queens問題で様々なアルゴリズムをステップバイステップで学ぶ。再帰処理やブルートフォース、バックトラックやビット処理、反転斜軸処理による高速化手法を詳細に記述 世界記録2009年ドレスデン工科大学N26をPCで実現【Nクイーン】 Familiarize with algorithm basics such as sorting and recursion and learn the N-Queen problem step by step. Describe the speed-up method by recursion, brute force, backtracking, bit processing and reverse o…

Notifications You must be signed in to change notification settings

suzukiiichiro/N-Queens

Repository files navigation

/**

  -------------------  ---------------------------------------
  Python/Java/C/Lua/Bash/CUDA で学ぶアルゴリズムとデータ構造  

  「ステップバイステップでN−クイーン問題を最適化」

  一般社団法人  共同通信社  情報技術局次長  将来技術開発室長
                      鈴木維一郎(suzuki.iichiro@kyodonews.jp)
  ------------------------------------------------------------
  

  Nクイーンデモページ
  https://suzukiiichiro.github.io/demo/

 # 実行
 $ nvcc -O3 -arch=sm_61 -m64 -ptx -prec-div=false 04CUDA_Symmetry_BitBoard.cu && POCL_DEBUG=all ./a.out -n ;


 # 実行結果
11Bit_CUDA/04CUDA_Symmetry_BitBoard.cu

対称解除法 GPUビットボード
 N:            Total           Unique      dd:hh:mm:ss.ms
 4:                2                1     000:00:00:00.00
 5:               10                2     000:00:00:00.00
 6:                4                1     000:00:00:00.00
 7:               40                6     000:00:00:00.00
 8:               92               12     000:00:00:00.01
 9:              352               46     000:00:00:00.01
10:              724               92     000:00:00:00.01
11:             2680              341     000:00:00:00.01
12:            14200             1787     000:00:00:00.02
13:            73712             9233     000:00:00:00.04
14:           365596            45752     000:00:00:00.04
15:          2279184           285053     000:00:00:00.04
16:         14772512          1846955     000:00:00:00.07
17:         95815104         11977939     000:00:00:00.26
18:        666090624         83263591     000:00:00:01.65
19:       4968057848        621012754     000:00:00:13.80
20:      39029188884       4878666808     000:00:02:02.52
21:     314666222712      39333324973     000:00:18:46.52
22:    2691008701644     336376244042     000:03:00:22.54
23:   24233937684440    3029242658210     001:06:03:49.29
24:  227514171973736   28439272956934     012:23:38:21.02
25: 2207893435808352  275986683743434     140:07:39:29.96


 
||   ||Bash ||   ||Python||   || Lua |Java |   C(CPU)   |CUDA(GPU)||  Nクイーン解法の高速化処理ステップ
||   ||     ||   ||      ||   ||     |     | 再帰|非再帰| 非再帰  || 
|-----------|------------|------------------------------------------------------------------------------
||   ||     ||   ||      ||   ||     |     |     |      |         ||  1.ブルートフォース 力任せ探索    
||   ||     ||   ||      ||   ||     |     |     |      |         ||  2.配置フラグ(制約テスト高速化)
||N12||07:30||N15|| 07:54||N17||20:48|12:18| 8:40|  9:00|      -  ||  3.バックトラック
||N12||06:48||N15|| 08:21||N17||24:31|12:51| 8:42|  8:46|      -  ||  4.対称解除法                      
||N12||03:36||N15|| 04:48||N17||16:38| 3:01| 5:52|  6:12|      -  ||  5.枝刈りと最適化                  
||N12||01:52||N15|| 02:05||N17||09:05| 0:58| 1:05|  1:08|  0:18.07||  6.ビットマップ                    
||N12||05:47||N15|| 07:25||N17||23:09| 2:38| 2:41|  2:43|  6:04.57||  7.ビットマップ+対称解除法        
||N12||05:54||N15|| 08:49||N17||07:33| 2:40| 1:52|  1:51|  4:21.36||  8.ビットマップ+対称解除法+枝刈り
||N12||03:19||N15|| 08:06||N17||12:20| 1:38| 1:41|  1:36|  4:09.32||  9.クイーンの位置による分岐BOUND1  
||N12||03:50||N15|| 08:10||N17||12:18| 1:38| 1:32|  1:32|  4:09.09|| 10.クイーンの位置による分岐BOUND1,2
||N12||02:00||N15|| 02:27||N17||03:32| 1:34| 0:45|  0:43|  1:56.55|| 11.枝刈り                          
||N12||00:25||N15|| 00:54||N17||02:13| 0:14| 0:18|  0:15|  0:10.87|| 12.最適化                          
||N12||     ||N15|| 00:19||N17||     | 0:04| 0:04|  0:03|  0:00.35|| 13.並列処理                        


 # Python/Java/C/Lua/Bash版のN-Queen
 # https://github.com/suzukiiichiro/N-Queen



# 最新のディレクトリ以下のディレクトリで、多くの部分をビット処理を行っています。

08Bit_Bash
09Bit_GCC
10Bit_Python
11Bit_CUDA

こちらでロジックなどを詳細に説明しています。
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題

================
ディレクトリ説明
================

01Bash/ 
Bash版 以下のBit版を作成する前のバージョンです。値をビットではなく配列で管理しています。
#  N:        Total       Unique        hh:mm:ss
#  2:            0            0         0:00:00
#  3:            0            0         0:00:00
#  4:            2            1         0:00:00
#  5:           10            2         0:00:00
#  6:            4            1         0:00:00
#  7:           40            6         0:00:00
#  8:           92           12         0:00:00
#  9:          352           46         0:00:00
# 10:          724           92         0:00:01
# 11:         2680          341         0:00:05
# 12:        14200         1787         0:00:25



02Lua/
# Lua版 以下のBit版を作成する前のバージョンです。値をビットではなく配列で管理しています。
 N:            Total       Unique    hh:mm:ss
 2:                0            0    00:00:00
 3:                0            0    00:00:00
 4:                2            1    00:00:00
 5:               10            2    00:00:00
 6:                4            1    00:00:00
 7:               40            6    00:00:00
 8:               92           12    00:00:00
 9:              352           46    00:00:00
10:              724           92    00:00:00
11:             2680          341    00:00:00
12:            14200         1787    00:00:00
13:            73712         9233    00:00:00
14:           365596        45752    00:00:00
15:          2279184       285053    00:00:03
16:         14772512      1846955    00:00:20
17:         95815104     11977939    00:02:13


03Python/
# Python版 以下のBit版を作成する前のバージョンです。値をビットではなく配列で管理しています。
#  N:        Total       Unique        hh:mm:ss.ms
#  4:            2            1         0:00:00.124
#  5:           10            2         0:00:00.110
#  6:            4            1         0:00:00.116
#  7:           40            6         0:00:00.115
#  8:           92           12         0:00:00.119
#  9:          352           46         0:00:00.118
# 10:          724           92         0:00:00.121
# 11:         2680          341         0:00:00.122
# 12:        14200         1787         0:00:00.228
# 13:        73712         9233         0:00:00.641
# 14:       365596        45752         0:00:03.227
# 15:      2279184       285053         0:00:19.973



04Java/
# Java版 以下のBit版を作成する前のバージョンです。値をビットではなく配列で管理しています。
 N:            Total       Unique     hh:mm:ss.SSS
 4:                2            1     00:00:00.001
 5:               10            2     00:00:00.001
 6:                4            1     00:00:00.000
 7:               40            6     00:00:00.001
 8:               92           12     00:00:00.001
 9:              352           46     00:00:00.001
10:              724           92     00:00:00.001
11:             2680          341     00:00:00.003
12:            14200         1787     00:00:00.002
13:            73712         9233     00:00:00.005
14:           365596        45752     00:00:00.021
15:          2279184       285053     00:00:00.102
16:         14772512      1846955     00:00:00.631
17:         95815104     11977939     00:00:04.253



05C/
# C版 以下のBit版を作成する前のバージョンです。値をビットではなく配列で管理しています。
 N:          Total        Unique                 dd:hh:mm:ss.ms
 2:                 0                 0          00:00:00:00.00
 3:                 0                 0          00:00:00:00.00
 4:                 2                 1          00:00:00:00.00
 5:                10                 2          00:00:00:00.00
 6:                 4                 1          00:00:00:00.00
 7:                40                 6          00:00:00:00.00
 8:                92                12          00:00:00:00.00
 9:               352                46          00:00:00:00.00
10:               724                92          00:00:00:00.00
11:              2680               341          00:00:00:00.00
12:             14200              1787          00:00:00:00.00
13:             73712              9233          00:00:00:00.00
14:            365596             45752          00:00:00:00.01
15:           2279184            285053          00:00:00:00.07
16:          14772512           1846955          00:00:00:00.52
17:          95815104          11977939          00:00:00:03.86
18:         666090624          83263591          00:00:00:30.94
19:        4968057848         621012754          00:00:05:08.98
20:       39029188884        4878666808          00:00:40:31.91
21:      314666222712       39333324973          00:05:38:49.56
22:     2691008701644      336376244042          02:02:03:49.27
23:    24233937684440     3029242658210          22:12:20:11.13



06OpenCL/
# OpenCL版 以下のBit版を作成する前のバージョンです。値をビットではなく配列で管理しています。
57. GPU(07_55 *N*si*si*si アルゴリムは全部のせ 構造体分割+BOUND1によるバケツリレー) 
 N:          Total        Unique                 dd:hh:mm:ss.ms
 4:                 8                 4          00:00:00:00.30
 5:                10                22          00:00:00:00.26
 6:                 4               127          00:00:00:00.27
 7:                40               377          00:00:00:00.27
 8:                92               828          00:00:00:00.27
 9:               352              1567          00:00:00:00.29
10:               724              2632          00:00:00:00.28
11:              2680              4268          00:00:00:00.29
12:             14200              7523          00:00:00:00.30
13:             73712             17254          00:00:00:00.29
14:            365596             56588          00:00:00:00.44
15:           2279184            299288          00:00:00:00.92
16:          14772512           1865227          00:00:00:04.26
17:          95815104          12000940          00:00:00:35.17
18:         666090624          83292067          00:00:03:52.20
19:        4968057848         621047505          00:00:28:07.91


07CUDA/
# GPU nvcc版  以下のBit版を作成する前のバージョンです。値をビットではなく配列で管理しています。
$ nvcc -O3 CUDA13_N-Queen.cu  && ./a.out -g
13.GPU 非再帰 並列処理 CUDA
 N:        Total      Unique      dd:hh:mm:ss.ms
 4:            2               1  00:00:00:00.37
 5:           10               2  00:00:00:00.00
 6:            4               1  00:00:00:00.00
 7:           40               6  00:00:00:00.00
 8:           92              12  00:00:00:00.01
 9:          352              46  00:00:00:00.01
10:          724              92  00:00:00:00.01
11:         2680             341  00:00:00:00.01
12:        14200            1787  00:00:00:00.02
13:        73712            9233  00:00:00:00.03
14:       365596           45752  00:00:00:00.03
15:      2279184          285053  00:00:00:00.04
16:     14772512         1846955  00:00:00:00.08
17:     95815104        11977939  00:00:00:00.35
18:    666090624        83263591  00:00:00:02.60
19:   4968057848       621012754  00:00:00:22.23
20:  39029188884      4878666808  00:00:03:26.80
21: 314666222712     39333324973  00:00:33:09.52


以下は、値を配列からビットで管理しています。
すべてをビット計算によって高速に処理し、メモリも最小限に抑えることができます。
速度は上記の対象解除法が一枚上手ではありますが、長時間の処理でNの限界まで挑戦するという目的では、以下のシリーズ(キャリーチェーン)が良いと思います。



# 08Bit_Bash/
Bashでアルゴリズムを学ぶのに最適です。 並列処理に`xargs`を使っています。

こちらでロジックなどを詳細に説明しています。
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題

 ## bash版
 <> 08Bash_carryChain_parallel.sh 並列処理
 N:        Total       Unique        hh:mm:ss
 4:            0            0         0:00:00
 5:            8            1         0:00:00
 6:            4            1         0:00:00
 7:           40            6         0:00:00
 8:           92           12         0:00:01
 9:          352           46         0:00:03
10:          724           92         0:00:15
11:         2680          341         0:00:52
12:        14200         1788         0:02:49
13:        73712         9237         0:09:18
14:       365596        45771         0:28:48
15:      2279184       285095         1:49:12






# 09Bit_GCC/
C言語で安定と省メモリに特化したビット処理ロジックを`pthread`で並列処理しています。
現存するエイトクイーンの中で最も高速で安定したプログラムです。

こちらでロジックなどを詳細に説明しています。
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題

bash-3.2$ gcc -Wshift-negative-value -Wall -W -O3 -g -ftrapv -std=c99 -mtune=native -march=native 17GCC_carryChain.c -o 17GCC && ./17GCC
7.キャリーチェーン
 N:        Total       Unique        dd:hh:mm:ss.ms
 4:            2            1        00:00:00:00.00
 5:           10            2        00:00:00:00.00
 6:            4            1        00:00:00:00.00
 7:           40            6        00:00:00:00.00
 8:           92           12        00:00:00:00.00
 9:          352           46        00:00:00:00.00
10:          724           92        00:00:00:00.00
11:         2680          341        00:00:00:00.00
12:        14200         1788        00:00:00:00.00
13:        73712         9237        00:00:00:00.01
14:       365596        45771        00:00:00:00.06
15:      2279184       285095        00:00:00:00.25
16:     14772512      1847425        00:00:00:01.42
17:     95815104     11979381        00:00:00:10.25
18:    666090624     83274576        00:00:01:17.58
19:   4968057848    621051686        00:00:09:19.01
20:  39029188884   4878995797        00:01:12:06.58
bash-3.2$





# 10Bit_Python/
09BIt_GCCをPythonに移植しています。マルチスレッド、マルチプロセスで動作しますが、処理速度は期待できません。

こちらでロジックなどを詳細に説明しています。
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題

bash-3.2$ python 13Python_multiProcess.py
キャリーチェーン マルチプロセス
 N:        Total       Unique        hh:mm:ss.ms
 5:           10            2         0:00:00.061
 6:            4            1         0:00:00.126
 7:           40            6         0:00:00.135
 8:           92           12         0:00:00.327
 9:          352           46         0:00:00.766
10:          724           92         0:00:02.327
11:         2680          341         0:00:09.042
12:        14200         1788         0:00:19.871
13:        73712         9237         0:00:53.388
14:       365596        45771         0:02:19.974
15:      2279184       285095         0:05:51.522
16:     14772512      1847425         0:17:01.656
17:     95815104     11979381         1:07:04.713




bash-3.2$ python 13Python_multiProcess.py
キャリーチェーン マルチプロセス
 N:        Total       Unique        hh:mm:ss.ms
 5:           10            2         0:00:00.061
 6:            4            1         0:00:00.126
 7:           40            6         0:00:00.135
 8:           92           12         0:00:00.327
 9:          352           46         0:00:00.766
10:          724           92         0:00:02.327
11:         2680          341         0:00:09.042
12:        14200         1788         0:00:19.871
13:        73712         9237         0:00:53.388
14:       365596        45771         0:02:19.974
15:      2279184       285095         0:05:51.522
16:     14772512      1847425         0:17:01.656
17:     95815104     11979381         1:07:04.713


# 11Bit_CUDA/
09Bit_GCCをCUDAに移植したプログラムで、現在開発中です。過去の`07CUDA`は、N25でメモリ量が肥大し、システムはバーストしましたが、こちらのバージョンでN25を解決することができました。

こちらでロジックなどを詳細に説明しています。
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題


対称解除法 GPUビットボード
 N:            Total           Unique      dd:hh:mm:ss.ms
 4:                2                1     000:00:00:00.00
 5:               10                2     000:00:00:00.00
 6:                4                1     000:00:00:00.00
 7:               40                6     000:00:00:00.00
 8:               92               12     000:00:00:00.01
 9:              352               46     000:00:00:00.01
10:              724               92     000:00:00:00.01
11:             2680              341     000:00:00:00.01
12:            14200             1787     000:00:00:00.02
13:            73712             9233     000:00:00:00.04
14:           365596            45752     000:00:00:00.04
15:          2279184           285053     000:00:00:00.04
16:         14772512          1846955     000:00:00:00.07
17:         95815104         11977939     000:00:00:00.26
18:        666090624         83263591     000:00:00:01.65
19:       4968057848        621012754     000:00:00:13.80
20:      39029188884       4878666808     000:00:02:02.52
21:     314666222712      39333324973     000:00:18:46.52
22:    2691008701644     336376244042     000:03:00:22.54
23:   24233937684440    3029242658210     001:06:03:49.29
24:  227514171973736   28439272956934     012:23:38:21.02
25: 2207893435808352  275986683743434     140:07:39:29.96




Nクイーンデモページ
https://suzukiiichiro.github.io/N-Queens/demo/

                                                  
                                                     世界一        日本一      分解合成法    対照解除法 ビットマップ
 -------------------------------------- 鈴木維一郎   dresden ProAct 電通大        QJH版     高橋謙一郎 Somers版(N22)
 N:          Total       Unique         dd:hh:mm:ss                                                                    
 2:                 0                0  00:00:00:00                                                                    
 3:                 0                0  00:00:00:00                                                                    
 4:                 2                1  00:00:00:00                                                                    
 5:                10                2  00:00:00:00                                                                    
 6:                 4                1  00:00:00:00                                                                    
 7:                40                6  00:00:00:00                                                                    
 8:                92               12  00:00:00:00                                                                    
 9:               352               46  00:00:00:00                                                                    
10:               724               92  00:00:00:00                                                                    
11:              2680              341  00:00:00:00                                                                    
12:             14200             1787  00:00:00:00                                                                    
13:             73712             9233  00:00:00:00                                                                 
14:            365596            45752  00:00:00:00              
15:           2279184           285053  00:00:00:00                          00:00:00:00 00:00:00:00 00:00:04
16:          14772512          1846955  00:00:00:00                          00:00:00:00 00:00:00:04 00:00:23
17:          95815104         11977939  00:00:00:00                          00:00:00:07 00:00:00:31 00:02:38
18:         666090624         83263591  00:00:00:01              00:00:00:12 00:00:00:25 00:00:03:48 00:19:26
19:        4968057848        621012754  00:00:00:13              00:00:00:42 00:00:03:17 00:00:29:22 02:31:24
20:       39029188884       4878666808  00:00:02:02              00:00:04:46 00:00:24:07 00:03:54:10 20:35:06
21:      314666222712      39333324973  00:00:18:46              00:00:41:37 00:03:05:28 01:09:17:19                
22      2691008701644     336376244042  00:03:00:22              00:05:50:02 01:03:08:20                            
23     24233937684440    3029242658210  01:06:03:49              02:08:52:30                       
24    227514171973736   28439272956934  12:23:38:21              21:18:10:31
25   2207893435808352  275986683743434 140:07:39:29                       
26  22317699616364044 2789712466510289                 240日
27 23490796715412252829363791967678199               一年以上
                                                  
*****************************
  N-Queens問題とは
*****************************
 
Nクイーン問題とは、「8列×8行のチェスボードに8個のクイーンを、互いに効きが
当たらないように並べよ」という8クイーン問題のクイーン(N)を、どこまで大き
なNまで解を求めることができるかという問題。
クイーンとは、チェスで使われているクイーンを指し、チェス盤の中で、縦、横、
斜めにどこまでも進むことができる駒で、日本の将棋でいう「飛車と角」を合わ
せた動きとなる。8列×8行で構成される一般的なチェスボードにおける8-Queens
問題の解は、解の総数は92個である。比較的単純な問題なので、学部レベルの演
習問題として取り上げられることが多い。
8-Queens問題程度であれば、人力またはプログラムによる「力まかせ探索」でも
解を求めることができるが、Nが大きくなると解が一気に爆発し、実用的な時間で
は解けなくなる。
現在すべての解が判明しているものは、2004年に電気通信大学でIntel Pentium 4
Xeon 2.8GHzのプロセッサを68個搭載するPCクラスタ×20日をかけてn=24を解決し、
世界一に、その後2005 年にニッツァ大学でn=25、2009年にドレスデン工科大学で
N-26、さらに2016年に同工科大学でN=27の解を求めることに成功している。
JeffSommers氏のビット演算を用いたエレガントなアルゴリズムに加え、対称解除
法、並列処理、部分解合成法、圧縮や枝刈りなど、先端技術でワールドレコードが
次々と更新されている。


歴史あるチェスのパズル問題が現代数学における未解決問題の解明につながる可能性
https://gigazine.net/news/20170905-million-dollar-chess-problem/
Nクイーンは今のコンピュータでは絶対解けない。解けたら1億円もらえるよ
https://www.gizmodo.jp/2017/10/eight-queens-puzzle.html
解けたら賞金1億円! 数学の7つの未解決問題のひとつ「P≠NP」問題へのアプローチがもたらすもの
https://logmi.jp/tech/articles/45330

N24 2004年4月11日 電気通信大学    2004年4月 68CPU x 22日(1,496 CPU日 N24)
N25 2005年6月11日 ProActive       2005年5月 185 days 4 hours 54 minutes 52 seconds 854
  Java grid computation by INRIA, France 
  Real >6 Months
  Sequential >53 Years
  http://www-sop.inria.fr/oasis/ProActive2/apps/nqueens25.html
N26 2009年7月11日 tu-dresden     FPGA ( *1 : 8*22 2.5 GHz-QuadCore systemsに相当(約176 * 4CPU = 704 CPU))  x 240日(168,960 CPU日 N26)
  9-month cpmputation of FPGAs completing July 1,2009.
  Result confirmed by Russian MC# super computing project on August 30,2009.
N27 2016年 月  日 tu-dresden
  https://github.com/preusser/q27

JSomers版   (N=22)
巧みなビット演算による高速化
上下反転の解を考慮し、探索を半分に削減
Jeff Somers氏がN=23の解を求めるときに使用した解法

電気通信大学版 qn24b (N=24)
JSomers版を改良し、7〜24%の性能向上
電通大でN=24を求めるときに使用した解法

ProActive(N=25)
http://www-sop.inria.fr/oasis/ProActive2/apps/nqueens25.html

takaken版
JSomers版を高橋謙一郎氏が改良
対称性に着目して代表解のみを探索
再帰呼び出しによるプログラム解毒性の向上


 
*************************
はじめに
*************************

幸運にもこのページを参照することができたN-Queen(Nクイーン)エンジニアは少数だろう。
Google検索またはGit検索でたどり着いたのだとは思うが、確率は奇跡に近い。
エンジニアにしてこのページを参照できた奇跡ついでにもう少しだけ読み進めて欲しい。
具体的には以下のリンクにわかりやすく書いてある。

  エイト・クイーン問題
  https://ja.wikipedia.org/wiki/エイト・クイーン
 
エイト・クイーンは、1848年から存在し、ガウスなど著名な科学者が研究した工学研究の
頂点となる研究である。名前の通り8つのクイーンの解を求めるというパズルであり、
Nクイーンは、エイトクイーンの拡張版で、Nの値は8、9、10,11,12・・・と言った風
に増え続け、そのNの値であるボードの解を求めるものである。



*************************
歴史的未解決問題に懸賞金
*************************

歴史あるチェスのパズル問題が現代数学における未解決問題の解明につながる可能性
http://gigazine.net/news/20170905-million-dollar-chess-problem/

1000年を超える歴史を持つボードゲーム「チェス」には単なるゲームの勝敗ではなく、
そのルールに即したさまざまなパズルの課題「チェス・プロブレム」が存在しています。
エイト・クイーンはチェスの駒のうち、8個のクイーンだけを使うパズルなのですが、そ
の規模を大きく拡大して行くと、現代数学における未解決問題であり、1億円の賞金がか
かる「P対NP問題」の解明につながるものと考えられています。

2017 | “Simple” chess puzzle holds key to $1m prize | University of St Andrews
https://www.st-andrews.ac.uk/news/archive/2017/title,1539813,en.php

Can You Solve the Million-Dollar, Unsolvable Chess Problem? - Atlas Obscura
http://www.atlasobscura.com/articles/queens-puzzle-chess-problem-solution-software

Nクイーンは今のコンピュータでは絶対解けない。解けたら1億円もらえるよ
https://www.gizmodo.jp/2017/10/eight-queens-puzzle.html

「エイト・クイーン」は1848年にチェスプレイヤーのマックス・ベッツェルによって提
案されたパズル。8×8マスのチェス盤の上に、縦横と斜め方向にどこまででも進めるとい
う駒・クイーンを8個並べるというものなのですが、その際には「どの駒も他の駒に取ら
れるような位置においてはいけない」というルールが設定されています。このルールに
従った場合にいくつの正解が存在するのか、長らくの間にわたって謎とされていたので
すが、考案から100年以上が経過した1874年にGuntherが行列式を用いて解く方法を提案
し、イギリスのグレイシャー(Glaisher)によって全解(基本解)が12個であることを確認
しています。

この問題は、チェス盤の一辺のマスの数とクイーンの数を同一にしたn-クイーン問題と
も呼ばれており、nの数が増えるに連れて飛躍的にその解数が増大することが知られてい
ます。記事作成時点で全ての解が判明しているのは、2009年にドレスデン工科大学で計
算された「26-クイーン」で、その基本解は2789兆7124億6651万289個、転回形などのバ
リエーション解を含めると、その数は2京2317兆6996億1636万4044個にもなることがわかっ
ています。

セント・アンドルーズ大学のコンピューターサイエンティストであるIan Gent博士らに
よる研究チームは、この「n-クイーン問題」から派生する「n-クイーン穴埋め問題」
(n-Queens Completion)パズルの複雑性に関する(PDF
http://jair.org/media/5512/live-5512-10126-jair.pdf)論文を作成しています。n-ク
イーン穴埋め問題は、チェス盤の上にあらかじめいくつかのクイーンの駒を並べておい
た状態で、残りのクイーンを全て埋めるというパズル問題です。

基本的にこの問題を解決するためにはバックトラック法と呼ばれる、いわば「総当たり
法」が用いられますが、全ての選択肢を試すためには膨大な時間が必要とされ、しかも
マスとクイーンの数が多くなるとその時間は指数関数的に一気に増加します。Gent氏に
よると、この「n-クイーン穴埋め問題」を素早く解決できるコンピューターやアルゴリ
ズムの開発が進むことで、我々が日々抱えている問題を解決する技術の進化が期待でき
るとのこと。先述のように、現代の科学でも解決できているn-クイーン問題は26×26マス
の「26-クイーン」にとどまっており、穴埋め問題であってもそこから先へと進むために
は、現在はまだ存在していない新しい技術を開発することが必須となってきます。

この問題は、2000年にアメリカのクレイ数学研究所が100万ドル(約1億1000万円)の賞金
とともに設定したミレニアム懸賞問題の一つに数えられる「P対NP問題」の証明につなが
るものとされています。これは、「答えを見つけるのは難しいかもしれないが、答えが
あっているかどうかは素早くチェックできる問題」のことをNP問題、「簡単に素早く解
ける問題」のことをP問題とした時に、「素早く解けるP問題はすべて答えを素早く確認
できるNP問題である」ことは証明されているが、その逆、つまり「答えを素早く確認で
きるNP問題はすべて、素早く解けるか?」という問題を証明するというもの。 これを解
くためには膨大な量の計算を素早く行うことが必要になり、現代のコンピューター技術
でも解決までには数万年の時間が必要になると考えられています。


*************************
参考リンクなど
*************************


GooleなどWebを探索すると無数のページがあることがわかる。その中でも充実したサイトを
紹介したい。おおよそ以下のサイトをかみしめて読み解けば情報は90%網羅されている。

N-Queens 問題(Nobuhide Tsudaさん)
*************************
  はじめに
  力まかせ探索(Brute-force search)
  バックトラッキング
  制約テスト高速化(配置フラグ)
  ビット演算(ビットマップ)による高速化
  対称解除去
  枝刈りによる高速化
  http://vivi.dyndns.org/tech/puzzle/NQueen.html

Puzzle DE Programming(M.Hiroiさん)
*************************
  バックトラックとビット演算による高速化
  http://www.geocities.jp/m_hiroi/puzzle/nqueens.html

takakenさん(高橋謙一郎さん)のページ
*************************
  Nクイーン問題(解の個数を求める)
    ビット処理を用いた基本形
    ビット処理を用いたプログラムの仕組み
    ユニーク解の判定方法
    ユニーク解の個数を求める
    ユニーク解から全解への展開
    ソースプログラムと実行結果
  http://www.ic-net.or.jp/home/takaken/nt/queen/index.html

の、みなさんが掲示板で議論している模様(貴重ですね)
http://www2.ic-net.or.jp/~takaken/auto/guest/bbs62.html

ptimal Queens
*************************
英語だが、上記の全てがJavaで書かれていて群を抜いている
http://penguin.ewu.edu/~trolfe/Queens/OptQueen.html

その他のリンク
https://rosettacode.org/wiki/N-queens_problem
http://www.cc.kyoto-su.ac.jp/~yamada/ap/backtrack.html
http://yucchi.jp/java/java_tip/n_queens_problem/n_queens_problem.html
http://www.shido.info/py/queen_py3.html
http://toraneko75.sakura.ne.jp/wp/?p=223
http://yoshiiz.blog129.fc2.com/blog-entry-380.html
http://nw.tsuda.ac.jp/class/algoB/c6.html
http://www.kawa.net/works/js/8queens/nqueens.html
http://www.yasugi.ai.kyutech.ac.jp/2012/4/nq.html
http://www.neuro.sfc.keio.ac.jp/~masato/jv/nqueen/MPneuron.java
http://fujimura2.fiw-web.net/java/lang/page-20-3.html
https://github.com/pankajmore/DPP/blob/master/EPI/src/puzzles/NQueens.java
http://www.kanadas.com/ccm/queens-sort/index-j.html
http://chiiji.s10.xrea.com/nn/nqueen/nqueenn.shtml
http://www.neuro.sfc.keio.ac.jp/~masato/jv/nqueen/nqueenDemo.htm


ここからは参考情報のメモとして

N=22発見 JeffSomers
  ビットマップを N-Queens に最初に応用したのは Jeff Somers 氏のようだ。 
  参照:The N Queens Problem
  http://www.jsomers.com/nqueen_demo/nqueens.html(リンク切れのようだ)

N=24発見 電気通信大学
  2004年、電気通信大学の研究グループが、処理を並列化し
  N=24 の解の個数を世界で初めて発見。 
  http://www.arch.cs.titech.ac.jp/~kise/nq/

  プレスリリース
  http://www.arch.cs.titech.ac.jp/~kise/nq/press-2004-10-05.txt

  電通大が「N-queens」問題の世界記録達成
  http://www.itmedia.co.jp/news/articles/0410/06/news079.html

  University of North Texas
  http://larc.unt.edu/ian/24queens/

  NQueens問題
  QJHの基本構想は、”部分解から全体解を構成するというアプローチ”(部分解合成法:Parts Assembly Approach)です。
  http://deepgreen.game.coocan.jp/NQueens/nqueen_index.htm

  N Queens World records
  http://www.nqueens.de/sub/WorldRecord.en.html

  N=21-23 computed by Sylvain PION (Sylvain.Pion(AT)sophia.inria.fr) and Joel-Yann FOURRE (Joel-Yann.Fourre(AT)ens.fr).

  N=24 from Kenji KISE (kis(AT)is.uec.ac.jp), Sep 01 2004

  N=25 from Objectweb ProActive INRIA Team (proactive(AT)objectweb.org), Jun 11 2005 [Communicated by Alexandre Di Costanzo (Alexandre.Di_Costanzo(AT)sophia.inria.fr)]. This calculation took about 53 years of CPU time.N=25 has been confirmed by the NTU 25Queen Project at National Taiwan University and Ming Chuan University, led by Yuh-Pyng (Arping) Shieh, Jul 26 2005. This computation took 26613 days CPU time.

  N=26 as calculated by Queens(AT)TUD [http://queens.inf.tu-dresden.de/]. - Thomas B. Preußer, Jul 11 2009

  N=27 as calculated by the Q27 Project [https://github.com/preusser/q27]. - Thomas B. Preußer, Sep 23 2016



*****************************
このぺーじにはなにがあるのか
*****************************

具体的にこのページにはNクイーンのプログラムがある。

コンパイル
$ gcc -pthread -O3 -Wall 07_**NQueen.c -o NQueen 

実行
$ ./NQueen


を試して欲しい。

Nクイーンの解決には処理を分解して一つ一つ丁寧に理解すべくステップが必要だ。
最初はステップ1のソースを何度も見て書いて理解するしかない。
もちろん、簡単なだけに解決時間も相当かかる。処理が終わるまでにコーヒーが飲み終わってしまうかもしれない。
ステップ15までくると、およそ1秒もかからずに処理が終了する。1分かかっていたことが1秒で終わることに
興味がわかないかもしれない。がしかし、100年かかることが1年かからないとしたらどうだろう。
人工知能AI技術は、デバイスの進化、処理の高速化、解法の最適化(アルゴリズム)の三位一体だ。
順番に、とばすことなくじっくりと読み進めて欲しい。たぶん、日本中のNクイーンプログラムをここまで分解して
ステップにまとめているサイトはそう多くはないはずだ。

さらに、このサイトはNクイーンプログラムを複数のプログラム言語で習熟出来る準備がある。
例えば以下の通りだ。

  Java版 N-Queen
  https://github.com/suzukiiichiro/AI_Algorithm_N-Queen

  Bash版 N-Queen
  https://github.com/suzukiiichiro/AI_Algorithm_Bash

  Lua版  N-Queen
  https://github.com/suzukiiichiro/AI_Algorithm_Lua

  C版  N-Queen
  https://github.com/suzukiiichiro/AI_Algorithm_C
 
C版
 およそ全てのプログラム言語の中で最も高速に処理できると言われている。事実そうだ。
 まだ何もわからない初学の人はC言語から始めるべきだ。
 マルチスレッドなど、Javaに比べて複雑に記述する必要がある分、プログラムの端々までの
深い知識が必要だ。C言語マスターは間違いなく、Javaプログラマよりシステム技術を網羅的に深く理解している。

Java版
 C言語があまりにも難解と言われ、取っつきやすい部分を残し、Cでできることを取りこぼさずにできた言語がJavaだ。
マルチスレッドも、C言語よりもわかりやすい。システム技術の表層的な知識だけしかないのであればJavaがよい。
システムがわかった気になる危険な言語でもある。結論から言えばJavaができてもLinuxコマンドやBash、カーネルの
理解は1つも進まない。

Bash版
Linux/UNIXを学ぶのであればBash版をおすすめする。
https://github.com/suzukiiichiro/AI_Algorithm_Bash

  なぜBashなのかは以下に書いておいた。
  https://github.com/suzukiiichiro/AI_Algorithm_Bash/blob/master/002UNIXBasic

  Bashは遅い。だが強力だ。Linuxの力を手に入れることができる。
  どの言語で学ぶのかを迷っているのであれば迷わず「Bash」を選んで欲しい。
  その次はLua->Java->Cだ。

Lua版
スマートフォンアプリが世の中のテクノロジーを牽引しているのは間違いない。
そのアプリ開発で幅を利かせているのがLua言語だ。コンパクトで高速、周りとの相性も良いときている。


上記、どの言語から始めても良いと思う。できる人はどの言語でもすらすら書ける。
では、以下から本題に入る。
各お好みの言語ディレクトリのREADMEを見て欲しい。では

About

【エイト・クイーン】超高速化手法を詳細説明。N-Queens問題で様々なアルゴリズムをステップバイステップで学ぶ。再帰処理やブルートフォース、バックトラックやビット処理、反転斜軸処理による高速化手法を詳細に記述 世界記録2009年ドレスデン工科大学N26をPCで実現【Nクイーン】 Familiarize with algorithm basics such as sorting and recursion and learn the N-Queen problem step by step. Describe the speed-up method by recursion, brute force, backtracking, bit processing and reverse o…

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published