diff --git a/docs/experiment_round40_waste0.1.json b/docs/experiment_round40_waste0.1.json new file mode 100644 index 0000000..dfd6403 --- /dev/null +++ b/docs/experiment_round40_waste0.1.json @@ -0,0 +1,82 @@ +{ + "config": { + "ckpt": "ml/runs/base_dag2_dag1/best.pt", + "samples": "ml/data/samples", + "tasks": null, + "split": "val", + "n": 256, + "K": 8, + "commit": 2, + "fb": 2.2, + "ki": 0.0, + "fb_scale": 0.0, + "fb_near": 0.2, + "fb_fallback": 0.0, + "kdecay": 0.9, + "kimax": 0.5, + "fb_every": 1, + "safety_try": 0, + "sel_w": 0.1, + "dls_safety": 1, + "fb_clear": 0.0, + "fb_cmin": 0.3, + "sub_refresh": 0, + "fb_block_gain": 0.5, + "dump": null, + "out": "docs/experiment_round40_waste0.1.json", + "trace": null, + "select": "ep_waste", + "replan": "empty", + "safety": 1, + "partial": 1, + "inc_cap": 1, + "gap_margin": 0.0, + "cert_batch": 0, + "steps": 1, + "z_scale": 1.0, + "len_w": 0.1, + "backoff": 0, + "max_sec": null, + "seed": 0, + "dls": "analytic", + "device": "cuda" + }, + "batch_size": 256, + "batch_seed_rule": "same seed per batch", + "checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1", + "tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772", + "kin_fp": "2ebcbf17", + "act_scale": 1.0, + "metrics": { + "n": 256, + "n_ref": 256, + "success": 0.515625, + "collision_free_success": 0.515625, + "time_ok_1p3": 0.26953125, + "collision_rate": 0.0, + "collision_steps_mean": 0.0, + "travel_ratio_median": 2.669708251953125, + "time_mean_s": 2.452272653579712, + "brakes_mean": 19.39453125, + "start_fail": 0.0, + "goal_ratio_2s": 0.28827616572380066, + "err_fail_med": 201.7505645751953, + "err_success_med": 0.20423255860805511, + "dls_share": 0.609375, + "time_budget": "teacher×2(≥3 s)", + "speed_ratio_p50": 1.0000016689300537, + "speed_ratio_p95": 1.0000101327896118, + "speed_ratio_max": 1.0000101327896118, + "over_vmax_rate": 0.0, + "accel_ratio_p95": 1.0000016689300537, + "accel_ratio_max": 1.0000101327896118, + "reverse_p50": 0.2527472674846649, + "reverse_mean": 0.262615442276001, + "reverse_moving_p50": 0.31912145018577576, + "moving_share_p50": 0.9599999785423279, + "brake_rate_mean": 0.09945914149284363, + "brake_rate_p50": 0.0051282052882015705, + "n_plans_mean": 195.0 + }, + "simulation_wall_s": 308.12369770000805 +} diff --git a/docs/experiment_round40_waste0.3.json b/docs/experiment_round40_waste0.3.json new file mode 100644 index 0000000..e15d828 --- /dev/null +++ b/docs/experiment_round40_waste0.3.json @@ -0,0 +1,82 @@ +{ + "config": { + "ckpt": "ml/runs/base_dag2_dag1/best.pt", + "samples": "ml/data/samples", + "tasks": null, + "split": "val", + "n": 256, + "K": 8, + "commit": 2, + "fb": 2.2, + "ki": 0.0, + "fb_scale": 0.0, + "fb_near": 0.2, + "fb_fallback": 0.0, + "kdecay": 0.9, + "kimax": 0.5, + "fb_every": 1, + "safety_try": 0, + "sel_w": 0.1, + "dls_safety": 1, + "fb_clear": 0.0, + "fb_cmin": 0.3, + "sub_refresh": 0, + "fb_block_gain": 0.5, + "dump": null, + "out": "docs/experiment_round40_waste0.3.json", + "trace": null, + "select": "ep_waste", + "replan": "empty", + "safety": 1, + "partial": 1, + "inc_cap": 1, + "gap_margin": 0.0, + "cert_batch": 0, + "steps": 1, + "z_scale": 1.0, + "len_w": 0.3, + "backoff": 0, + "max_sec": null, + "seed": 0, + "dls": "analytic", + "device": "cuda" + }, + "batch_size": 256, + "batch_seed_rule": "same seed per batch", + "checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1", + "tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772", + "kin_fp": "2ebcbf17", + "act_scale": 1.0, + "metrics": { + "n": 256, + "n_ref": 256, + "success": 0.515625, + "collision_free_success": 0.515625, + "time_ok_1p3": 0.265625, + "collision_rate": 0.0, + "collision_steps_mean": 0.0, + "travel_ratio_median": 2.5349059104919434, + "time_mean_s": 2.476060628890991, + "brakes_mean": 19.62890625, + "start_fail": 0.0, + "goal_ratio_2s": 0.31392601132392883, + "err_fail_med": 200.5723876953125, + "err_success_med": 0.16847863793373108, + "dls_share": 0.609375, + "time_budget": "teacher×2(≥3 s)", + "speed_ratio_p50": 1.0000016689300537, + "speed_ratio_p95": 1.0000101327896118, + "speed_ratio_max": 1.0000101327896118, + "over_vmax_rate": 0.0, + "accel_ratio_p95": 1.0000016689300537, + "accel_ratio_max": 1.0000101327896118, + "reverse_p50": 0.25111111998558044, + "reverse_mean": 0.26184794306755066, + "reverse_moving_p50": 0.3268229067325592, + "moving_share_p50": 0.9636363387107849, + "brake_rate_mean": 0.10066106170415878, + "brake_rate_p50": 0.0051282052882015705, + "n_plans_mean": 195.0 + }, + "simulation_wall_s": 299.3823047999904 +} diff --git a/docs/experiment_round40_waste1.0.json b/docs/experiment_round40_waste1.0.json new file mode 100644 index 0000000..508c642 --- /dev/null +++ b/docs/experiment_round40_waste1.0.json @@ -0,0 +1,82 @@ +{ + "config": { + "ckpt": "ml/runs/base_dag2_dag1/best.pt", + "samples": "ml/data/samples", + "tasks": null, + "split": "val", + "n": 256, + "K": 8, + "commit": 2, + "fb": 2.2, + "ki": 0.0, + "fb_scale": 0.0, + "fb_near": 0.2, + "fb_fallback": 0.0, + "kdecay": 0.9, + "kimax": 0.5, + "fb_every": 1, + "safety_try": 0, + "sel_w": 0.1, + "dls_safety": 1, + "fb_clear": 0.0, + "fb_cmin": 0.3, + "sub_refresh": 0, + "fb_block_gain": 0.5, + "dump": null, + "out": "docs/experiment_round40_waste1.0.json", + "trace": null, + "select": "ep_waste", + "replan": "empty", + "safety": 1, + "partial": 1, + "inc_cap": 1, + "gap_margin": 0.0, + "cert_batch": 0, + "steps": 1, + "z_scale": 1.0, + "len_w": 1.0, + "backoff": 0, + "max_sec": null, + "seed": 0, + "dls": "analytic", + "device": "cuda" + }, + "batch_size": 256, + "batch_seed_rule": "same seed per batch", + "checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1", + "tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772", + "kin_fp": "2ebcbf17", + "act_scale": 1.0, + "metrics": { + "n": 256, + "n_ref": 256, + "success": 0.48828125, + "collision_free_success": 0.48828125, + "time_ok_1p3": 0.23828125, + "collision_rate": 0.0, + "collision_steps_mean": 0.0, + "travel_ratio_median": 2.708263874053955, + "time_mean_s": 2.5168001651763916, + "brakes_mean": 20.02734375, + "start_fail": 0.0, + "goal_ratio_2s": 0.3584502637386322, + "err_fail_med": 190.41900634765625, + "err_success_med": 0.33570292592048645, + "dls_share": 0.60546875, + "time_budget": "teacher×2(≥3 s)", + "speed_ratio_p50": 1.0000016689300537, + "speed_ratio_p95": 1.0000101327896118, + "speed_ratio_max": 1.0000101327896118, + "over_vmax_rate": 0.0, + "accel_ratio_p95": 1.0000016689300537, + "accel_ratio_max": 1.0000101327896118, + "reverse_p50": 0.24899598956108093, + "reverse_mean": 0.2592279314994812, + "reverse_moving_p50": 0.3214285671710968, + "moving_share_p50": 0.9587156176567078, + "brake_rate_mean": 0.10270433127880096, + "brake_rate_p50": 0.010256410576403141, + "n_plans_mean": 195.0 + }, + "simulation_wall_s": 297.2535624000011 +} diff --git a/docs/探索日志.md b/docs/探索日志.md index 917277f..a1dbc76 100644 --- a/docs/探索日志.md +++ b/docs/探索日志.md @@ -141,6 +141,23 @@ - 与失败分类完全对上:63/109"走一半被冻住"就是这批题;**它们同时也是到达缺口的全部来源**(可拿的 +25 pp 区间就在这批题里)。所以攻它们不是锦上添花,是主攻方向。 - 待办(等链跑完再改库,避免重犯 14:45 那次事故):给 `eval_cl` 补 `brake_rate_p90` 与 `stuck_share`(判据 `brake_rate > 0.2` 的题占比)。 +## `ep_waste` 三臂也是负结论,但给出了原因:罚的是没被执行的那段地平线(轮次 42) + +- 同一 256 题同 seed、`--inc_cap 1`,只改 `select=ep_waste --len_w`(罚 `1 − 同轴净/总` × 当前误差): + + | 臂 | 到达 | 时限内 | 行程比 | 刹车/题 | 刹停率 mean / p50 | 换向率 | + |---|---|---|---|---|---|---| + | 对照(endpoint,1 步限幅) | 0.5234 | 0.2656 | 2.6158 | 19.55 | ≈0.099 / — | 离线 0.247 | + | waste 0.1 | 0.5156 | 0.2695 | 2.6697 | 19.39 | 0.0995 / 0.005 | 0.2527 | + | waste 0.3 | 0.5156 | 0.2656 | **2.5349** | 19.63 | 0.1007 / 0.005 | 0.2511 | + | waste 1.0 | **0.4883** | **0.2383** | 2.7083 | 20.03 | 0.1027 / 0.010 | 0.2490 | + + (`docs/experiment_round40_waste{0.1,0.3,1.0}.json`) +- **行程比没有随权重单调下降**(2.67 → 2.53 → 2.71 vs 对照 2.62):0.3 那一格看着像改善,但两侧都比它差 ⇒ 不是趋势,不能拿单点报"行程降了 0.08"。权重加到 1.0 时到达 −3.5 pp、时限 −2.7 pp,纯亏。 +- **原因(这条比结论更有用)**:打分用的浪费比例是在**候选的 16 步地平线**上算的,而每拍真正提交只有 `commit_n=2` 步。排序被"后面 14 步会不会来回抖"牵着走,执行的前 2 步基本不变 ⇒ 改了顺序改不了行为。**要影响执行,惩罚必须只算在会被提交的那段前缀上。** +- 与 `ep_len` 三臂合起来看:**选择期的"路径形状类"惩罚(总行程 / 浪费比例)在两个版本上都是负结论**,而选择期的"多给活路"(K=16 +3.9 pp)和"几何信息进打分"(#24,待测)才是对的方向。差别在于前者动的是没被执行的那段,后者动的是被拒/被选的那 2 步。 +- 内部一致性:`brake_rate_mean` 0.0995/0.1007/0.1027 与 `brakes_mean/n_plans` = 19.4/195 ≈ 0.0995 逐位对得上 ⇒ 刚补的分母口径没接错。 + ## K=16 串行 vs 批量认证等价 + 第一次真正核算"刹停率"(轮次 41) - `--K 16 --cert_batch 1` 与 `--K 16`(串行)跑同一 256 题同 seed:`success / time_ok_1p3 / brakes_mean / travel_ratio_median / collision_*` **全部逐位相同**,差异键只有 7 个、且全是我这几轮新加/改口径的报表键(`reverse_*` 的两种口径、`n_plans`、`brake_rate`、`moving_share`)。⇒ **轮次 39 的"试候选数 1/3/8/16 曲线"同样描述批量口径**,也就是说 K=16 到达 0.5625 这个收益不依赖串行早停这个巧合。