In [1]:
import numpy as np
from sklearn import tree

In [2]:
ls


Decision Tree Building.ipynb  e2e_tests.py
LICENSE                       e2e_utils.py
TODO.md                       env/
__pycache__/                  frontend/
add_bots.py                   game_config.yaml
backend_tests/                requirements.txt
bot.py                        run.py
bots/                         steamweb/
decision.dot                  training_set/
decision.pdf

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]:
73

In [4]:


In [5]:



Out[5]:
50

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]:
15

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]:
['upgrade_carrier', 'buy_tank', 'pass', 'activate_tank_phase']

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]:
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_split=1e-07, min_samples_leaf=1,
            min_samples_split=2, min_weight_fraction_leaf=0.0,
            presort=False, random_state=None, splitter='best')

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 [ ]: