@@ -12,53 +12,160 @@ public class FeatureVector implements Cloneable, Serializable {
1212
1313 public static FeatureVector getDefault () {
1414 FeatureVector defaultVector = new FeatureVector ();
15+ // Threat level modifiers (own perspective: being threatened is bad)
1516 defaultVector .set (WeightedFeature .RED_MODIFIER , -50 );
1617 defaultVector .set (WeightedFeature .YELLOW_MODIFIER , -10 );
18+ // Health
1719 defaultVector .set (WeightedFeature .OWN_HP_FACTOR , 1 );
1820 defaultVector .set (WeightedFeature .OPPONENT_HP_FACTOR , -1 );
21+ // Curses in hand are bad
1922 defaultVector .set (WeightedFeature .CURSED_FACTOR , -25 );
23+ // Card advantage
2024 defaultVector .set (WeightedFeature .OWN_CARD_COUNT , 3 );
2125 defaultVector .set (WeightedFeature .OPPONENT_CARD_COUNT , -3 );
26+ // Own minion keyword modifiers (positive = good for me)
2227 defaultVector .set (WeightedFeature .MINION_INTRINSIC_VALUE , 1 );
2328 defaultVector .set (WeightedFeature .MINION_ATTACK_FACTOR , 1 );
2429 defaultVector .set (WeightedFeature .MINION_HP_FACTOR , 1 );
2530 defaultVector .set (WeightedFeature .MINION_RED_TAUNT_MODIFIER , 8 );
2631 defaultVector .set (WeightedFeature .MINION_YELLOW_TAUNT_MODIFIER , 4 );
2732 defaultVector .set (WeightedFeature .MINION_DEFAULT_TAUNT_MODIFIER , 2 );
28- defaultVector .set (WeightedFeature .MINION_WINDFURY_MODIFIER , 1.5 );
29- defaultVector .set (WeightedFeature .MINION_DIVINE_SHIELD_MODIFIER , 1.5 );
30- defaultVector .set (WeightedFeature .MINION_SPELL_POWER_MODIFIER , 1 );
31- defaultVector .set (WeightedFeature .MINION_STEALTHED_MODIFIER , 1 );
32- defaultVector .set (WeightedFeature .MINION_UNTARGETABLE_BY_SPELLS_MODIFIER , 1.5 );
33+ defaultVector .set (WeightedFeature .MINION_WINDFURY_MODIFIER , 6 );
34+ defaultVector .set (WeightedFeature .MINION_DIVINE_SHIELD_MODIFIER , 5 );
35+ defaultVector .set (WeightedFeature .MINION_SPELL_POWER_MODIFIER , 3 );
36+ defaultVector .set (WeightedFeature .MINION_STEALTHED_MODIFIER , 3 );
37+ defaultVector .set (WeightedFeature .MINION_UNTARGETABLE_BY_SPELLS_MODIFIER , 3 );
38+ defaultVector .set (WeightedFeature .MINION_POISONOUS_MODIFIER , 5 );
39+ defaultVector .set (WeightedFeature .MINION_LIFESTEAL_MODIFIER , 3 );
40+ defaultVector .set (WeightedFeature .MINION_REBORN_MODIFIER , 4 );
41+ defaultVector .set (WeightedFeature .MINION_FROZEN_MODIFIER , -4 );
42+ defaultVector .set (WeightedFeature .MINION_DEATHRATTLE_MODIFIER , 2 );
43+ defaultVector .set (WeightedFeature .MINION_RUSH_MODIFIER , 2 );
44+ defaultVector .set (WeightedFeature .MINION_IMMUNE_MODIFIER , 8 );
45+ defaultVector .set (WeightedFeature .MINION_CANNOT_ATTACK_MODIFIER , -5 );
46+ // Opponent minion keyword modifiers (positive = bad for me, negative = good for me)
47+ defaultVector .set (WeightedFeature .OPPONENT_MINION_INTRINSIC_VALUE , -1 );
48+ defaultVector .set (WeightedFeature .OPPONENT_MINION_ATTACK_FACTOR , -1 );
49+ defaultVector .set (WeightedFeature .OPPONENT_MINION_HP_FACTOR , -1 );
50+ defaultVector .set (WeightedFeature .OPPONENT_MINION_RED_TAUNT_MODIFIER , -4 );
51+ defaultVector .set (WeightedFeature .OPPONENT_MINION_YELLOW_TAUNT_MODIFIER , -2 );
52+ defaultVector .set (WeightedFeature .OPPONENT_MINION_DEFAULT_TAUNT_MODIFIER , -2 );
53+ defaultVector .set (WeightedFeature .OPPONENT_MINION_WINDFURY_MODIFIER , -6 );
54+ defaultVector .set (WeightedFeature .OPPONENT_MINION_DIVINE_SHIELD_MODIFIER , -5 );
55+ defaultVector .set (WeightedFeature .OPPONENT_MINION_SPELL_POWER_MODIFIER , -3 );
56+ defaultVector .set (WeightedFeature .OPPONENT_MINION_STEALTHED_MODIFIER , -4 );
57+ defaultVector .set (WeightedFeature .OPPONENT_MINION_UNTARGETABLE_BY_SPELLS_MODIFIER , -4 );
58+ defaultVector .set (WeightedFeature .OPPONENT_MINION_POISONOUS_MODIFIER , -3 );
59+ defaultVector .set (WeightedFeature .OPPONENT_MINION_LIFESTEAL_MODIFIER , -2 );
60+ defaultVector .set (WeightedFeature .OPPONENT_MINION_REBORN_MODIFIER , -4 );
61+ defaultVector .set (WeightedFeature .OPPONENT_MINION_FROZEN_MODIFIER , 3 );
62+ defaultVector .set (WeightedFeature .OPPONENT_MINION_DEATHRATTLE_MODIFIER , -2 );
63+ defaultVector .set (WeightedFeature .OPPONENT_MINION_RUSH_MODIFIER , 0 );
64+ defaultVector .set (WeightedFeature .OPPONENT_MINION_IMMUNE_MODIFIER , -10 );
65+ defaultVector .set (WeightedFeature .OPPONENT_MINION_CANNOT_ATTACK_MODIFIER , 3 );
66+ // Hard removal in hand is good
3367 defaultVector .set (WeightedFeature .HARD_REMOVAL_VALUE , 2 );
68+ // Quests
3469 defaultVector .set (WeightedFeature .QUEST_COUNTER_VALUE , 3 );
3570 defaultVector .set (WeightedFeature .QUEST_REWARD_VALUE , 9 );
71+ // Mana crystals
3672 defaultVector .set (WeightedFeature .EMPTY_MANA_CRYSTAL_VALUE , 6.5 );
37- defaultVector .set (WeightedFeature .OPPOSING_EMPTY_MANA_CRYSTAL_VALUE , -16 );
73+ defaultVector .set (WeightedFeature .OPPOSING_EMPTY_MANA_CRYSTAL_VALUE , -6.5 );
74+ // Roasted cards
3875 defaultVector .set (WeightedFeature .OWN_ROASTED_VALUE , -15 );
39- defaultVector .set (WeightedFeature .OPPONENT_ROASTED_VALUE , 31 );
76+ defaultVector .set (WeightedFeature .OPPONENT_ROASTED_VALUE , 15 );
77+ // Armor
4078 defaultVector .set (WeightedFeature .OWN_ARMOR_FACTOR , 0.5 );
41- defaultVector .set (WeightedFeature .WEAPON_VALUE , 1 );
79+ defaultVector .set (WeightedFeature .OPPONENT_ARMOR_FACTOR , -0.5 );
80+ // Weapons
81+ defaultVector .set (WeightedFeature .WEAPON_VALUE , 3 );
82+ defaultVector .set (WeightedFeature .OPPONENT_WEAPON_VALUE , -3 );
83+ // Deck size
4284 defaultVector .set (WeightedFeature .OWN_DECK_COUNT , 0.1 );
4385 defaultVector .set (WeightedFeature .OPPONENT_DECK_COUNT , -0.1 );
86+ // Secrets
4487 defaultVector .set (WeightedFeature .OWN_SECRET_COUNT , 3 );
4588 defaultVector .set (WeightedFeature .OPPONENT_SECRET_COUNT , -3 );
46- defaultVector .set (WeightedFeature .MINION_POISONOUS_MODIFIER , 5 );
47- defaultVector .set (WeightedFeature .MINION_LIFESTEAL_MODIFIER , 2 );
48- defaultVector .set (WeightedFeature .MINION_REBORN_MODIFIER , 3 );
49- defaultVector .set (WeightedFeature .MINION_FROZEN_MODIFIER , -3 );
50- defaultVector .set (WeightedFeature .MINION_DEATHRATTLE_MODIFIER , 2 );
51- defaultVector .set (WeightedFeature .MINION_RUSH_MODIFIER , 1 );
52- defaultVector .set (WeightedFeature .MINION_IMMUNE_MODIFIER , 8 );
53- defaultVector .set (WeightedFeature .MINION_CANNOT_ATTACK_MODIFIER , -5 );
89+ // Overload
5490 defaultVector .set (WeightedFeature .LOCKED_MANA_VALUE , -5 );
91+ defaultVector .set (WeightedFeature .OPPONENT_LOCKED_MANA_VALUE , 5 );
92+ // Corpses
5593 defaultVector .set (WeightedFeature .CORPSE_COUNT_VALUE , 0.5 );
94+ // Board width
5695 defaultVector .set (WeightedFeature .OWN_MINION_COUNT , 1 );
96+ defaultVector .set (WeightedFeature .OPPONENT_MINION_COUNT , -1 );
5797 return defaultVector ;
5898 }
5999
60100 public static FeatureVector getFittest () {
61- return getDefault ();
101+ FeatureVector v = new FeatureVector ();
102+ // Trained values from IPOP-CMA-ES (85.8% win rate vs 8-member HoF, island 4, 65-dim)
103+ v .set (WeightedFeature .RED_MODIFIER , -66.553 );
104+ v .set (WeightedFeature .YELLOW_MODIFIER , 36.460 );
105+ v .set (WeightedFeature .OWN_HP_FACTOR , -15.873 );
106+ v .set (WeightedFeature .OPPONENT_HP_FACTOR , -95.412 );
107+ v .set (WeightedFeature .OWN_CARD_COUNT , 60.154 );
108+ v .set (WeightedFeature .OPPONENT_CARD_COUNT , 64.930 );
109+ v .set (WeightedFeature .MINION_INTRINSIC_VALUE , 3.774 );
110+ v .set (WeightedFeature .MINION_ATTACK_FACTOR , 8.600 );
111+ v .set (WeightedFeature .MINION_HP_FACTOR , 22.118 );
112+ v .set (WeightedFeature .MINION_RED_TAUNT_MODIFIER , -57.455 );
113+ v .set (WeightedFeature .MINION_YELLOW_TAUNT_MODIFIER , 25.576 );
114+ v .set (WeightedFeature .MINION_DEFAULT_TAUNT_MODIFIER , 19.269 );
115+ v .set (WeightedFeature .MINION_WINDFURY_MODIFIER , -50.487 );
116+ v .set (WeightedFeature .MINION_DIVINE_SHIELD_MODIFIER , 57.090 );
117+ v .set (WeightedFeature .MINION_SPELL_POWER_MODIFIER , 19.895 );
118+ v .set (WeightedFeature .MINION_STEALTHED_MODIFIER , 55.751 );
119+ v .set (WeightedFeature .MINION_UNTARGETABLE_BY_SPELLS_MODIFIER , 5.678 );
120+ v .set (WeightedFeature .CURSED_FACTOR , -26.327 );
121+ v .set (WeightedFeature .HARD_REMOVAL_VALUE , 3.029 );
122+ v .set (WeightedFeature .QUEST_COUNTER_VALUE , -2.945 );
123+ 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 );
128+ v .set (WeightedFeature .OWN_ARMOR_FACTOR , 42.708 );
129+ v .set (WeightedFeature .WEAPON_VALUE , -58.292 );
130+ v .set (WeightedFeature .OWN_DECK_COUNT , 35.336 );
131+ 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 );
143+ v .set (WeightedFeature .CORPSE_COUNT_VALUE , 18.548 );
144+ v .set (WeightedFeature .OWN_MINION_COUNT , 78.758 );
145+ v .set (WeightedFeature .OPPONENT_MINION_INTRINSIC_VALUE , -94.884 );
146+ v .set (WeightedFeature .OPPONENT_MINION_ATTACK_FACTOR , -71.455 );
147+ v .set (WeightedFeature .OPPONENT_MINION_HP_FACTOR , -10.597 );
148+ v .set (WeightedFeature .OPPONENT_MINION_RED_TAUNT_MODIFIER , -53.569 );
149+ v .set (WeightedFeature .OPPONENT_MINION_YELLOW_TAUNT_MODIFIER , -27.547 );
150+ v .set (WeightedFeature .OPPONENT_MINION_DEFAULT_TAUNT_MODIFIER , -39.826 );
151+ v .set (WeightedFeature .OPPONENT_MINION_WINDFURY_MODIFIER , -51.586 );
152+ v .set (WeightedFeature .OPPONENT_MINION_DIVINE_SHIELD_MODIFIER , 35.722 );
153+ v .set (WeightedFeature .OPPONENT_MINION_SPELL_POWER_MODIFIER , -68.364 );
154+ v .set (WeightedFeature .OPPONENT_MINION_STEALTHED_MODIFIER , 28.510 );
155+ v .set (WeightedFeature .OPPONENT_MINION_UNTARGETABLE_BY_SPELLS_MODIFIER , -69.403 );
156+ v .set (WeightedFeature .OPPONENT_MINION_POISONOUS_MODIFIER , 16.061 );
157+ v .set (WeightedFeature .OPPONENT_MINION_LIFESTEAL_MODIFIER , -49.679 );
158+ v .set (WeightedFeature .OPPONENT_MINION_REBORN_MODIFIER , -93.791 );
159+ 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 );
166+ v .set (WeightedFeature .OPPONENT_ARMOR_FACTOR , -11.655 );
167+ v .set (WeightedFeature .OPPONENT_LOCKED_MANA_VALUE , -16.063 );
168+ return v ;
62169 }
63170
64171 private final Map <WeightedFeature , Double > values = new EnumMap <WeightedFeature , Double >(WeightedFeature .class );
0 commit comments