See one performance related comment below

Diff comments:

> 
> === modified file 'src/ai/defaultai.cc'
> --- src/ai/defaultai.cc       2018-04-29 09:20:29 +0000
> +++ src/ai/defaultai.cc       2018-06-04 21:33:48 +0000
> @@ -2793,11 +2807,128 @@
>                                                  5;
>  
>                                               for (auto ph : 
> bo.production_hints) {
> -                                                     prio += 
> bf->producers_nearby.at(ph) * 5 -
> +                                                     assert(ph != 
> INVALID_INDEX);
> +                                                     prio += 
> bf->collecting_producers_nearby.at(ph) * 5 -
>                                                               
> (expansion_type.get_expansion_type() != ExpansionMode::kEconomy) * 15 -
> -                                                             
> bf->space_consumers_nearby * 5 - bf->rocks_nearby / 3 +
> +                                                             
> bf->space_consumers_nearby * 
> std::abs(management_data.get_military_number_at(102)) / 5 - bf->rocks_nearby 
> / 3 +
>                                                               
> bf->supporters_nearby.at(ph) * 3;
>                                               }
> +                                             // don't block port building 
> spots with trees
> +                                             if 
> (bf->unowned_portspace_vicinity_nearby > 0) {
> +                                                     prio -= 500;
> +                                             }
> +                                             // frisian claypit and frisian 
> farm
> +                                     } else if 
> (bo.is(BuildingAttribute::kSupportingProducer)) {
> +                                             // we dont like trees nearby
> +                                             prio += 1 - bf->trees_nearby / 
> 3;
> +                                             // and be far from rangers
> +                                             prio += 1 - bf->rangers_nearby *
> +                                                                
> std::abs(management_data.get_military_number_at(102)) / 5;
> +
> +                                             // This is for a special case 
> this is also supporter, it considers
> +                                             // producers nearby
> +                                             for (auto ph : 
> bo.production_hints) {
> +                                                     assert(ph != 
> INVALID_INDEX);
> +                                                     prio += 
> management_data.neuron_pool[51].get_result_safe(
> +                                                        
> bf->collecting_producers_nearby.at(ph) * 5, kAbsValue) / 2;
> +                                             }
> +                                             // now we find out if the 
> supporter is needed depending on output stocklevel

One of features of get_stocklevel is that they "cache" the result and dont 
calculate it more frequently than once in 5 seconds. If AI goes over 50 
buildable fields at once, it does not make sense to calculate this every time.
Also if you have calculate_stocklevel elsewhere, try to replace it with 
get_stocklevel.
Of course for testing (temporarily) it is ok

> +                                             output_stocklevel = 
> std::numeric_limits<uint32_t>::max();
> +                                             for (auto ph : bo.outputs) {
> +                                                     const uint32_t res = 
> calculate_stocklevel(static_cast<size_t>(ph), what);
> +                                                     if (res < 
> output_stocklevel) {
> +                                                     output_stocklevel = res;
> +                                                     }
> +                                             }
> +                                             assert(bo.stocklevel_count < 
> std::numeric_limits<uint32_t>::max());
> +
> +                                             // and supported stocklevel
> +                                             const uint32_t 
> supports_stocklevel = (get_stocklevel(bo, gametime));
> +
> +                                             if (supports_stocklevel > 50 && 
> output_stocklevel > 50 &&
> +                                                 
> persistent_data->remaining_basic_buildings.count(bo.id) == 0) {
> +                                                     continue;
> +                                             }
> +
> +                                             if (supports_stocklevel < 40) {
> +                                                     prio += 5 *
> +                                                             
> management_data.neuron_pool[23].get_result_safe(
> +                                                                (40 - 
> supports_stocklevel) / 2, kAbsValue);
> +                                             }
> +                                             if (output_stocklevel < 40) {
> +                                                     prio += 5 *
> +                                                             
> management_data.neuron_pool[23].get_result_safe(
> +                                                                (40 - 
> output_stocklevel) / 2, kAbsValue);
> +                                             }
> +                                             // taking into account the 
> vicinity
> +                                             for (auto ph : 
> bo.production_hints) {
> +                                                     assert(ph != 
> INVALID_INDEX);
> +                                                     prio += 
> bf->collecting_producers_nearby.at(ph) * 10;
> +                                                     prio -= 
> bf->supporters_nearby.at(ph) * 15;
> +                                             }
> +
> +                                             if (bf->enemy_nearby) {  // not 
> close to the enemy
> +                                                     prio -= 20;
> +                                             }
> +
> +                                             // don't block port building 
> spots with immovables
> +                                             if 
> (bo.is(BuildingAttribute::kSpaceConsumer) &&
> +                                                    
> bf->unowned_portspace_vicinity_nearby > 0) {
> +                                                     prio -= 500;
> +                                             }
> +
> +                                             if 
> (bo.is(BuildingAttribute::kSpaceConsumer) && bf->water_nearby) {  // not 
> close to water
> +                                                     prio -= 
> std::abs(management_data.get_military_number_at(103)) / 5;
> +                                             }
> +
> +                                             if 
> (bo.is(BuildingAttribute::kSpaceConsumer) &&
> +                                                 
> bf->unowned_mines_spots_nearby) {  // not close to mountains
> +                                                     prio -= 
> std::abs(management_data.get_military_number_at(104)) / 5;
> +                                             }
> +                                             // frisian berry farm
> +                                     } else if 
> (bo.is(BuildingAttribute::kSpaceConsumer)) {
> +                                             // we dont like trees nearby
> +                                             prio += 1 - bf->trees_nearby / 
> 4;
> +                                             // and be far from rangers
> +                                             prio += 1 - bf->rangers_nearby *
> +                                                                
> std::abs(management_data.get_military_number_at(102)) / 5;
> +
> +                                             // now we find out if the 
> supporter is needed depending on stocklevel
> +                                             const uint32_t 
> current_stocklevel = (get_stocklevel(bo, gametime));
> +
> +                                             if (current_stocklevel > 50 &&
> +                                                 
> persistent_data->remaining_basic_buildings.count(bo.id) == 0) {
> +                                                     continue;
> +                                             }
> +
> +                                             if (current_stocklevel < 40) {
> +                                                     prio += 5 *
> +                                                             
> management_data.neuron_pool[23].get_result_safe(
> +                                                                (40 - 
> current_stocklevel) / 2, kAbsValue);
> +                                             }
> +                                             // taking into account the 
> vicinity
> +                                             for (auto ph : 
> bo.production_hints) {
> +                                                     assert(ph != 
> INVALID_INDEX);
> +                                                     prio += 
> bf->collecting_producers_nearby.at(ph) * 10;
> +                                                     prio -= 
> bf->supporters_nearby.at(ph) * 15;
> +                                             }
> +
> +                                             if (bf->enemy_nearby) {  // not 
> close to the enemy
> +                                                     prio -= 20;
> +                                             }
> +
> +                                             // don't block port building 
> spots with immovables
> +                                             if 
> (bf->unowned_portspace_vicinity_nearby > 0) {
> +                                                     prio -= 500;
> +                                             }
> +
> +                                             if (bf->water_nearby) {  // not 
> close to water
> +                                                     prio -= 
> std::abs(management_data.get_military_number_at(103)) / 5;
> +                                             }
> +
> +                                             if 
> (bf->unowned_mines_spots_nearby) {  // not close to mountains
> +                                                     prio -= 
> std::abs(management_data.get_military_number_at(104)) / 5;
> +                                             }
>  
>                                       } else {  // FISH BREEDERS and GAME 
> KEEPERS
>  


-- 
https://code.launchpad.net/~widelands-dev/widelands/frisian_balancing_with_ai_hints/+merge/347166
Your team Widelands Developers is requested to review the proposed merge of 
lp:~widelands-dev/widelands/frisian_balancing_with_ai_hints into lp:widelands.

_______________________________________________
Mailing list: https://launchpad.net/~widelands-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~widelands-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to