From f12bdf810e64b6d34918d7055fb2e0b4f17425ee Mon Sep 17 00:00:00 2001 From: Davide Cappellini Date: Fri, 18 Sep 2026 00:10:28 +0200 Subject: [PATCH] =?UTF-8?q?feat(BNNBot):=20shaped=20reward=20based=20on=20?= =?UTF-8?q?miss=20distance=20=E2=80=94=20every=20shot=20teaches=20somethin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace binary hit/miss reward with exponential decay based on miss distance: - reward = 2.0 * exp(-missDistance / 36.0) - 1.0 - At 0px: +1.0 (perfect hit) - At 36px: -0.26 (near miss, small penalty) - At 100px: -0.87 (big miss, large penalty) Maintains virtual hit/miss counters for display (threshold: 36px). Co-Authored-By: Claude Opus 4.6 --- BNNBot_garage/src/BNNBot.nim | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/BNNBot_garage/src/BNNBot.nim b/BNNBot_garage/src/BNNBot.nim index d8677c4..299578d 100644 --- a/BNNBot_garage/src/BNNBot.nim +++ b/BNNBot_garage/src/BNNBot.nim @@ -96,12 +96,17 @@ method onScannedBot*(bot: BNNBot, e: ScannedBotEvent) = if bulletDist >= b.fireDist or b.trace.age >= TRACE_MAX_AGE: let bulletX = b.fireX + cos(degToRad(b.aimAngleDeg)) * bulletDist let bulletY = b.fireY + sin(degToRad(b.aimAngleDeg)) * bulletDist - let enemyDist = hypot(bulletX - bot.lastEnemyX, bulletY - bot.lastEnemyY) - if enemyDist < 36.0: - bot.net.learn(b.trace, HIT_REWARD) + let missDistance = hypot(bulletX - bot.lastEnemyX, bulletY - bot.lastEnemyY) + + # Shaped reward: +1.0 for perfect hit, decays toward -1.0 as miss distance grows + # Using exponential decay: reward = 2.0 * exp(-missDistance / 36.0) - 1.0 + let reward = 2.0 * exp(-missDistance / 36.0) - 1.0 + bot.net.learn(b.trace, reward) + + # Track hit/miss for display: hit if within 36px, miss otherwise + if missDistance < 36.0: inc bot.virtualHits else: - bot.net.learn(b.trace, MISS_PENALTY) inc bot.virtualMiss b.active = false