跳至主要内容

自訂規則與變體

本文介紹 KataGo 支援的各種圍棋規則、棋盤大小變體,以及如何自訂規則設定。


規則集總覽

主要規則比較

規則集計目方式貼目自殺手打劫還原
Chinese數子法7.5禁止禁止
Japanese數目法6.5禁止禁止
Korean數目法6.5禁止禁止
AGA混合7.5禁止禁止
New Zealand數子法7允許禁止
Tromp-Taylor數子法7.5允許禁止

KataGo 設定

# config.cfg
rules = chinese # 規則集
komi = 7.5 # 貼目
boardXSize = 19 # 棋盤寬度
boardYSize = 19 # 棋盤高度

中國規則(Chinese)

特點

計目方式:數子法(子空皆地)
貼目:7.5 目
自殺手:禁止
打劫還原:禁止(簡易規則)

數子法說明

最終得分 = 己方棋子數 + 己方空點數

範例:
黑子 120 顆 + 黑空 65 點 = 185 點
白子 100 顆 + 白空 75 點 + 貼目 7.5 = 182.5 點
黑勝 2.5 點

KataGo 設定

rules = chinese
komi = 7.5

日本規則(Japanese)

特點

計目方式:數目法(只算空點)
貼目:6.5 目
自殺手:禁止
打劫還原:禁止
需要標記死子

數目法說明

最終得分 = 己方空點數 + 提掉的對方棋子數

範例:
黑空 65 點 + 提子 10 顆 = 75 點
白空 75 點 + 提子 5 顆 + 貼目 6.5 = 86.5 點
白勝 11.5 目

死子判定

日本規則需要雙方同意哪些棋是死子:

def is_dead_by_japanese_rules(group, game_state):
"""日本規則下判定死子"""
# 需要證明該棋串無法做出兩眼
# 這是日本規則的複雜之處
pass

KataGo 設定

rules = japanese
komi = 6.5

AGA 規則

特點

美國圍棋協會(AGA)規則結合了中日規則的優點:

計目方式:混合(數子或數目皆可,結果相同)
貼目:7.5 目
自殺手:禁止
白方需填一子來 pass

Pass 規則

黑方 pass:不需填子
白方 pass:需要向黑方交出一顆子

這讓數子法和數目法結果一致

KataGo 設定

rules = aga
komi = 7.5

Tromp-Taylor 規則

特點

最簡潔的圍棋規則,適合程式實作:

計目方式:數子法
貼目:7.5 目
自殺手:允許
打劫還原:Super Ko(禁止任何重複局面)
無需判定死子

Super Ko

def is_superko_violation(new_state, history):
"""檢查是否違反 Super Ko"""
for past_state in history:
if new_state == past_state:
return True
return False

終局判定

無需雙方同意死子
比賽持續直到:
1. 雙方連續 pass
2. 然後用搜索或實際下完來確定領地

KataGo 設定

rules = tromp-taylor
komi = 7.5

棋盤大小變體

支援的尺寸

KataGo 支援多種棋盤大小:

尺寸特點建議用途
9×9約 81 點初學、快棋
13×13約 169 點進階學習
19×19361 點標準比賽
自訂任意研究、測試

設定方式

# 9×9 棋盤
boardXSize = 9
boardYSize = 9
komi = 5.5

# 13×13 棋盤
boardXSize = 13
boardYSize = 13
komi = 6.5

# 非正方形棋盤
boardXSize = 19
boardYSize = 9

貼目建議

尺寸中國規則日本規則
9×95.55.5
13×136.56.5
19×197.56.5

讓子設定

讓子棋

讓子是調整棋力差距的方式:

# 讓 2 子
handicap = 2

# 讓 9 子
handicap = 9

讓子位置

HANDICAP_POSITIONS = {
2: [(3, 15), (15, 3)],
3: [(3, 15), (15, 3), (15, 15)],
4: [(3, 15), (15, 3), (3, 3), (15, 15)],
# 5-9 子使用星位 + 天元
}

