Wow, nice PWIN scores! Is this just using a tick flattener? I know that was something I added to DrussGT but never saw any real benefit from - then again, I never weighted it at 100% either.
Thanks a lot! The published version is using one single tree as a tick flattener and another tree as ordinary hit stats. The secret is that I don't accumulate the danger from the two trees (like some logic "or"), rather, I multiplies them (like some logic "and"). This way, I'm moving to where they are not probably firing at, instead of avoiding where they are probably firing at ;)
I think this approach makes my movement even more unpredictable than a) hit stats only; b) flattener only; c) the sum of both. As for strong guns, they are firing everywhere, which leaves no safe spot (except for bullet shadows, which, should for the same reason, improve the score dramatically).
Worth mention that I take the idea originally from ABC, but I could not recall where the page is ;/ I had tried this idea years ago, but it wasn't work IIRC.
Interesting approach! I had a similar idea around multi-bot targeting in Neuromancer where I do an XOR instead of simple OR because the bullet can only hit one of the potential enemies. I think this idea might have some real potential - although I think maybe using fire-only waves might get you even better scores against a lot of enemies and their anti-surfer guns.
You can be sure that there will be some experiments with DrussGT in the not too distant future =)
More thoughts on this.
When you only work with bullet hits, you can only be reactive to changes in the enemy targeting. Modern bots are designed around this, and they do a really good job with the limited information they have available too (see for example DrussGT's score on the Shark Challenge part 2) - even with complicated learning guns like RaikoMicro it is possible to effectively predict and dodge to get better results than a random gun would give.
However, the holy grail has always been to somehow predict where the enemy will shoot even before finding any bullets there. Theoretically we have the information we need to do that - we know where we were, we know what GFs for both hits and visits were logged, we could even model the type of gun the enemy has based on the bullet hits and (theoretically) transfer this learning across to the visits data. However until now there hasn't been any successful demonstration of using this pre-emptive data beyond just making a movement that is "flat with flat sauce" rather than taylor-made to dodge a specific gun.
I know in the past [[User::Voidious]] did quite a few experiments around adding very weak tick-wave flattening against mid-level opponents but was never able to realise any measurable gains. If this is able to be replicated across others bots and stats systems I see this as a great step-wise improvement in the state-of-the-art of Robocode, much like taking advantage of Bullet Shadows.
Another possibility why fuzzy AND works is that it simulates enemy data decay better, since they are decaying on visit, not hit. This way, I would not be dodging out dated data which reduced my movement options and therefore increase predictability.
If this is true, then why this doesn't work against weaker guns may be that the tick flattener is simulating the decay rate of strong guns, not weaker guns.
IMO The reason why OR approach doesn't work is that when you are already doing better than perfect random movement, being flat actually decreases your score. And unless your segmentation and decay matches them perfectly, you will end up a) dodging some bullet they will fire in the future — and making them not firing at there by avoiding there; b) dodging bullets that already hits you, this won't further help as well.
So I did some quick experiments doing this with DrussGT and I saw a significant performance decrease. However, I think I'll need to re-tune the bandwidth / smoothing kernel, since now that it is effectively being squared it is much narrower.
Well, I think this approach first helped me against their Main guns. Then, as unpredictability improved, their AS guns also have some trouble hitting me. Anyway, adding virtuality dimension may further help ;)
I've also been thinking about simulating the fact that bullets can only hit one enemy at a time. But what I came up with is to use max(enemy1, enemy2) instead of enemy1 XOR enemy2, since when I have 50% probability hitting enemy1 and 75% probability hitting enemy2 at the same bearing offset, I'll end up 75% probability hitting an enemy, instead of 125% ;p. Anyway, by XOR, do you mean to do some max - min? Or "enemy1 + enemy2 - 2 * enemy1 * enemy2" like fuzzy XOR?
Your formula for the max(enemy1,enemy2) is incorrect. Given your example of 75% and 50%, if you miss the first one then you still have 50% chance of hitting the second one. You don't add them to get 125%, instead it is P += Pn * (1 - P) so you get .75 + .5*(1-.75) = .875
This is what I'm doing in Neuromancer. I guess it isn't exactly an XOR, but it does take both the hit probability and the miss probability into account correctly for multiple enemies.