Giter VIP home page Giter VIP logo

calcitem / sanmill Goto Github PK

View Code? Open in Web Editor NEW
131.0 7.0 20.0 107.89 MB

Sanmill is an open-source, UCI-like Mill/Morris/Merrills/Mühle/Malom (and its variants) program with CUI, Flutter GUI and Qt GUI, sharing and freely distributing the code, tools and data needed to deliver this mill game. We do this because we are convinced that open software and open data are key ingredients to make rapid progress.

Home Page: https://play.google.com/store/apps/details?id=com.calcitem.sanmill

License: GNU General Public License v3.0

C 0.97% C++ 44.74% Shell 0.86% Batchfile 0.03% Makefile 1.42% Java 0.72% Dart 48.49% CMake 1.64% Python 0.04% JavaScript 0.04% Ruby 0.18% Swift 0.35% Objective-C 0.30% Objective-C++ 0.21%
ea15e84462 morris mill mills muhle malom flutter ai alpha-beta-pruning game

sanmill's Issues

建立开局库

19 23 21 此时白方最佳选择是20,次佳选择是17
实验700-100盘,+19 23 +21 20 +27 11 +29, 下一步白方13堵,95%胜率,左上角31则也是95%胜率,可以作为备选,但可能是因为黑方下一步应招是先堵而非先成三。排第三是16, 86%胜率也不低。

    int table[2][4] = {
        {19, 21, 27, 29},
        {23, 20, 11,28} // 31 24 25 16 17 15 8 9 30 22 14 10 18 26 13 12 28
    };

搜索时没有检测和棋

造成最后能赢的变成和棋

r2 s050 t00
(1,2) 00:00
(1,1) 13:17
(1,4) 07:01
(1,3) 15:02
(1,6) 08:19
(1,5) 15:39
(1,7) 08:40
(1,8) 15:58
(2,6) 08:46
(3,6) 15:59
(2,2) 08:48
(3,2) 16:00
(2,8) 08:49
(2,1) 16:01
(2,7) 08:50
-(3,6)  08:51
(3,7) 16:02
(3,4) 08:52
(3,1) 16:02
-(3,4)  16:03
(3,8) 08:53
(2,3) 16:03
(3,3) 08:54
(3,5) 16:03
(2,5) 08:54
(2,4) 16:03
(3,5)->(3,6) 16:04
(3,3)->(3,4) 08:54
(3,2)->(3,3) 16:04
-(3,4)  16:05
(2,5)->(3,5) 08:57
(3,3)->(3,2) 16:06
(3,5)->(3,4) 08:59
(3,2)->(3,3) 16:08
-(3,4)  16:11
(2,6)->(2,5) 09:09
(3,6)->(2,6) 16:12
(2,5)->(3,5) 09:11
(1,5)->(2,5) 16:20
-(1,6)  16:36
(3,5)->(3,4) 09:24
(3,3)->(3,2) 16:42
(3,4)->(3,3) 09:29
(2,5)->(1,5) 16:47
(3,3)->(3,4) 09:30
(3,2)->(3,3) 16:47
-(3,4)  16:48
(2,2)->(3,2) 09:31
(2,1)->(2,2) 16:48
-(1,2)  16:48
(1,7)->(1,6) 09:31
(2,2)->(1,2) 16:48
-(1,4)  16:48
(3,2)->(2,2) 09:31
(2,4)->(1,4) 16:48
-(1,6)  16:48
(2,8)->(2,1) 09:31
(2,6)->(1,6) 16:48
-(2,7)  16:48
(3,8)->(2,8) 09:31
-(3,3)  09:31
(3,7)->(3,6) 16:48
(2,2)->(3,2) 09:31
(2,3)->(2,2) 16:48
(2,8)->(3,8) 09:31
(3,6)->(2,6) 16:48
(3,8)->(2,8) 09:32
(3,1)->(3,8) 16:48
(3,2)->(3,3) 09:32
(3,8)->(3,1) 16:48
(3,3)->(3,2) 09:32
(3,1)->(3,8) 16:48
(3,2)->(3,3) 09:33
Threefold Repetition. Draw!

摆子阶段最后一着如果成三则先吃子再进入走棋阶段的 Bug

SHA-1: 79effc7

  • rule: 摆子阶段最后一着如果成三则先吃子再进入走棋阶段

