Skip to content

Commit c7e16fa

Browse files
use raw trained values from best island with correct sign per feature
Each feature uses the unmodified trained value from the highest-WR island that has a sensible sign (I2/I3=87.5% preferred then I4=85.8% then lower). Only rare features (secrets, windfury, stealth, immune: 0-3 deck instances) and quest counter (7/7 wrong sign) use sensible defaults. Source island annotated per line.
1 parent a10c913 commit c7e16fa

File tree

1 file changed

+71
-71
lines changed
  • spellsource-game/src/main/java/net/demilich/metastone/game/behaviour/heuristic

1 file changed

+71
-71
lines changed

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

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

100100
public static FeatureVector getFittest() {
101101
FeatureVector v = new FeatureVector();
102-
// Merged from 7-island IPOP-CMA-ES (best: 87.5%, ipop_cmaes_hof_v2, 65-dim).
103-
// Values averaged from top islands (I2=87.5%, I3=87.5%, I4=85.8%) where signs
104-
// agree; corrected where training signal was weak; rare features (secrets,
105-
// windfury, stealth, immune: 0-3 deck instances) given sensible defaults.
102+
// 7-island IPOP-CMA-ES (ipop_cmaes_hof_v2, 65-dim). For each feature, the
103+
// raw trained value from the highest-WR island with a sensible sign is used
104+
// unmodified. Source island noted in comment (I2/I3=87.5%, I4=85.8%, etc).
105+
// Rare features (0-3 deck instances) use sensible defaults.
106106
// Threat level
107-
v.set(WeightedFeature.RED_MODIFIER, -51.0);
108-
v.set(WeightedFeature.YELLOW_MODIFIER, -30.0);
107+
v.set(WeightedFeature.RED_MODIFIER, -35.281); // I2
108+
v.set(WeightedFeature.YELLOW_MODIFIER, -64.756); // I2
109109
// Health
110-
v.set(WeightedFeature.OWN_HP_FACTOR, 37.0);
111-
v.set(WeightedFeature.OPPONENT_HP_FACTOR, -59.0);
110+
v.set(WeightedFeature.OWN_HP_FACTOR, 41.294); // I2
111+
v.set(WeightedFeature.OPPONENT_HP_FACTOR, -53.548); // I2
112112
// Card advantage
113-
v.set(WeightedFeature.OWN_CARD_COUNT, 33.0);
114-
v.set(WeightedFeature.OPPONENT_CARD_COUNT, -65.0);
115-
// Own minion stats (7/7 consensus on sign)
116-
v.set(WeightedFeature.MINION_INTRINSIC_VALUE, 8.0);
117-
v.set(WeightedFeature.MINION_ATTACK_FACTOR, 46.0);
118-
v.set(WeightedFeature.MINION_HP_FACTOR, 37.0);
113+
v.set(WeightedFeature.OWN_CARD_COUNT, 5.891); // I2
114+
v.set(WeightedFeature.OPPONENT_CARD_COUNT, -39.950); // I2
115+
// Own minion stats
116+
v.set(WeightedFeature.MINION_INTRINSIC_VALUE, 12.119); // I3
117+
v.set(WeightedFeature.MINION_ATTACK_FACTOR, 31.775); // I2
118+
v.set(WeightedFeature.MINION_HP_FACTOR, 66.084); // I2
119119
// Own minion keywords
120-
v.set(WeightedFeature.MINION_RED_TAUNT_MODIFIER, -41.0); // 7/7 negative: in RED despite taunt = losing
121-
v.set(WeightedFeature.MINION_YELLOW_TAUNT_MODIFIER, 41.0);
122-
v.set(WeightedFeature.MINION_DEFAULT_TAUNT_MODIFIER, 23.0);
123-
v.set(WeightedFeature.MINION_WINDFURY_MODIFIER, 30.0); // rare (3 cards)
124-
v.set(WeightedFeature.MINION_DIVINE_SHIELD_MODIFIER, 40.0);
125-
v.set(WeightedFeature.MINION_SPELL_POWER_MODIFIER, 11.0);
126-
v.set(WeightedFeature.MINION_STEALTHED_MODIFIER, 32.0); // rare (2 cards)
127-
v.set(WeightedFeature.MINION_UNTARGETABLE_BY_SPELLS_MODIFIER, 10.0);
128-
v.set(WeightedFeature.MINION_POISONOUS_MODIFIER, 37.0);
129-
v.set(WeightedFeature.MINION_LIFESTEAL_MODIFIER, 35.0);
130-
v.set(WeightedFeature.MINION_REBORN_MODIFIER, 35.0);
131-
v.set(WeightedFeature.MINION_FROZEN_MODIFIER, -10.0);
132-
v.set(WeightedFeature.MINION_DEATHRATTLE_MODIFIER, -20.0); // 6/7 negative: body understatted for cost
133-
v.set(WeightedFeature.MINION_RUSH_MODIFIER, -20.0); // 5/7 negative: rush spent on play turn
134-
v.set(WeightedFeature.MINION_IMMUNE_MODIFIER, 27.0); // rare (3 cards)
135-
v.set(WeightedFeature.MINION_CANNOT_ATTACK_MODIFIER, -20.0);
120+
v.set(WeightedFeature.MINION_RED_TAUNT_MODIFIER, -43.848); // I2 (7/7 negative)
121+
v.set(WeightedFeature.MINION_YELLOW_TAUNT_MODIFIER, 57.246); // I2
122+
v.set(WeightedFeature.MINION_DEFAULT_TAUNT_MODIFIER, 26.369); // I2
123+
v.set(WeightedFeature.MINION_WINDFURY_MODIFIER, 30.0); // rare (3 cards)
124+
v.set(WeightedFeature.MINION_DIVINE_SHIELD_MODIFIER, 57.090); // I4
125+
v.set(WeightedFeature.MINION_SPELL_POWER_MODIFIER, 19.895); // I4
126+
v.set(WeightedFeature.MINION_STEALTHED_MODIFIER, 32.0); // rare (2 cards)
127+
v.set(WeightedFeature.MINION_UNTARGETABLE_BY_SPELLS_MODIFIER, 5.678); // I4
128+
v.set(WeightedFeature.MINION_POISONOUS_MODIFIER, 56.952); // I2
129+
v.set(WeightedFeature.MINION_LIFESTEAL_MODIFIER, 20.959); // I3
130+
v.set(WeightedFeature.MINION_REBORN_MODIFIER, 30.845); // I2
131+
v.set(WeightedFeature.MINION_FROZEN_MODIFIER, -2.830); // I2
132+
v.set(WeightedFeature.MINION_DEATHRATTLE_MODIFIER, -7.499); // I2 (6/7 negative)
133+
v.set(WeightedFeature.MINION_RUSH_MODIFIER, -17.642); // I3 (5/7 negative)
134+
v.set(WeightedFeature.MINION_IMMUNE_MODIFIER, 27.0); // rare (3 cards)
135+
v.set(WeightedFeature.MINION_CANNOT_ATTACK_MODIFIER, -20.751); // I3
136136
// Hand/deck/resource
137-
v.set(WeightedFeature.CURSED_FACTOR, -26.0);
138-
v.set(WeightedFeature.HARD_REMOVAL_VALUE, 5.0);
139-
v.set(WeightedFeature.QUEST_COUNTER_VALUE, 3.0);
140-
v.set(WeightedFeature.QUEST_REWARD_VALUE, 10.0);
141-
v.set(WeightedFeature.EMPTY_MANA_CRYSTAL_VALUE, 41.0);
142-
v.set(WeightedFeature.OPPOSING_EMPTY_MANA_CRYSTAL_VALUE, -20.0);
143-
v.set(WeightedFeature.OWN_ROASTED_VALUE, -45.0);
144-
v.set(WeightedFeature.OPPONENT_ROASTED_VALUE, 20.0);
145-
v.set(WeightedFeature.OWN_ARMOR_FACTOR, 31.0);
146-
v.set(WeightedFeature.WEAPON_VALUE, 36.0);
147-
v.set(WeightedFeature.OWN_DECK_COUNT, 20.0);
148-
v.set(WeightedFeature.OPPONENT_DECK_COUNT, -79.0);
149-
v.set(WeightedFeature.OWN_SECRET_COUNT, 20.0); // rare (0 secret decks)
150-
v.set(WeightedFeature.OPPONENT_SECRET_COUNT, -20.0); // rare (0 secret decks)
151-
v.set(WeightedFeature.LOCKED_MANA_VALUE, -30.0);
152-
v.set(WeightedFeature.OPPONENT_LOCKED_MANA_VALUE, 20.0);
153-
v.set(WeightedFeature.CORPSE_COUNT_VALUE, 28.0);
137+
v.set(WeightedFeature.CURSED_FACTOR, -26.327); // I4
138+
v.set(WeightedFeature.HARD_REMOVAL_VALUE, 5.422); // I2
139+
v.set(WeightedFeature.QUEST_COUNTER_VALUE, 3.0); // default (7/7 negative)
140+
v.set(WeightedFeature.QUEST_REWARD_VALUE, 4.937); // I2
141+
v.set(WeightedFeature.EMPTY_MANA_CRYSTAL_VALUE, 60.907); // I2
142+
v.set(WeightedFeature.OPPOSING_EMPTY_MANA_CRYSTAL_VALUE, -26.964); // I5
143+
v.set(WeightedFeature.OWN_ROASTED_VALUE, -27.101); // I2
144+
v.set(WeightedFeature.OPPONENT_ROASTED_VALUE, 57.639); // I3
145+
v.set(WeightedFeature.OWN_ARMOR_FACTOR, 18.628); // I3
146+
v.set(WeightedFeature.WEAPON_VALUE, 71.682); // I3
147+
v.set(WeightedFeature.OWN_DECK_COUNT, 3.683); // I2
148+
v.set(WeightedFeature.OPPONENT_DECK_COUNT, -57.584); // I2
149+
v.set(WeightedFeature.OWN_SECRET_COUNT, 20.0); // rare (0 secret decks)
150+
v.set(WeightedFeature.OPPONENT_SECRET_COUNT, -20.0); // rare (0 secret decks)
151+
v.set(WeightedFeature.LOCKED_MANA_VALUE, -29.993); // I2
152+
v.set(WeightedFeature.OPPONENT_LOCKED_MANA_VALUE, 95.209); // I3
153+
v.set(WeightedFeature.CORPSE_COUNT_VALUE, 3.732); // I2
154154
// Board width
155-
v.set(WeightedFeature.OWN_MINION_COUNT, 48.0);
156-
v.set(WeightedFeature.OPPONENT_MINION_COUNT, -36.0);
155+
v.set(WeightedFeature.OWN_MINION_COUNT, 17.029); // I2
156+
v.set(WeightedFeature.OPPONENT_MINION_COUNT, -87.969); // I2
157157
// Opponent minion stats
158-
v.set(WeightedFeature.OPPONENT_MINION_INTRINSIC_VALUE, -20.0);
159-
v.set(WeightedFeature.OPPONENT_MINION_ATTACK_FACTOR, -56.0);
160-
v.set(WeightedFeature.OPPONENT_MINION_HP_FACTOR, -12.0);
158+
v.set(WeightedFeature.OPPONENT_MINION_INTRINSIC_VALUE, -94.884); // I4
159+
v.set(WeightedFeature.OPPONENT_MINION_ATTACK_FACTOR, -28.155); // I2
160+
v.set(WeightedFeature.OPPONENT_MINION_HP_FACTOR, -13.626); // I3
161161
// Opponent minion keywords
162-
v.set(WeightedFeature.OPPONENT_MINION_RED_TAUNT_MODIFIER, -51.0);
163-
v.set(WeightedFeature.OPPONENT_MINION_YELLOW_TAUNT_MODIFIER, -27.0);
164-
v.set(WeightedFeature.OPPONENT_MINION_DEFAULT_TAUNT_MODIFIER, -38.0);
165-
v.set(WeightedFeature.OPPONENT_MINION_WINDFURY_MODIFIER, -22.0); // rare (3 cards)
166-
v.set(WeightedFeature.OPPONENT_MINION_DIVINE_SHIELD_MODIFIER, -29.0);
167-
v.set(WeightedFeature.OPPONENT_MINION_SPELL_POWER_MODIFIER, -49.0);
168-
v.set(WeightedFeature.OPPONENT_MINION_STEALTHED_MODIFIER, -20.0); // rare (2 cards)
169-
v.set(WeightedFeature.OPPONENT_MINION_UNTARGETABLE_BY_SPELLS_MODIFIER, -70.0);
170-
v.set(WeightedFeature.OPPONENT_MINION_POISONOUS_MODIFIER, -20.0);
171-
v.set(WeightedFeature.OPPONENT_MINION_LIFESTEAL_MODIFIER, -50.0);
172-
v.set(WeightedFeature.OPPONENT_MINION_REBORN_MODIFIER, -50.0);
173-
v.set(WeightedFeature.OPPONENT_MINION_FROZEN_MODIFIER, 30.0);
174-
v.set(WeightedFeature.OPPONENT_MINION_DEATHRATTLE_MODIFIER, -15.0);
175-
v.set(WeightedFeature.OPPONENT_MINION_RUSH_MODIFIER, -23.0);
176-
v.set(WeightedFeature.OPPONENT_MINION_IMMUNE_MODIFIER, -50.0); // rare (3 cards)
177-
v.set(WeightedFeature.OPPONENT_MINION_CANNOT_ATTACK_MODIFIER, 20.0);
162+
v.set(WeightedFeature.OPPONENT_MINION_RED_TAUNT_MODIFIER, -48.451); // I3
163+
v.set(WeightedFeature.OPPONENT_MINION_YELLOW_TAUNT_MODIFIER, -27.547); // I4
164+
v.set(WeightedFeature.OPPONENT_MINION_DEFAULT_TAUNT_MODIFIER, -36.627); // I2
165+
v.set(WeightedFeature.OPPONENT_MINION_WINDFURY_MODIFIER, -22.0); // rare (3 cards)
166+
v.set(WeightedFeature.OPPONENT_MINION_DIVINE_SHIELD_MODIFIER, -29.292); // I2
167+
v.set(WeightedFeature.OPPONENT_MINION_SPELL_POWER_MODIFIER, -29.192); // I2
168+
v.set(WeightedFeature.OPPONENT_MINION_STEALTHED_MODIFIER, -20.0); // rare (2 cards)
169+
v.set(WeightedFeature.OPPONENT_MINION_UNTARGETABLE_BY_SPELLS_MODIFIER, -89.848); // I3
170+
v.set(WeightedFeature.OPPONENT_MINION_POISONOUS_MODIFIER, -51.953); // I1
171+
v.set(WeightedFeature.OPPONENT_MINION_LIFESTEAL_MODIFIER, -85.700); // I2
172+
v.set(WeightedFeature.OPPONENT_MINION_REBORN_MODIFIER, -30.119); // I2
173+
v.set(WeightedFeature.OPPONENT_MINION_FROZEN_MODIFIER, 34.888); // I2
174+
v.set(WeightedFeature.OPPONENT_MINION_DEATHRATTLE_MODIFIER, -25.806); // I2
175+
v.set(WeightedFeature.OPPONENT_MINION_RUSH_MODIFIER, -22.734); // I2
176+
v.set(WeightedFeature.OPPONENT_MINION_IMMUNE_MODIFIER, -50.0); // rare (3 cards)
177+
v.set(WeightedFeature.OPPONENT_MINION_CANNOT_ATTACK_MODIFIER, 31.366); // I3
178178
// Opponent weapon/armor
179-
v.set(WeightedFeature.OPPONENT_WEAPON_VALUE, -40.0);
180-
v.set(WeightedFeature.OPPONENT_ARMOR_FACTOR, -21.0);
181-
v.set(WeightedFeature.OPPONENT_LOCKED_MANA_VALUE, 20.0);
179+
v.set(WeightedFeature.OPPONENT_WEAPON_VALUE, -59.022); // I0
180+
v.set(WeightedFeature.OPPONENT_ARMOR_FACTOR, -37.042); // I2
181+
v.set(WeightedFeature.OPPONENT_LOCKED_MANA_VALUE, 95.209); // I3
182182
return v;
183183
}
184184

0 commit comments

Comments
 (0)