refactor(波2 目录收尾): game/smoke/ 目录退役——44 件探针三件套迁 game/probe/、30 件测量/诊断/驱动件迁 game/sim/;全仓 100+ 处 res://smoke 与 game/smoke 引用改指(闸件/产品码 tune_sim_controller/宿主 preload/根规则/README/设计文档);熵增闸 RETIRED 收编 game/smoke 防回潮;AGENTS.md Project Layout 换代;static_scan 豁免理由换新宿主;波 2 施工件预计算表全部命中(8d 预扫零红灯);全量域闸验收通过零新增红
This commit is contained in:
1 parent
c5f1383766
commit
16c6f1362e
110 files changed
+139
-7305
No files matched your search
@@ -0,0 +1,68 @@
|
||||
# VERTICAL SLICE - NOT FOR PRODUCTION
|
||||
# 一次性实验:不同 mine_density 下的 R₀ 占比 / 幸存雷数 / 残余挖掘量 / 推理率——为切片临时调参提供数据。
|
||||
extends SceneTree
|
||||
|
||||
func _initialize() -> void:
|
||||
var db = load("res://core/config_db.gd").new()
|
||||
db.load_tables("res://data/tables", true)
|
||||
var board_generator = load("res://core/board_generator.gd").new()
|
||||
print("=== 密度实验(L1 10×10 target0.88 / L2 12×12 target0.90,各 8 种子)===")
|
||||
print("d\t|M|/N\tR₀\tR₀/|S|\t残余挖掘\tinf\tatt")
|
||||
for d in [0.22, 0.25, 0.28, 0.30, 0.33]:
|
||||
for cfg in [[10, 10, 0.88, 50], [12, 12, 0.90, 60]]:
|
||||
var w: int = cfg[0]
|
||||
var h: int = cfg[1]
|
||||
var t: float = cfg[2]
|
||||
var ms: int = cfg[3]
|
||||
var agg := {"m": 0, "r0": 0, "rem": 0, "inf": 0.0, "att": 0, "n": 0}
|
||||
for s in range(8):
|
||||
var row := {
|
||||
"level_index": 1, "node_depth": 0, "board_width": w, "board_height": h,
|
||||
"mine_density": d, "inferability_target": t, "solver_rules": "single_subset",
|
||||
"min_safe_count": ms, "max_gen_attempts": 16,
|
||||
"board_type": "dungeon",
|
||||
}
|
||||
_patch_row(row, d)
|
||||
var params := _params_from(row)
|
||||
var rg := RandomNumberGenerator.new()
|
||||
rg.seed = 1000 + s
|
||||
var b = board_generator.generate(1, 0, rg, _db(db, row))
|
||||
if b == null:
|
||||
continue
|
||||
agg.m += b.mines.size()
|
||||
agg.r0 += int(b.metrics.r0_count)
|
||||
agg.rem += b.safe_cells().size() - int(b.metrics.r0_count)
|
||||
agg.inf += float(b.metrics.inferability)
|
||||
agg.att += int(b.metrics.attempts_used)
|
||||
agg.n += 1
|
||||
if agg.n > 0:
|
||||
var n := float(agg.n)
|
||||
var n_placed: int = int(round(d * float(w * h - 9)))
|
||||
print("%.2f %dx%d\t%d/%d\t%d\t%.2f\t%d\t%.3f\t%.1f" % [d, w, h, int(agg.m / n + 0.5), n_placed, int(agg.r0 / n + 0.5), agg.r0 / n / (w * h - int(agg.m / n + 0.5)), int(agg.rem / n + 0.5), agg.inf / n, agg.att / n])
|
||||
quit(0)
|
||||
|
||||
# --- 简易 db 替身:只供给本实验的行 ---
|
||||
var _row_override: Dictionary = {}
|
||||
|
||||
func _patch_row(row: Dictionary, _d: float) -> void:
|
||||
_row_override = row
|
||||
|
||||
func _params_from(row: Dictionary) -> Dictionary:
|
||||
return {
|
||||
"L": 1, "D": 0, "w": int(row.board_width), "h": int(row.board_height),
|
||||
"density": float(row.mine_density), "target": float(row.inferability_target),
|
||||
"solver_rules": "single_subset", "min_safe": int(row.min_safe_count),
|
||||
"max_attempts": int(row.max_gen_attempts), "board_type": "dungeon",
|
||||
}
|
||||
|
||||
class FakeDB:
|
||||
var row: Dictionary
|
||||
func resolve_board_gen(_L: int, _D: int) -> Dictionary:
|
||||
return row
|
||||
func status_effect_row(_id: String) -> Dictionary:
|
||||
return {}
|
||||
|
||||
func _db(_real, row: Dictionary):
|
||||
var f := FakeDB.new()
|
||||
f.row = row
|
||||
return f
|
||||
Reference in new issue
Block a user