Merge lp:~widelands-dev/widelands/ai_scoring_update into lp:widelands

Proposed by TiborB
Status: Merged
Merged at revision: 8649
Proposed branch: lp:~widelands-dev/widelands/ai_scoring_update
Merge into: lp:widelands
Diff against target: 125 lines (+34/-32)
4 files modified
src/ai/ai_help_structs.cc (+21/-26)
src/ai/ai_help_structs.h (+2/-3)
src/ai/defaultai.cc (+9/-3)
src/ai/defaultai.h (+2/-0)
To merge this branch: bzr merge lp:~widelands-dev/widelands/ai_scoring_update
Reviewer Review Type Date Requested Status
GunChleoc Approve
Review via email: mp+342831@code.launchpad.net

Commit message

Tweaking scoring of AI performance, used for training of AI. No effect on gameplay altogether.

Description of the change

Tweaking scoring of AI performance, used for training of AI. No effect on gameplay altogether. Main changes is in review() function that just print out a score with some details. Out of it I added just one variable first_iron_mine_built used only for the review function.

To post a comment you must log in.
Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 3358. State: passed. Details: https://travis-ci.org/widelands/widelands/builds/363583953.
Appveyor build 3164. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_ai_scoring_update-3164.

Revision history for this message
GunChleoc (gunchleoc) wrote :

Just 1 code style nit. can go in when it's fixed.

review: Approve
Revision history for this message
TiborB (tiborb95) wrote :

fixed