引入

r2 s050 t00
(2,2) 00:00
(2,4) 00:05

(2,8) 00:01
(2,1) 01:22

(3,2) 00:02
(1,2) 01:50

(2,6) 00:06
(2,7) 03:22

(1,8) 00:07
(3,8) 03:25

(3,6) 00:08
(1,6) 03:28

(3,4) 00:10
(3,3) 03:56

(1,3) 00:12
(3,5) 04:06

(1,5) 00:13
(2,5) 04:24

(1,4) 00:14
(3,7) 04:26

(1,7) 00:15
(3,1) 04:28

(1,1) 00:15
(2,3) 04:32
Player2 win!

最后几招可以看到, 必死但还是算出来没死 .

白方吃子不当

r2 s050 t00
(2,6) 00:00
(2,8) 00:00
(2,4) 00:01
(2,5) 00:00
(2,2) 00:02
(2,3) 00:01
(1,8) 00:02
(1,3) 00:02
(3,3) 00:04
(1,5) 00:03
(3,5) 00:05
(1,4) 00:04
(3,4) 00:07
(1,2) 00:04
-(1,8)  00:04
(3,6) 00:11
-(1,5)  00:13
(3,2) 00:04
(1,6) 00:15
-(3,2)  00:16
(3,8) 00:04
(3,1) 00:18
(1,1) 00:05
(2,1) 00:19
(2,7) 00:05
(1,7) 00:23
(3,7) 00:05
(2,8)->(1,8) 00:05
-(3,1)  00:05
(2,1)->(2,8) 00:33
(1,1)->(2,1) 00:05
(2,2)->(3,2) 00:37
-(1,8)  00:39
(2,3)->(2,2) 00:05
(3,3)->(2,3) 00:48
(1,2)->(1,1) 00:05
(2,8)->(1,8) 00:59
-(2,2)  01:01
(3,8)->(3,1) 00:05
-(3,2)  00:06
(1,6)->(1,5) 01:09
(1,1)->(1,2) 00:06
-(1,5)  00:07
(1,7)->(1,6) 01:13
-(1,2)  01:16
(1,3)->(1,2) 00:07
(1,8)->(1,1) 01:21
(1,2)->(2,2) 00:07
(3,4)->(3,3) 01:26
(2,7)->(2,8) 00:07
-(3,5)  00:07
(1,6)->(1,5) 01:35
(3,7)->(3,8) 00:08
(1,5)->(1,6) 01:41
-(3,8)  01:49
(2,8)->(1,8) 00:08
(1,1)->(1,2) 01:55
(1,8)->(2,8) 00:08
-(3,3)  00:08
(1,6)->(1,5) 02:01
(2,1)->(1,1) 00:08
(1,5)->(1,6) 02:12
-(2,2)  02:16
(2,8)->(2,1) 00:08
-(2,3)  00:08
(1,6)->(1,5) 02:19
(1,1)->(1,8) 00:08
(1,5)->(1,6) 02:21
-(1,8)  02:23
(2,1)->(1,1) 00:08
(1,6)->(1,5) 02:26
(3,1)->(2,1) 00:08
(1,5)->(1,6) 02:28
-(1,1)  02:29
(2,5)->(1,5) 00:08
(2,6)->(2,5) 02:32
(2,1)->(2,2) 00:08
(3,6)->(2,6) 02:35
-(2,2)  02:36
Player1 win!

d加深对战结果

d+5 Vs d+0
25% : 70% : 5%, d+5作为黑方胜率 提升14%
0.7% : 91% : 8%, d+5作为白方胜率提升7%

d+6 Vs d+0
27% : 69% : 5%,, d+5作为黑方胜率 提升13%
2% : 92 : 6%, d+5作为白方胜率提升8%

提前认输异常

自对弈,选提前认输
白方胜时算黑方的,且显示player4/5 win.

IDS中途认为某着法会败但是更深反而不认为败

1019-lose.txt

(3,3) 这步,

Thread 2 start
Depth: 16
IDS:
==============================
==============================
==============================
50(50) : --------------- depth = 2/16 ---------------
[00] 8  (1,1)   50      10 *
[01] 16 (2,1)   150     0
[02] 22 (2,7)   150     0
[03] 24 (3,1)   150     0
[04] 26 (3,3)   150     0
[05] 10 (1,3)   150     0
[06] 14 (1,7)   150     0

