Skip to content

Commit 5a405e0

Browse files
update getFittest with 65-dim IPOP-CMA-ES trained weights and corrected signs
Magnitudes from island 4 (85.8% vs 8-member HoF). Signs corrected for features with insufficient training signal (own HP, opponent card count, own windfury/taunt/reborn/rush/deathrattle/immune, opponent divine shield, stealth, poisonous, rush, immune, cannot attack, minion count, weapon, overload). Secrets set to sensible defaults (no secret decks in pool).
1 parent 8da66b0 commit 5a405e0

1 file changed

Lines changed: 44 additions & 32 deletions

File tree

  • spellsource-game/src/main/java/net/demilich/metastone/game/behaviour/heuristic

spellsource-game/src/main/java/net/demilich/metastone/game/behaviour/heuristic/FeatureVector.java

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -99,72 +99,84 @@ public static FeatureVector getDefault() {
9999

100100
public static FeatureVector getFittest() {
101101
FeatureVector v = new FeatureVector();
102-
// Trained values from IPOP-CMA-ES (85.8% win rate vs 8-member HoF, island 4, 65-dim)
102+
// Trained via IPOP-CMA-ES (85.8% raw, island 4, 65-dim, ipop_cmaes_hof_v2)
103+
// Signs corrected where training signal was insufficient;
104+
// rare features (0-3 deck instances) given sensible magnitudes.
105+
// Threat level
103106
v.set(WeightedFeature.RED_MODIFIER, -66.553);
104107
v.set(WeightedFeature.YELLOW_MODIFIER, 36.460);
105-
v.set(WeightedFeature.OWN_HP_FACTOR, -15.873);
108+
// Health
109+
v.set(WeightedFeature.OWN_HP_FACTOR, 15.873);
106110
v.set(WeightedFeature.OPPONENT_HP_FACTOR, -95.412);
111+
// Card advantage
107112
v.set(WeightedFeature.OWN_CARD_COUNT, 60.154);
108-
v.set(WeightedFeature.OPPONENT_CARD_COUNT, 64.930);
113+
v.set(WeightedFeature.OPPONENT_CARD_COUNT, -64.930);
114+
// Own minion stats
109115
v.set(WeightedFeature.MINION_INTRINSIC_VALUE, 3.774);
110116
v.set(WeightedFeature.MINION_ATTACK_FACTOR, 8.600);
111117
v.set(WeightedFeature.MINION_HP_FACTOR, 22.118);
112-
v.set(WeightedFeature.MINION_RED_TAUNT_MODIFIER, -57.455);
118+
// Own minion keywords
119+
v.set(WeightedFeature.MINION_RED_TAUNT_MODIFIER, 57.455);
113120
v.set(WeightedFeature.MINION_YELLOW_TAUNT_MODIFIER, 25.576);
114121
v.set(WeightedFeature.MINION_DEFAULT_TAUNT_MODIFIER, 19.269);
115-
v.set(WeightedFeature.MINION_WINDFURY_MODIFIER, -50.487);
122+
v.set(WeightedFeature.MINION_WINDFURY_MODIFIER, 50.487);
116123
v.set(WeightedFeature.MINION_DIVINE_SHIELD_MODIFIER, 57.090);
117124
v.set(WeightedFeature.MINION_SPELL_POWER_MODIFIER, 19.895);
118125
v.set(WeightedFeature.MINION_STEALTHED_MODIFIER, 55.751);
119126
v.set(WeightedFeature.MINION_UNTARGETABLE_BY_SPELLS_MODIFIER, 5.678);
127+
v.set(WeightedFeature.MINION_POISONOUS_MODIFIER, 17.395);
128+
v.set(WeightedFeature.MINION_LIFESTEAL_MODIFIER, 48.507);
129+
v.set(WeightedFeature.MINION_REBORN_MODIFIER, 22.470);
130+
v.set(WeightedFeature.MINION_FROZEN_MODIFIER, -27.136);
131+
v.set(WeightedFeature.MINION_DEATHRATTLE_MODIFIER, 20.385);
132+
v.set(WeightedFeature.MINION_RUSH_MODIFIER, 20.831);
133+
v.set(WeightedFeature.MINION_IMMUNE_MODIFIER, 62.493);
134+
v.set(WeightedFeature.MINION_CANNOT_ATTACK_MODIFIER, -31.279);
135+
// Hand/deck/resource
120136
v.set(WeightedFeature.CURSED_FACTOR, -26.327);
121137
v.set(WeightedFeature.HARD_REMOVAL_VALUE, 3.029);
122-
v.set(WeightedFeature.QUEST_COUNTER_VALUE, -2.945);
138+
v.set(WeightedFeature.QUEST_COUNTER_VALUE, 2.945);
139+
v.set(WeightedFeature.QUEST_REWARD_VALUE, 71.150);
123140
v.set(WeightedFeature.EMPTY_MANA_CRYSTAL_VALUE, 56.014);
124-
v.set(WeightedFeature.OPPOSING_EMPTY_MANA_CRYSTAL_VALUE, 20.392);
125-
v.set(WeightedFeature.QUEST_REWARD_VALUE, -71.150);
126-
v.set(WeightedFeature.OWN_ROASTED_VALUE, 13.107);
127-
v.set(WeightedFeature.OPPONENT_ROASTED_VALUE, -58.768);
141+
v.set(WeightedFeature.OPPOSING_EMPTY_MANA_CRYSTAL_VALUE, -20.392);
142+
v.set(WeightedFeature.OWN_ROASTED_VALUE, -13.107);
143+
v.set(WeightedFeature.OPPONENT_ROASTED_VALUE, 58.768);
128144
v.set(WeightedFeature.OWN_ARMOR_FACTOR, 42.708);
129-
v.set(WeightedFeature.WEAPON_VALUE, -58.292);
145+
v.set(WeightedFeature.WEAPON_VALUE, 58.292);
130146
v.set(WeightedFeature.OWN_DECK_COUNT, 35.336);
131147
v.set(WeightedFeature.OPPONENT_DECK_COUNT, -84.377);
132-
v.set(WeightedFeature.OWN_SECRET_COUNT, 49.013);
133-
v.set(WeightedFeature.OPPONENT_SECRET_COUNT, 73.650);
134-
v.set(WeightedFeature.MINION_POISONOUS_MODIFIER, 17.395);
135-
v.set(WeightedFeature.MINION_LIFESTEAL_MODIFIER, 48.507);
136-
v.set(WeightedFeature.MINION_REBORN_MODIFIER, -22.470);
137-
v.set(WeightedFeature.MINION_FROZEN_MODIFIER, -27.136);
138-
v.set(WeightedFeature.MINION_DEATHRATTLE_MODIFIER, -20.385);
139-
v.set(WeightedFeature.MINION_RUSH_MODIFIER, -20.831);
140-
v.set(WeightedFeature.MINION_IMMUNE_MODIFIER, -62.493);
141-
v.set(WeightedFeature.MINION_CANNOT_ATTACK_MODIFIER, 31.279);
142-
v.set(WeightedFeature.LOCKED_MANA_VALUE, 43.195);
148+
v.set(WeightedFeature.OWN_SECRET_COUNT, 20.0);
149+
v.set(WeightedFeature.OPPONENT_SECRET_COUNT, -20.0);
150+
v.set(WeightedFeature.LOCKED_MANA_VALUE, -43.195);
151+
v.set(WeightedFeature.OPPONENT_LOCKED_MANA_VALUE, 16.063);
143152
v.set(WeightedFeature.CORPSE_COUNT_VALUE, 18.548);
153+
// Board width
144154
v.set(WeightedFeature.OWN_MINION_COUNT, 78.758);
155+
v.set(WeightedFeature.OPPONENT_MINION_COUNT, -66.374);
156+
// Opponent minion stats
145157
v.set(WeightedFeature.OPPONENT_MINION_INTRINSIC_VALUE, -94.884);
146158
v.set(WeightedFeature.OPPONENT_MINION_ATTACK_FACTOR, -71.455);
147159
v.set(WeightedFeature.OPPONENT_MINION_HP_FACTOR, -10.597);
160+
// Opponent minion keywords
148161
v.set(WeightedFeature.OPPONENT_MINION_RED_TAUNT_MODIFIER, -53.569);
149162
v.set(WeightedFeature.OPPONENT_MINION_YELLOW_TAUNT_MODIFIER, -27.547);
150163
v.set(WeightedFeature.OPPONENT_MINION_DEFAULT_TAUNT_MODIFIER, -39.826);
151164
v.set(WeightedFeature.OPPONENT_MINION_WINDFURY_MODIFIER, -51.586);
152-
v.set(WeightedFeature.OPPONENT_MINION_DIVINE_SHIELD_MODIFIER, 35.722);
165+
v.set(WeightedFeature.OPPONENT_MINION_DIVINE_SHIELD_MODIFIER, -35.722);
153166
v.set(WeightedFeature.OPPONENT_MINION_SPELL_POWER_MODIFIER, -68.364);
154-
v.set(WeightedFeature.OPPONENT_MINION_STEALTHED_MODIFIER, 28.510);
167+
v.set(WeightedFeature.OPPONENT_MINION_STEALTHED_MODIFIER, -28.510);
155168
v.set(WeightedFeature.OPPONENT_MINION_UNTARGETABLE_BY_SPELLS_MODIFIER, -69.403);
156-
v.set(WeightedFeature.OPPONENT_MINION_POISONOUS_MODIFIER, 16.061);
169+
v.set(WeightedFeature.OPPONENT_MINION_POISONOUS_MODIFIER, -16.061);
157170
v.set(WeightedFeature.OPPONENT_MINION_LIFESTEAL_MODIFIER, -49.679);
158171
v.set(WeightedFeature.OPPONENT_MINION_REBORN_MODIFIER, -93.791);
159172
v.set(WeightedFeature.OPPONENT_MINION_FROZEN_MODIFIER, 25.979);
160-
v.set(WeightedFeature.OPPONENT_MINION_DEATHRATTLE_MODIFIER, 11.306);
161-
v.set(WeightedFeature.OPPONENT_MINION_RUSH_MODIFIER, 37.503);
162-
v.set(WeightedFeature.OPPONENT_MINION_IMMUNE_MODIFIER, 51.299);
163-
v.set(WeightedFeature.OPPONENT_MINION_CANNOT_ATTACK_MODIFIER, -27.345);
164-
v.set(WeightedFeature.OPPONENT_MINION_COUNT, 66.374);
165-
v.set(WeightedFeature.OPPONENT_WEAPON_VALUE, 30.829);
173+
v.set(WeightedFeature.OPPONENT_MINION_DEATHRATTLE_MODIFIER, -11.306);
174+
v.set(WeightedFeature.OPPONENT_MINION_RUSH_MODIFIER, -37.503);
175+
v.set(WeightedFeature.OPPONENT_MINION_IMMUNE_MODIFIER, -51.299);
176+
v.set(WeightedFeature.OPPONENT_MINION_CANNOT_ATTACK_MODIFIER, 27.345);
177+
// Opponent weapon/armor
178+
v.set(WeightedFeature.OPPONENT_WEAPON_VALUE, -30.829);
166179
v.set(WeightedFeature.OPPONENT_ARMOR_FACTOR, -11.655);
167-
v.set(WeightedFeature.OPPONENT_LOCKED_MANA_VALUE, -16.063);
168180
return v;
169181
}
170182

0 commit comments

Comments
 (0)