@bunnybot merge

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/ai/ai_help_structs.cc'
2--- src/ai/ai_help_structs.cc 2018-04-07 16:59:00 +0000
3+++ src/ai/ai_help_structs.cc 2018-04-08 18:40:46 +0000
4@@ -565,33 +565,28 @@
5 const uint32_t old_land,
6 const uint16_t attackers,
7 const int16_t trained_soldiers,
8- const int16_t latest_attackers,
9- const uint16_t conq_ws,
10 const uint16_t strength,
11- const uint32_t existing_ps) {
12-
13- const int16_t main_bonus =
14- ((static_cast<int32_t>(land - old_land) > 0 && land > max_e_land * 5 / 6 && attackers > 0 &&
15- trained_soldiers > 0 && latest_attackers > 0) ?
16- kBonus :
17- 0);
18-
19- const int16_t land_delta_bonus = static_cast<int16_t>(land - old_land) * kLandDeltaMultiplier;
20-
21- const uint32_t ps_sites_bonus = kPSitesRatioMultiplier * std::pow(existing_ps, 3) / 1000 / 1000;
22-
23- score = land / kCurrentLandDivider + land_delta_bonus + main_bonus +
24- attackers * kAttackersMultiplier + ((attackers > 0) ? kAttackBonus : -kAttackBonus) +
25- trained_soldiers * kTrainedSoldiersScore + kConqueredWhBonus * conq_ws +
26- strength * kStrengthMultiplier + ps_sites_bonus - 500 * kPSitesRatioMultiplier;
27-
28- log(" %2d %s: reviewing AI mngm. data, sc: %5d Pr.p: %d (l:%4d/%s/%4d, "
29- "at:%4d(%3d),ts:%4d/%2d,cWH:%2d,str:%2d/%4d,ps:%4d/%4d)\n",
30- pn, gamestring_with_leading_zeros(gametime), score, primary_parent,
31- land / kCurrentLandDivider, (main_bonus) ? "*" : " ", land_delta_bonus,
32- attackers * kAttackersMultiplier, latest_attackers, trained_soldiers * kTrainedSoldiersScore,
33- trained_soldiers, conq_ws, strength, strength * kStrengthMultiplier, existing_ps,
34- ps_sites_bonus);
35+ const uint32_t existing_ps,
36+ const uint32_t first_iron_mine_time) {
37+
38+ // bonuses (1000 or nothing)
39+ const uint16_t territory_bonus = (land > old_land || land > max_e_land) ? 1000 : 0;
40+ const uint16_t iron_mine_bonus = (first_iron_mine_time < 2 * 60 * 60 * 1000) ? 1000 : 0;
41+ const uint16_t attack_bonus = (attackers > 0) ? 1000 : 0;
42+ const uint16_t training_bonus = (trained_soldiers > 0) ? 1000 : 0;
43+
44+ // scores (numbers dependant on performance)
45+ const uint16_t land_score = land / kCurrentLandDivider;
46+ const uint16_t strength_score = std::min<uint16_t>(strength, 100) * kStrengthMultiplier;
47+ const uint16_t attack_score = std::min<uint16_t>(attackers, 40) * 50;
48+ const uint32_t ps_sites_score = kPSitesRatioMultiplier * std::pow(existing_ps, 3) / 1000 / 1000;
49+
50+ score = territory_bonus + iron_mine_bonus + attack_bonus + training_bonus + land_score + strength_score + ps_sites_score + attack_score;
51+
52+ log(" %2d %s: reviewing AI mngm. data, sc: %5d Pr.p: %d (Bonuses:Te:%s I:%s A:%s Tr:%s, Scores:Land:%5d Str:%4d PS:%4d, Att:%4d\n",
53+ pn, gamestring_with_leading_zeros(gametime), score, primary_parent,
54+ (territory_bonus) ? "Y" : "N", (iron_mine_bonus) ? "Y" : "N", (attack_bonus)? "Y" : "N", (training_bonus) ? "Y" : "N",
55+ land_score, strength_score, ps_sites_score, attack_score);
56
57 if (score < -10000 || score > 30000) {
58 log("%2d %s: reviewing AI mngm. data, score too extreme: %4d\n", pn,
59
60=== modified file 'src/ai/ai_help_structs.h'
61--- src/ai/ai_help_structs.h 2018-04-08 09:23:39 +0000
62+++ src/ai/ai_help_structs.h 2018-04-08 18:40:46 +0000
63@@ -678,10 +678,9 @@
64 uint32_t old_land,
65 uint16_t attackers,
66 int16_t trained_soldiers,
67- int16_t latest_attackers,
68- uint16_t conq_ws,
69 uint16_t strength,
70- uint32_t existing_ps);
71+ uint32_t existing_ps,
72+ uint32_t first_iron_mine_time);
73 void dump_data(PlayerNumber);
74 uint16_t new_neuron_id() {
75 ++next_neuron_id;
76
77=== modified file 'src/ai/defaultai.cc'
78--- src/ai/defaultai.cc 2018-04-08 09:23:39 +0000
79+++ src/ai/defaultai.cc 2018-04-08 18:40:46 +0000
80@@ -108,6 +108,7 @@
81 next_mine_construction_due_(0),
82 fishers_count_(0),
83 bakeries_count_(),
84+ first_iron_mine_built(50 * 60 * 60 * 1000),
85 ts_finished_count_(0),
86 ts_in_const_count_(0),
87 ts_without_trainers_(0),
88@@ -473,9 +474,9 @@
89 gametime, player_number(), player_statistics.get_player_land(player_number()),
90 player_statistics.get_enemies_max_land(),
91 player_statistics.get_old60_player_land(player_number()), attackers_count_,
92- soldier_trained_log.count(gametime), soldier_attacks_log.count(gametime),
93- conquered_wh, player_statistics.get_player_power(player_number()),
94- count_productionsites_without_buildings());
95+ soldier_trained_log.count(gametime), player_statistics.get_player_power(player_number()),
96+ count_productionsites_without_buildings(),
97+ first_iron_mine_built);
98 set_taskpool_task_time(
99 gametime + kManagementUpdateInterval, SchedulerTaskId::kManagementUpdate);
100 }
101@@ -6135,6 +6136,11 @@
102
103 set_inputs_to_zero(mines_.back());
104
105+ // Is this first mine?
106+ if (bo.mines == iron_resource_id && gametime < first_iron_mine_built) {
107+ first_iron_mine_built = gametime;
108+ }
109+
110 } else if (bo.type == BuildingObserver::Type::kMilitarysite) {
111 militarysites.push_back(MilitarySiteObserver());
112 militarysites.back().site = &dynamic_cast<MilitarySite&>(b);
113
114=== modified file 'src/ai/defaultai.h'
115--- src/ai/defaultai.h 2018-04-07 16:59:00 +0000
116+++ src/ai/defaultai.h 2018-04-08 18:40:46 +0000
117@@ -352,6 +352,8 @@
118 uint16_t fishers_count_;
119 uint16_t bakeries_count_;
120
121+ uint32_t first_iron_mine_built;
122+
123 // for training sites per type
124 int16_t ts_finished_count_;
125 int16_t ts_in_const_count_;

Subscribers

People subscribed via source and target branches

to status/vote changes: