In [1]:
import numpy as np
from sklearn import tree
In [2]:
ls
In [ ]:
In [13]:
import pickle
path = "training_set/combined.pickle"
entries = []
with open(path, 'br') as infile:
entry = None
while True:
try:
entry = pickle.load(infile)
entries.append(entry)
except EOFError:
break
In [17]:
len(entries)
Out[17]:
In [4]:
In [5]:
Out[5]:
In [30]:
def get_tank_price(game, market):
ind = game['tank_index']
ledgers = market['ledgers']
tank_ledgers = [l for l in ledgers if l['name'] == 'tank']
for ledger in tank_ledgers:
if ledger['index'] == ind:
return ledger['value']
In [19]:
tank = [entry for entry in entries if entry['game']['phase'] == 'tank']
len(tank)
Out[19]:
In [25]:
target_names = [entry['action']['command'] for entry in entries if entry['phase'] == 'tank']
target_names = list(set(target_names))
target_names
Out[25]:
In [20]:
from bots.resource_valuation import rank_resource
In [ ]:
def extract_tank(log_entry):
"""Extract features relevant to tank phase for decision tree building
Score of a resource is a metric of balance between demand and supply
potential of a given resource is the maximal amount that can be produced
"""
market = log_entry['market']
player = log_entry['player']
rivals = log_entry['rivals']
tiles = log_entry['tiles']
game = log_entry['game']
feature_names = ['active_tank_phase','can_afford_tank', 'can_afford_supercharger', 'can_afford_warehouse'
'can_afford_extractor', 'empty_tiles', 'ore_score', 'energy_score',
'water_score', 'quartz_score', 'ore_potential', 'energy_potential',
'water_potential', 'quartz_potential', '']
features = []
targets = ['upgrade_ore_warehouse', 'upgrade_water_warehouse', 'upgrade_energy_warehouse',
'upgrade_quartz_warehouse', 'buy_tank', 'supercharger','energy_extractor',
'ore_extractor', 'quartz_extractor', 'activate', 'pass']
features.append(player['active_tank_phase'])
tank_price = get_tank_price(game, market)
can_afford_tank = player['water'] > 0 and player['cash'] >= tank_price
features.append(can_afford_tank)
rank_resource('water', tiles, market)
return features, feature_names, targets
def
In [9]:
clf = tree.DecisionTreeClassifier()
In [10]:
clf = clf.fit(features, target)
In [11]:
clf
Out[11]:
In [12]:
with open('decision.dot', 'w') as f:
f = tree.export_graphviz(clf, out_file=f)
In [20]:
import pydotplus
from IPython.display import Image
In [26]:
feature_names = ['cash', 'energy', 'energy_capacity', 'ore', 'ore_capacity',
'water', 'water_capacity', 'quartz', 'quartz_capacity'
'specialist_prio', 'energy_price','energy_capacity', 'ore_price', 'ore_capacity',
'water_price', 'water_capacity', 'quartz_price', 'quartz_capacity']
g = tree.export_graphviz(clf, out_file=None,
feature_names=feature_names,
class_names=target_names,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(g)
Image(graph.create_png())
Out[26]:
In [ ]: