跳到主要内容

自定义规则与变体

本文介绍 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

延伸阅读