It is an hybrid method between
StatisticalTargeting and Log Targeting. With low segmentation, it works like an statistical gun. With high segmentation it works like a
PatternMatcher (in a way similar to Iiley's
Waves pattern matcher).
It works as follows:
- Every turn, it launches a Waves. When it hits it records the bearing it hit. Instead of adding it to a bearings list, classified by a key (see next item).
- The key is calculated every time a wave is created, and it is an String created from the variables you want to segment that represent the current state of the enemy (this is why I call it Symbolic, because it maps continuous values into a symbol space. The idea is the same implemented in NanoLauLectrik, but you can use more sophisticated keys if you are not restricted by CodeSize). For example, if you are segmenting by enemy velocity and acceleration, you define a function: f(velocity, acceleration) -> String(2)
- When it is about to fire, it calculates the key that corresponds to the current state of the enemy.
- Then, it just searches for all the pairs (key, bearing) previously recorded (or the last 100, or whatever you want) and returns you a list of "bearings to hit".
- Finally , it uses a KernelDensity function to estimate the probability function for a given state and calculate the best bearing to fire (which is the máximum probability point).
- If the search for the keys fails (or doesn't return enough results) it removes the last symbol of the string and tries again. The process is iterative. It means that it works with a high segmentation when there is data available, but reduces it when there is not enough data available. This is because it has DynamicSegmentation?.
Some notes:
- The order of the symbols in the string is important, because it segments by removing them from the end of the string (ie. the last ones should be the least common).
- You can segment for the same variable but with different precision. For example, first for distance in 25 pixels per bucket, then 100.
- Depending on the implementation (hihg segmentation and no minimum number of observations per key), and with enough data available, it behaves like a PatternMatcher.
- If not it behaves like an StatisticalTargeting gun.
- I found two problems right now: The first one is that saving data is not straigh, because to store it eficiently you should save only one bearing per key, compress the keys and probably remove the least used. The second one that you will probably get an SlowBot, because it needs a lot of calculations.
For an implementation, you can check Virus page.
-- Albert
That is a realllly slow gun. I just adapted it to ChumbaWumba, and it runs at about 30-40 fps versus a normal unmodded chumbawumba. -- AaronKrill
Its really odd going throught the wiki and seeing comments on things I don't remember doing. -- Krillr