0(-50) : --------------- depth = 3/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 16 (2,1)   150     0
[02] 22 (2,7)   150     0
[03] 24 (3,1)   150     0
[04] 26 (3,3)   150     0
[05] 10 (1,3)   150     0
[06] 14 (1,7)   150     0

50(50) : --------------- depth = 4/16 ---------------
[00] 8  (1,1)   50      10 *
[01] 16 (2,1)   100     0
[02] 22 (2,7)   100     0
[03] 24 (3,1)   100     0
[04] 26 (3,3)   100     0
[05] 10 (1,3)   100     0
[06] 14 (1,7)   100     0

0(-50) : --------------- depth = 5/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 16 (2,1)   150     0
[02] 22 (2,7)   0       0
[03] 24 (3,1)   150     0
[04] 26 (3,3)   0       0
[05] 10 (1,3)   0       0
[06] 14 (1,7)   150     0

50(50) : --------------- depth = 6/16 ---------------
[00] 8  (1,1)   50      10 *
[01] 22 (2,7)   100     0
[02] 26 (3,3)   50      0
[03] 10 (1,3)   100     0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

0(-50) : --------------- depth = 7/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 26 (3,3)   0       0
[02] 22 (2,7)   0       0
[03] 10 (1,3)   0       0
[04] 16 (2,1)   150     0
[05] 24 (3,1)   150     0
[06] 14 (1,7)   150     0

0(0) : --------------- depth = 8/16 ---------------
[00] 8  (1,1)   0       10 *
[01] 26 (3,3)   50      0
[02] 22 (2,7)   50      0
[03] 10 (1,3)   50      0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

100(100) : --------------- depth = 9/16 ---------------
[00] 8  (1,1)   128     10
[01] 26 (3,3)   100     0
[02] 22 (2,7)   100     0
[03] 10 (1,3)   100     0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

100(0) : --------------- depth = 10/16 ---------------
[00] 8  (1,1)   100     10 *
[01] 26 (3,3)   100     0
[02] 22 (2,7)   100     0
[03] 10 (1,3)   100     0
[04] 16 (2,1)   100     0
[05] 24 (3,1)   100     0
[06] 14 (1,7)   100     0

128(28) : --------------- depth = 11/16 ---------------
[00] 8  (1,1)   128     10 *
[01] 26 (3,3)   128     0
[02] 22 (2,7)   128     0
[03] 10 (1,3)   128     0
[04] 16 (2,1)   200     0
[05] 24 (3,1)   128     0
[06] 14 (1,7)   128     0

228(100) : --------------- depth = 12/16 ---------------
[00] 8  (1,1)   228     10 *
[01] 26 (3,3)   228     0
[02] 22 (2,7)   228     0
[03] 10 (1,3)   228     0
[04] 24 (3,1)   228     0
[05] 14 (1,7)   228     0
[06] 16 (2,1)   228     0

200(-28) : --------------- depth = 13/16 ---------------
[00] 8  (1,1)   10000   10
[01] 26 (3,3)   200     0
[02] 22 (2,7)   200     0
[03] 10 (1,3)   200     0
[04] 24 (3,1)   200     0
[05] 14 (1,7)   200     0
[06] 16 (2,1)   200     0

228(28) : --------------- depth = 14/16 ---------------
[00] 8  (1,1)   10000   10  # 这步认为会败
[01] 26 (3,3)   228     0
[02] 22 (2,7)   228     0
[03] 10 (1,3)   228     0
[04] 24 (3,1)   300     0
[05] 14 (1,7)   228     0
[06] 16 (2,1)   300     0

200(-28) : --------------- depth = 15/16 ---------------
[00] 8  (1,1)   328     10  # 这步又认为不会败
[01] 26 (3,3)   200     0
[02] 22 (2,7)   200     0
[03] 10 (1,3)   200     0
[04] 14 (1,7)   200     0
[05] 24 (3,1)   200     0
[06] 16 (2,1)   200     0


31 ----- 24 ----- 25
| \       |      / |
|  23 -- 16 -- 17  |
|  | \    |   / |  |
|  |  15-08-09  |  |
30-22-14    10-18-26
|  |  13-12-11  |  |
|  | /    |   \ |  |
|  21 -- 20 -- 19  |
| /       |      \ |
29 ----- 28 ----- 27

