This is probably the most important part of segmentation. Once the segments are selected, you need to put them in action. As you fire waves and gather information, you add them to the appropriate part of each segment. Logically, the more segments you have and the finer each segment is divided, the more exact you can make your predictions. The downside is that the greater the granularity, the less data you have to make good decisions. So the goal is to maintain the balance between granularity and population. Since the population is constantly increasing, this is the perfect situation to have a dynamic system to balance the two. Ideally, segmentation should begin mostly unsegmented, and then increase to an incredibly fine view as time progresses.
There are two ways to accomplish this. One is to add values to several arrays and then select the array with the best balance. The other is to have a single array of all wanted segments, but starting with a very low division within each segment. These divisions then increase as more data is gained based on what is most effective.
The WikiTargeting/DynamicSegmentation tree approach gives one of the most specific implementations of the granularity method, with processing time being the only big factor.
Now the biggest challenge, and probably the most obscure part of an effective segmentation design, is to decide the best level of segmentation for the data collected. The goal is to find the balance between population and granularity, while trying to get the spikiest profile possible. The granularity is most valuable to be maximized, but there are some situations where the granularity reaches a point where it no longer sacrifices population. For example, at a certain distance, once the granularity for the visit counts is smaller than the width of the robot, using a window smoothing technique you can make the segments as small as you want without losing population. Population is a very tweakable concept, to find a balance to maintain data while still being able to get as much granularity as possible, probably to select a goal average to reach.
My guns lack any kind of DynamicSegmentation? or BinSmoothing or MultipleChoice or any such "advanced" concept. Maybe it is just simplicity that gives them the edge, I might have one of the few quite bug-free implementations. But maybe it just is that all that mumbo-jumbo isn't needed. What you need is collect raw data on carefully selected segmentations and then follow the orders you get from that data without questioning. Blind Faith if you will. Stupid Blind Faith even. The RoboRumble environment is more complex than you think. Your guesses have a high probability of being wrong.
In any case bug-freeness is never wrong. Even when the bugs increase your bot's performance they should be hunted down. They keep you from reaching for the limits of your idea. Keeping it as simple as possible is certainly one way to go about bug-freeness.
Now that is very interesting. I am currently doing my tests using a small variation of the GuessFactorTargeting/Tutorial gun, to which I have created a pluggable segmentation scheme. I havent done many tests yet, but I will like to see how results differ between unsegmented, stationarily segmented, and high level dynamic segmentation. As it appears from your description, it seems that hand crafting is very effective. But then I have a bit of a theory that the best guns vs the best movements boil down to just the best RandomTargeting and flattening there is. What makes movements and targeting stand out, are how they deal with the lesser bots, not the top ones. That is where WaveSurfing made its "splash" (pardon the pun), in that it allowed for the best scores possible against the basic bots. This is also where I feel good targeting is going, not so much to beat the best movements, but to be perfect against those not so great. I remember the first time I put my perfected circular targeting against spin bot, and watched me get 100% accuracy (when it wasnt hitting a wall). I feel that that is the goal of modern targeting, to make a method that will hit walls, spinbot, and all the lesser pattern bots and spiky movers with as great of accuracy as possible. I believe that that is where a good part of your success is coming from, in that you have a very perfectly tuned system. I just wonder how much it could be improved upon. I assume that after 200 rounds or so your gun is far more accurate than it was in the first 10, but how does the accuracy of those early rounds compare to the accuracy of a less or differently segmented gun... Who knows, this is probably all for naught, but I am not quite sure why. -- Jokester
Any general enough and learning gun should be far more accurate after 200 rounds than it is in the first 10 rounds. My guns are tuned for the RoboRumble@Home mostly and that means I want it to be better than other guns in 35 round battles. TargetingChallenge/ResultsFastLearning measures that somewhat better than the 500 rounds version. I call this TC35 and my guns are maybe even stronger there, relatively speaking. Where my gun fails is against WaveSurfers really. Because my gun is the strongest against weak movement. Think about it, even with quite high segmentation weak movements reveal themselves quite fast. If your segemenation is high enough you only need one sample in the most visited segments against really weak movements. High segmentation also helps the most against strong movement. Anyway, Bee actually has a lesser segmented visit counts array which is trying to catch up a bit faster. What I do is I simply overlay the high and low segmented arrays when choosing where to fire. Careful tuning on the segmentation levels here makes quite a big difference. I can also confess I do some BinSmoothing. But it doesn't really make a difference in performance, and I have tested it. Extensively. It just "feels" better to do it than to skip it. (Since it doesn't degrade performance either.) -- PEZ