讓子時的貼目

# 傳統:讓子不貼目或貼半目
komi = 0.5

# 現代:根據讓子數調整
# 每子約值 10-15 目

Analysis 模式規則設定

GTP 指令

# 設定規則
kata-set-rules chinese

# 設定貼目
komi 7.5

# 設定棋盤大小
boardsize 19

Analysis API

{
"id": "query1",
"moves": [["B", "Q4"], ["W", "D4"]],
"rules": "chinese",
"komi": 7.5,
"boardXSize": 19,
"boardYSize": 19,
"overrideSettings": {
"maxVisits": 1000
}
}

進階規則選項

自殺手設定

# 禁止自殺(預設)
allowSuicide = false

# 允許自殺(Tromp-Taylor 風格)
allowSuicide = true

Ko 規則

# Simple Ko(僅禁止立即還原)
koRule = SIMPLE

# Positional Super Ko(禁止重複任何局面,不論輪到誰下)
koRule = POSITIONAL

# Situational Super Ko(禁止重複同一方下的局面)
koRule = SITUATIONAL

計分規則

# 數子法(中國、AGA)
scoringRule = AREA

# 數目法(日本、韓國)
scoringRule = TERRITORY

稅金規則

有些規則對雙活區域有特殊計分:

# 無稅金
taxRule = NONE

# 雙活無目
taxRule = SEKI

# 所有眼位無目
taxRule = ALL

多規則訓練

KataGo 的優勢

KataGo 使用單一模型支援多種規則:

def encode_rules(rules):
"""將規則編碼為神經網路輸入"""
features = np.zeros(RULE_FEATURE_SIZE)

# 計分方式
features[0] = 1.0 if rules.scoring == 'area' else 0.0

# 自殺手
features[1] = 1.0 if rules.allow_suicide else 0.0

# Ko 規則
features[2:5] = encode_ko_rule(rules.ko)

# 貼目(正規化)
features[5] = rules.komi / 15.0

return features

規則感知輸入

神經網路輸入包含:
- 棋盤狀態(19×19×N)
- 規則特徵向量(K 維)

這讓同一模型能理解不同規則

規則切換範例

Python 程式碼

from katago import KataGo

engine = KataGo(model_path="kata.bin.gz")

# 中國規則分析
result_cn = engine.analyze(
moves=[("B", "Q4"), ("W", "D4")],
rules="chinese",
komi=7.5
)

# 日本規則分析(同一局面)
result_jp = engine.analyze(
moves=[("B", "Q4"), ("W", "D4")],
rules="japanese",
komi=6.5
)

# 比較差異
print(f"中國規則黑勝率: {result_cn['winrate']:.1%}")
print(f"日本規則黑勝率: {result_jp['winrate']:.1%}")

規則影響分析

def compare_rules_impact(position, rules_list):
"""比較不同規則對局面評估的影響"""
results = {}

for rules in rules_list:
analysis = engine.analyze(
moves=position,
rules=rules,
komi=get_default_komi(rules)
)
results[rules] = {
'winrate': analysis['winrate'],
'score': analysis['scoreLead'],
'best_move': analysis['moveInfos'][0]['move']
}

return results

常見問題

規則差異造成的勝負不同

同一盤棋,不同規則可能導致不同結果:
- 數子法 vs 數目法的計分差異
- 雙活區域的處理
- 虛手(pass)的影響

選擇哪種規則?

場景建議規則
初學者Chinese(直觀、無爭議)
線上比賽平台預設(通常是 Chinese)
日本棋院Japanese
程式實作Tromp-Taylor(最簡潔)
中國職業賽Chinese

模型是否需要針對特定規則訓練?

KataGo 的多規則模型已經很強。但如果只使用單一規則,可以考慮:

# 固定規則訓練(可能略微提升特定規則下的棋力)
rules = chinese

延伸閱讀