[00] 8  (1,1)   300     10
[01] 26 (3,3)   228     0
[02] 22 (2,7)   228     0
[03] 10 (1,3)   228     0
[04] 14 (1,7)   228     0
[05] 24 (3,1)   228     0
[06] 16 (2,1)   228     0
Evaluated: 535212 / 3258952 = 16%
Pool 0000020CFC644070 - Used: 245760 (12%), Free: 1851392 (88%)

Computer: (3,3)

v0.6.1 和不同深度对战结果

执白对 d+3_ids: 673:673:49 48%:48%:4% 打平,胜率没有比d+2_ids变高
执白对 d+2_ids: 3002:2608:123 52%:45%:2% 胜率大降30%
执白对 d+2: 2505:3788:82 39%:59%:1%, 胜率下降15%
执白对ids,3813:7807:161 32%:66%:1% 胜率下降8%
执黑对ids: 1905:14647:1225 11%:88%:1% 胜率下降14%

黑方调整depth后胜率变化

0dbce75
v0.5.2 原来 是1 7 9 12, 胜率 39%:57%


MillGame-1-5-7.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	10760
Black	4485	4168
White	5922	5503
Draw	353	328

MillGame-1-6-8.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	10629
Black	4485	4219
White	5789	5446
Draw	355	333

MillGame-1-6-8-12-14-16-16-16-16-16-14-14.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	9616
Black	4149	4314
White	5136	5341
Draw	331	344


MillGame-1-8-10.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1301
Black	502	3858
White	751	5772
Draw	48	368



MillGame-1-8-11.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1266
Black	497	3925
White	720	5687
Draw	49	387


MillGame-1-10-12.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1185
Black	453	3822
White	685	5780
Draw	47	396

MillGame-1-8-11-12-13-15.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	9966
Black	3983	3996
White	5621	5640
Draw	362	363


MillGame-1-6-8-12-13-15.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	9503
Black	3997	4206
White	5245	5519
Draw	261	274

MillGame-1-9-11.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	1265
Black	490	3873
White	727	5747
Draw	48	379

MillGame-1-9-12-12-14-16-16-17-16-15-14-14.exe

MillGame-Key-0

Black:	AI Player
White:	AI Player

Sum	10064
Black	4072	4046
White	5647	5611
Draw	345	342


黑方不能探查到输棋

969aee6

自对弈

0(0) 50(50) 0(-50) -128(-128) -100(28) -128(-28) -228(-100) -200(28) -228(-28) -328(-100) -629(-301) -930(-301) -1231(-301)
31 ----- 24 ----- 25
| \       |      / |
|  23 -- 16 -- 17  |
|  | \    |   / |  |
|  |  15-08-09  |  |
30-22-14    10-18-26
|  |  13-12-11  |  |
|  | /    |   \ |  |
|  21 -- 20 -- 19  |
| /       |      \ |
29 ----- 28 ----- 27

[00] 26 (3,3)   -1382   0
[01] 10 (1,3)   -1382   0
[02] 18 (2,3)   -1382   0
[03] 22 (2,7)   -1382   0
Evaluated: 718005 / 2853227 = 25%
Pool 000000002fa02040 - Used: 606208 (29%), Free: 1490944 (71%)

Computer: (3,3)

开局库研究

目前开局不会利用禁点阻隔,例如 (2,6) (2,8) (1,6) 后最佳应该是 (1,4)

开局库

下6万多盘。
深度24时,黑方 19 不是最优,但如果走19, 那么白方如何应招?
19-23: 2.30% : 92.37% : 5.31% 表现更优
19-17: 14.38% : 79.75% : 5.86%
但是如果下深度24,会优选 19-17, 和概率统计不符。

iTouch 闪退

QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
isEngine2: AI(1) set Action:  "(1,4)"
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
Depth: 13
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
Timeout

IDS Time:  101.72 s
rows: 8  current: -1
rows: 1  current: 0
"r2 s050 t00"
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
rows: 2  current: -1
rows: 1  current: 0
"r2 s050 t00"
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")QVBoxLayout(0x2814d80a0, name = "verticalLayout_2") is laying out QSplitter(0x281ad6d00, name="splitter") outside of the contents rect of QWidget(0x281ad68e0, name="dockWidgetContents")
QMainWindowLayout(0x10403be00, name = "_layout") is laying out QStatusBar(0x281ae9230, name="statusBar") outside of the contents rect of NineChessWindow(0x16f0e3b90, name="NineChessWindowClass")

