Beer Distribution Game Reinforcement Learning

Test notebook
Keywords

agent-based modeling, reinforcement-learning, beergame, beer distribution game

Beer Distribution Game Reinforcement Learning

from BPTK_Py.bptk import bptk 
bptk = bptk()
bptk.train_scenarios(
    episodes=10,
    scenario_managers=["smBeergameQlOB"],
    scenarios=["train_agents"],
    agents=["controlling"],
    agent_states=["active"],
    agent_properties=["supply_chain_reward"],
    agent_property_types=["total"],
    return_df=False,
    progress_bar=True
)

Persist Q-Tables

It takes quite some time to train q-tables and they can become quite large:

Q-Table Counts
Brewery: 3
Distributor: 4
Wholesaler: 5
Retailer: 10
from src.abm.q_learning_ob.beergame import BeergameQlOB

# Captured: marimo sends a cell's stdout to the console, not into the page.
with mo.capture_stdout() as q_table_counts:
    print("Q-Table Counts")
    print("Brewery: {}".format(BeergameQlOB.brewery_q_table.count()))
    print("Distributor: {}".format(BeergameQlOB.distributor_q_table.count()))
    print("Wholesaler: {}".format(BeergameQlOB.wholesaler_q_table.count()))
    print("Retailer: {}".format(BeergameQlOB.retailer_q_table.count()))

mo.plain_text(q_table_counts.getvalue())

Hence it makes sense to dump the trained q-tables so they can be reused:

This is the one cell on this page that is shown rather than run: it writes into data/, which a documentation build has no business doing - the q-tables there are tracked inputs of the other beergame pages. Nothing reads q_tables_10.json, so the call is here to show how it is done.

BeergameQlOB.dump_q_tables("data/q_tables_10.json", "JSON")

Load Q-Tables

Reset the q-tables:

from src.abm.q_learning_base.sparseQTable import SparseQTable
BeergameQlOB.brewery_q_table=SparseQTable(dimension=1)
BeergameQlOB.distributor_q_table=SparseQTable(dimension=1)
BeergameQlOB.wholesaler_q_table=SparseQTable(dimension=1)
BeergameQlOB.retailer_q_table=SparseQTable(dimension=1)

Load previously saved q-tables:

BeergameQlOB.load_q_tables("data/q_tables_50000.json","JSON")

Use Training Results

bptk.reset_scenario(scenario_manager="smBeergameQlOB",scenario="smart_agents")
bptk.plot_scenarios(
    scenario_managers=["smBeergameQlOB"],
    kind="area",
    scenarios=["smart_agents"],
    agents=["brewery","distributor","wholesaler","retailer"],
    agent_states=["active"],
    agent_properties=["order_balance"],
    agent_property_types=["total"], format="axes"
)
bptk.plot_scenarios(
    scenario_managers=["smBeergameQlOB"],
    kind="area",
    scenarios=["smart_agents"],
    agents=["brewery","distributor","wholesaler","retailer"],
    agent_states=["active"],
    agent_properties=["outgoing_order"],
    agent_property_types=["total"], format="axes"
)
bptk.plot_scenarios(
    scenario_managers=["smBeergameQlOB"],
    kind="area",
    scenarios=["smart_agents"],
    agents=["brewery","distributor","wholesaler","retailer"],
    agent_states=["active"],
    agent_properties=["total_cost"],
    agent_property_types=["total"], format="axes"
)
bptk.plot_scenarios(
    scenario_managers=["smBeergameQlOB"],
    kind="area",
    scenarios=["smart_agents"],
    agents=["controlling"],
    agent_states=["active"],
    agent_properties=["supply_chain_cost","target_supply_chain_cost"],
    agent_property_types=["total"], format="axes"
)
bptk.plot_scenarios(
    scenario_managers=["smBeergameQlOB"],
    kind="area",
    scenarios=["smart_agents"],
    agents=["brewery","distributor","wholesaler","retailer"],
    agent_states=["active"],
    agent_properties=["inventory"],
    agent_property_types=["total"], format="axes"
)
bptk.plot_scenarios(
    scenario_managers=["smBeergameQlOB"],
    kind="area",
    scenarios=["smart_agents"],
    agents=["brewery","distributor","wholesaler","retailer"],
    agent_states=["active"],
    agent_properties=["backorder"],
    agent_property_types=["total"], format="axes"
)