21:13:16: Starting remote process.
Thread 2 start
QMainWindowLayout(0x10381b000, name = "_layout") is laying out QStatusBar(0x2835a9680, name="statusBar") outside of the contents rect of NineChessWindow(0x16f7c7b90, name="NineChessWindowClass")
qt.qpa.glcontext: explicitly glFinishing and deactivating QOpenGLContext(0x283981fd0, nativeHandle=QVariant(Invalid), format=QSurfaceFormat(version 3.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize -1, redBufferSize -1, greenBufferSize -
1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile  QSurfaceFormat::NoProfile), surface=0x281f978b0, screen="iPod touc
h built-in display")

Debug 1/5000 probability appears inHand/onBoard or board->locations[] confusion

现象:
未打开必败认输选项。在
void Game::generateMoves(Stack<move_t, MOVE_COUNT> &moves) 函数中,运行到 case ACTION_PLACE: 这个分支,在这断代码中一直 continue:

                if (boardLocations[square]) {
                    continue;
                }

因 boardLocations 已经全满了,但是当前状态还未跳转到 MOVING。

如下面附件表格记录的两个复现Case,
查看此时的 position 下的变量可知:

Case1:
黑方:inHand 异常变为 -1,正确应为0, onBoard 异常变为 13,正确应为12;
白方:board[28] 的值为13,超过12,异常。

Case2:
黑方: inHand 为 1,按 board 来看应该是0;
白方: onBoard 为10,按 board 来看应该是11;
看 board,发现白方在12、30位置都是 [0x29,重复了,为异常。]

概率:
对于 814ed29 版本, Debug 模式约 5000 次出现一次。
Release 下开5个实例,测试 8000 次未复现。

ids优势没有发挥

PVS

纯 rating:
无ids:8010
ids: 16753 棋谱不变 -3,4

COMPARE_RATING_1ST_VALUE_2ND
无ids: 7117
ids: 17002 自对弈不变

COMPARE_VALUE_1ST_RATING_2ND
无ids:8303
有ids: 18117 棋谱改变, -2,4

MTDF
纯 rating:
无ids: 7985
ids:15557

COMPARE_RATING_1ST_VALUE_2ND
无ids: 6483 棋谱改变,-1,3
有ids: 13663 棋谱改变,-1,1

COMPARE_VALUE_1ST_RATING_2ND
无ids:9016
有ids: 18996 棋谱改变,黑胜 -1,4

开IDS会胜率升3%左右

IDS和无IDS对战
342:2313:124 12.30%:83.23%:4.46%
266:2297:77 10.07%:87.00%:2.91%

IDS自己对战
220:2167:75 8.93%:88.01%:3.04% 白方优势更加明显
非IDS自己对战,
11%:84%:5% 左右

不开IDS会快80.6%

吃子应该的策略

  • 尽量阻止对方下步成三,
  • 如果被吃的子在对方三连中, 尤其是非三连的相邻点上还有对方的子,更吃不得.

d=23还没摆完棋就胜负已定

Thread 2 start
Thread 1 start
Depth: 23
Timeout
Computer: (3,1)

秒棋!
将在 23 步后领先 4 子


Depth: 23
Computer: (1,2)

将在 23 步后双方保持均势


Depth: 23
Computer: (1,1)

坏棋, 被拉回均势!
将在 23 步后双方保持均势


Depth: 23
Computer: (2,1)

将在 23 步后落后 1 子


Depth: 23
Computer: (1,4)

将在 23 步后领先 1 子


Depth: 23
Computer: (3,4)

落后幅度扩大
将在 23 步后落后 2 子


Depth: 23
Computer: (1,6)

领先幅度扩大
将在 23 步后领先 2 子


Depth: 23
Computer: (1,5)

将在 23 步后落后 2 子


Depth: 23
Computer: (1,8)

将在 23 步后领先 2 子


Depth: 23
Computer: (2,2)

落后幅度扩大
将在 23 步后落后 3 子


Depth: 23
Computer: (1,7)

领先幅度扩大
将在 23 步后领先 3 子


Depth: 23
Computer: -(2,1)

将在 23 步后领先 3 子


Depth: 23
Computer: (3,2)

落后幅度扩大
将在 23 步后落后 4 子


Depth: 23
Computer: -(3,1)

将在 23 步后落后 4 子


Depth: 23
Computer: (2,6)

领先幅度扩大
将在 23 步后领先 4 子


Depth: 23
Computer: (3,6)

落后幅度扩大
将在 23 步后落后 5 子


Depth: 23
Computer: (2,7)

领先幅度扩大
将在 23 步后领先 5 子


Depth: 23
Computer: (3,3)

将在 23 步后落后 5 子


Depth: 23
Computer: -(2,7)

落后幅度扩大
将在 23 步后落后 6 子


Depth: 23
Computer: (2,4)

领先幅度扩大
将在 23 步后领先 6 子


Depth: 23
Computer: (3,5)

将在 23 步后落后 6 子


Depth: 23
Computer: -(2,4)

落后幅度扩大
将在 23 步后落后 7 子


Depth: 23
Computer: (2,3)

领先幅度扩大
将在 23 步后领先 7 子


Depth: 23
Computer: (2,5)

将在 23 步后落后 7 子


Depth: 23
Computer: -(2,3)

落后幅度扩大
将在 23 步后落后 8 子


Depth: 23
Computer: (1,3)

领先幅度扩大
将在 23 步后赢棋!


Depth: 23
Computer: (2,8)

落后幅度扩大
将在 23 步后输棋!


Depth: 23
T

点开局时异常

 	ucrtbased.dll!00007ff96e7bb7ec()	Unknown
 	ucrtbased.dll!00007ff96e7bb737()	Unknown
>	NineChess.exe!std::vector<NineChessAi_ab::Node *,std::allocator<NineChessAi_ab::Node *> >::operator[](const unsigned __int64 _Pos) Line 1465	C++
 	NineChess.exe!NineChessAi_ab::bestMove() Line 1116	C++
 	NineChess.exe!AiThread::run() Line 134	C++

    _NODISCARD _Ty& operator[](const size_type _Pos) {
        auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
        _STL_VERIFY(
            _Pos < static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");
#endif // _CONTAINER_DEBUG_LEVEL > 0

        return _My_data._Myfirst[_Pos];
    }

NeedMove赋予更高分数

VALUE_EACH_PIECE_NEEDREMOVE = 200,
VALUE_EACH_PIECE_NEEDREMOVE_2 = 200,

黑方8:3获胜,以往只能拿到36%的胜率.

自对弈黑白胜率不均衡

39%:57% 不均衡。

从第9步开始,黑方深度
若+1,则 42:55
若+2,则42:54
若+3,则47:50
若+4,则50:46

昏着调试

(2,6)
(2,2)

(2.4)
(2,5)

(1,4)
(3,4)

(1,2)
(1.3)

(2.8)

此时白方可能不会堵, 若堵, 自对弈会胜.

如果只用 min max, 结果为:

Depth: 9
Total Time:  691.341 s

31 ----- 24 ----- 25
| \       |      / |
|  23 -- 16 -- 17  |
|  | \    |   / |  |
|  |  15-08-09  |  |
30-22-14    10-18-26
|  |  13-12-11  |  |
|  | /    |   \ |  |
|  21 -- 20 -- 19  |
| /       |      \ |
29 ----- 28 ----- 27

[00] 25	(3,2)	150
[01] 13	(1,6)	150
[02] 31	(3,8)	200
[03] 15	(1,8)	150
[04] 29	(3,6)	150
[05] 16	(2,1)	200
[06] 18	(2,3)	150
[07] 22	(2,7)	150
[08] 8	(1,1)	200
[09] 24	(3,1)	200
[10] 26	(3,3)	0 *
[11] 28	(3,5)	0 *
[12] 14	(1,7)	200
[13] 30	(3,7)	200
[14] 12	(1,5)	150
Evaluated:  1783671724 / 2051658330  =  86 %
Computer: (3,3) 

isEngine2: AI(1) set Action:  "(3,3)"

开置换表后胜率下降3%-6%

哈希是 7172/978=7.33倍

和未开哈希的对战,执黑胜率升3%,执白胜率升6%

376:1240:65 22.36%:73.76%:3.86%
190:1520:65 10.70%:85.63%:3.66%

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.