zjowowen's picture
init space
079c32c
raw
history blame
17.3 kB
import argparse
import os
import numpy as np
def str2bool(v):
return v.lower() in ('true', '1')
arg_lists = []
parser = argparse.ArgumentParser()
def add_argument_group(name):
arg = parser.add_argument_group(name)
arg_lists.append(arg)
return arg
# crm
game_arg = add_argument_group('BeerGame')
game_arg.add_argument('--task', type=str, default='bg')
game_arg.add_argument(
'--fixedAction',
type=str2bool,
default='False',
help='if you want to have actions in [0,actionMax] set it to True. with False it will set it [actionLow, actionUp]'
)
game_arg.add_argument(
'--observation_data',
type=str2bool,
default=False,
help='if it is True, then it uses the data that is generated by based on few real world observation'
)
game_arg.add_argument('--data_id', type=int, default=22, help='the default item id for the basket dataset')
game_arg.add_argument('--TLow', type=int, default=100, help='duration of one GAME (lower bound)')
game_arg.add_argument('--TUp', type=int, default=100, help='duration of one GAME (upper bound)')
game_arg.add_argument(
'--demandDistribution',
type=int,
default=0,
help='0=uniform, 1=normal distribution, 2=the sequence of 4,4,4,4,8,..., 3= basket data, 4= forecast data'
)
game_arg.add_argument(
'--scaled', type=str2bool, default=False, help='if true it uses the (if) existing scaled parameters'
)
game_arg.add_argument('--demandSize', type=int, default=6100, help='the size of demand dataset')
game_arg.add_argument('--demandLow', type=int, default=0, help='the lower bound of random demand')
game_arg.add_argument('--demandUp', type=int, default=3, help='the upper bound of random demand')
game_arg.add_argument('--demandMu', type=float, default=10, help='the mu of the normal distribution for demand ')
game_arg.add_argument('--demandSigma', type=float, default=2, help='the sigma of the normal distribution for demand ')
game_arg.add_argument('--actionMax', type=int, default=2, help='it works when fixedAction is True')
game_arg.add_argument(
'--actionUp', type=int, default=2, help='bounds on my decision (upper bound), it works when fixedAction is True'
)
game_arg.add_argument(
'--actionLow', type=int, default=-2, help='bounds on my decision (lower bound), it works when fixedAction is True'
)
game_arg.add_argument(
'--action_step', type=int, default=1, help='The obtained action value by dnn is multiplied by this value'
)
game_arg.add_argument('--actionList', type=list, default=[], help='The list of the available actions')
game_arg.add_argument('--actionListLen', type=int, default=0, help='the length of the action list')
game_arg.add_argument(
'--actionListOpt', type=int, default=0, help='the action list which is used in optimal and sterman'
)
game_arg.add_argument('--actionListLenOpt', type=int, default=0, help='the length of the actionlistopt')
game_arg.add_argument('--agentTypes', type=list, default=['dnn', 'dnn', 'dnn', 'dnn'], help='the player types')
game_arg.add_argument(
'--agent_type1', type=str, default='dnn', help='the player types for agent 1, it can be dnn, Strm, bs, rnd'
)
game_arg.add_argument(
'--agent_type2', type=str, default='dnn', help='the player types for agent 2, it can be dnn, Strm, bs, rnd'
)
game_arg.add_argument(
'--agent_type3', type=str, default='dnn', help='the player types for agent 3, it can be dnn, Strm, bs, rnd'
)
game_arg.add_argument(
'--agent_type4', type=str, default='dnn', help='the player types for agent 4, it can be dnn, Strm, bs, rnd'
)
game_arg.add_argument('--NoAgent', type=int, default=4, help='number of agents, currently it should be in {1,2,3,4}')
game_arg.add_argument('--cp1', type=float, default=2.0, help='shortage cost of player 1')
game_arg.add_argument('--cp2', type=float, default=0.0, help='shortage cost of player 2')
game_arg.add_argument('--cp3', type=float, default=0.0, help='shortage cost of player 3')
game_arg.add_argument('--cp4', type=float, default=0.0, help='shortage cost of player 4')
game_arg.add_argument('--ch1', type=float, default=2.0, help='holding cost of player 1')
game_arg.add_argument('--ch2', type=float, default=2.0, help='holding cost of player 2')
game_arg.add_argument('--ch3', type=float, default=2.0, help='holding cost of player 3')
game_arg.add_argument('--ch4', type=float, default=2.0, help='holding cost of player 4')
game_arg.add_argument('--alpha_b1', type=float, default=-0.5, help='alpha of Sterman formula parameter for player 1')
game_arg.add_argument('--alpha_b2', type=float, default=-0.5, help='alpha of Sterman formula parameter for player 2')
game_arg.add_argument('--alpha_b3', type=float, default=-0.5, help='alpha of Sterman formula parameter for player 3')
game_arg.add_argument('--alpha_b4', type=float, default=-0.5, help='alpha of Sterman formula parameter for player 4')
game_arg.add_argument('--betta_b1', type=float, default=-0.2, help='beta of Sterman formula parameter for player 1')
game_arg.add_argument('--betta_b2', type=float, default=-0.2, help='beta of Sterman formula parameter for player 2')
game_arg.add_argument('--betta_b3', type=float, default=-0.2, help='beta of Sterman formula parameter for player 3')
game_arg.add_argument('--betta_b4', type=float, default=-0.2, help='beta of Sterman formula parameter for player 4')
game_arg.add_argument('--eta', type=list, default=[0, 4, 4, 4], help='the total cost regulazer')
game_arg.add_argument('--distCoeff', type=int, default=20, help='the total cost regulazer')
game_arg.add_argument(
'--ifUseTotalReward',
type=str2bool,
default='False',
help='if you want to have the total rewards in the experience replay, set it to true.'
)
game_arg.add_argument(
'--ifUsedistTotReward',
type=str2bool,
default='True',
help='If use correction to the rewards in the experience replay for all iterations of current game'
)
game_arg.add_argument(
'--ifUseASAO',
type=str2bool,
default='True',
help='if use AS and AO, i.e., received shipment and received orders in the input of DNN'
)
game_arg.add_argument('--ifUseActionInD', type=str2bool, default='False', help='if use action in the input of DNN')
game_arg.add_argument(
'--stateDim', type=int, default=5, help='Number of elements in the state desciptor - Depends on ifUseASAO'
)
game_arg.add_argument('--iftl', type=str2bool, default=False, help='if apply transfer learning')
game_arg.add_argument(
'--ifTransferFromSmallerActionSpace',
type=str2bool,
default=False,
help='if want to transfer knowledge from a network with different action space size.'
)
game_arg.add_argument(
'--baseActionSize',
type=int,
default=5,
help='if ifTransferFromSmallerActionSpace is true, this determines the size of action space of saved network'
)
game_arg.add_argument(
'--tlBaseBrain',
type=int,
default=3,
help='the gameConfig of the base network for re-training with transfer-learning'
)
game_arg.add_argument('--baseDemandDistribution', type=int, default=0, help='same as the demandDistribution')
game_arg.add_argument(
'--MultiAgent', type=str2bool, default=False, help='if run multi-agent RL model, not fully operational'
)
game_arg.add_argument(
'--MultiAgentRun',
type=list,
default=[True, True, True, True],
help='In the multi-RL setting, it determines which agent should get training.'
)
game_arg.add_argument(
'--if_use_AS_t_plus_1', type=str2bool, default='False', help='if use AS[t+1], not AS[t] in the input of DNN'
)
game_arg.add_argument(
'--ifSinglePathExist',
type=str2bool,
default=False,
help='If true it uses the predefined path in pre_model_dir and does not merge it with demandDistribution.'
)
game_arg.add_argument('--gamma', type=float, default=.99, help='discount factor for reward')
game_arg.add_argument(
'--multPerdInpt', type=int, default=10, help='Number of history records which we feed into network'
)
# parameters of the leadtimes
leadtimes_arg = add_argument_group('leadtimes')
leadtimes_arg.add_argument(
'--leadRecItemLow', type=list, default=[2, 2, 2, 4], help='the min lead time for receiving items'
)
leadtimes_arg.add_argument(
'--leadRecItemUp', type=list, default=[2, 2, 2, 4], help='the max lead time for receiving items'
)
leadtimes_arg.add_argument(
'--leadRecOrderLow', type=int, default=[2, 2, 2, 0], help='the min lead time for receiving orders'
)
leadtimes_arg.add_argument(
'--leadRecOrderUp', type=int, default=[2, 2, 2, 0], help='the max lead time for receiving orders'
)
leadtimes_arg.add_argument('--ILInit', type=list, default=[0, 0, 0, 0], help='')
leadtimes_arg.add_argument('--AOInit', type=list, default=[0, 0, 0, 0], help='')
leadtimes_arg.add_argument('--ASInit', type=list, default=[0, 0, 0, 0], help='the initial shipment of each agent')
leadtimes_arg.add_argument('--leadRecItem1', type=int, default=2, help='the min lead time for receiving items')
leadtimes_arg.add_argument('--leadRecItem2', type=int, default=2, help='the min lead time for receiving items')
leadtimes_arg.add_argument('--leadRecItem3', type=int, default=2, help='the min lead time for receiving items')
leadtimes_arg.add_argument('--leadRecItem4', type=int, default=2, help='the min lead time for receiving items')
leadtimes_arg.add_argument('--leadRecOrder1', type=int, default=2, help='the min lead time for receiving order')
leadtimes_arg.add_argument('--leadRecOrder2', type=int, default=2, help='the min lead time for receiving order')
leadtimes_arg.add_argument('--leadRecOrder3', type=int, default=2, help='the min lead time for receiving order')
leadtimes_arg.add_argument('--leadRecOrder4', type=int, default=2, help='the min lead time for receiving order')
leadtimes_arg.add_argument('--ILInit1', type=int, default=0, help='the initial inventory level of the agent')
leadtimes_arg.add_argument('--ILInit2', type=int, default=0, help='the initial inventory level of the agent')
leadtimes_arg.add_argument('--ILInit3', type=int, default=0, help='the initial inventory level of the agent')
leadtimes_arg.add_argument('--ILInit4', type=int, default=0, help='the initial inventory level of the agent')
leadtimes_arg.add_argument('--AOInit1', type=int, default=0, help='the initial arriving order of the agent')
leadtimes_arg.add_argument('--AOInit2', type=int, default=0, help='the initial arriving order of the agent')
leadtimes_arg.add_argument('--AOInit3', type=int, default=0, help='the initial arriving order of the agent')
leadtimes_arg.add_argument('--AOInit4', type=int, default=0, help='the initial arriving order of the agent')
leadtimes_arg.add_argument('--ASInit1', type=int, default=0, help='the initial arriving shipment of the agent')
leadtimes_arg.add_argument('--ASInit2', type=int, default=0, help='the initial arriving shipment of the agent')
leadtimes_arg.add_argument('--ASInit3', type=int, default=0, help='the initial arriving shipment of the agent')
leadtimes_arg.add_argument('--ASInit4', type=int, default=0, help='the initial arriving shipment of the agent')
# test
test_arg = add_argument_group('testing')
test_arg.add_argument(
'--testRepeatMid',
type=int,
default=50,
help='it is number of episodes which is going to be used for testing in the middle of training'
)
test_arg.add_argument('--testInterval', type=int, default=100, help='every xx games compute "test error"')
test_arg.add_argument(
'--ifSaveFigure', type=str2bool, default=True, help='if is it True, save the figures in each testing.'
)
test_arg.add_argument(
'--if_titled_figure',
type=str2bool,
default='True',
help='if is it True, save the figures with details in the title.'
)
test_arg.add_argument(
'--ifsaveHistInterval', type=str2bool, default=False, help='if every xx games save details of the episode'
)
test_arg.add_argument('--saveHistInterval', type=int, default=50000, help='every xx games save details of the play')
test_arg.add_argument('--Ttest', type=int, default=100, help='it defines the number of periods in the test cases')
test_arg.add_argument(
'--ifOptimalSolExist',
type=str2bool,
default=True,
help='if the instance has optimal base stock policy, set it to True, otherwise it should be False.'
)
test_arg.add_argument('--f1', type=float, default=8, help='base stock policy decision of player 1')
test_arg.add_argument('--f2', type=float, default=8, help='base stock policy decision of player 2')
test_arg.add_argument('--f3', type=float, default=0, help='base stock policy decision of player 3')
test_arg.add_argument('--f4', type=float, default=0, help='base stock policy decision of player 4')
test_arg.add_argument(
'--f_init',
type=list,
default=[32, 32, 32, 24],
help='base stock policy decision for 4 time-steps on the C(4,8) demand distribution'
)
test_arg.add_argument('--use_initial_BS', type=str2bool, default=False, help='If use f_init set it to True')
# reporting
reporting_arg = add_argument_group('reporting')
reporting_arg.add_argument('--Rsltdnn', type=list, default=[], help='the result of dnn play tests will be saved here')
reporting_arg.add_argument(
'--RsltRnd', type=list, default=[], help='the result of random play tests will be saved here'
)
reporting_arg.add_argument(
'--RsltStrm', type=list, default=[], help='the result of heuristic fomula play tests will be saved here'
)
reporting_arg.add_argument(
'--Rsltbs', type=list, default=[], help='the result of optimal play tests will be saved here'
)
reporting_arg.add_argument(
'--ifSaveHist',
type=str2bool,
default='False',
help=
'if it is true, saves history, prediction, and the randBatch in each period, WARNING: just make it True in small runs, it saves huge amount of files.'
)
# buildActionList: actions for the beer game problem
def buildActionList(config):
aDiv = 1 # difference in the action list
if config.fixedAction:
actions = list(
range(0, config.actionMax + 1, aDiv)
) # If you put the second argument =11, creates an actionlist from 0..xx
else:
actions = list(range(config.actionLow, config.actionUp + 1, aDiv))
return actions
# specify the dimension of the state of the game
def getStateDim(config):
if config.ifUseASAO:
stateDim = 5
else:
stateDim = 3
if config.ifUseActionInD:
stateDim += 1
return stateDim
def set_optimal(config):
if config.demandDistribution == 0:
if config.cp1 == 2 and config.ch1 == 2 and config.ch2 == 2 and config.ch3 == 2 and config.ch4 == 2:
config.f1 = 8.
config.f2 = 8.
config.f3 = 0.
config.f4 = 0.
def get_config():
config, unparsed = parser.parse_known_args()
config = update_config(config)
return config, unparsed
def fill_leadtime_initial_values(config):
config.leadRecItemLow = [config.leadRecItem1, config.leadRecItem2, config.leadRecItem3, config.leadRecItem4]
config.leadRecItemUp = [config.leadRecItem1, config.leadRecItem2, config.leadRecItem3, config.leadRecItem4]
config.leadRecOrderLow = [config.leadRecOrder1, config.leadRecOrder2, config.leadRecOrder3, config.leadRecOrder4]
config.leadRecOrderUp = [config.leadRecOrder1, config.leadRecOrder2, config.leadRecOrder3, config.leadRecOrder4]
config.ILInit = [config.ILInit1, config.ILInit2, config.ILInit3, config.ILInit4]
config.AOInit = [config.AOInit1, config.AOInit2, config.AOInit3, config.AOInit4]
config.ASInit = [config.ASInit1, config.ASInit2, config.ASInit3, config.ASInit4]
def get_auxuliary_leadtime_initial_values(config):
config.leadRecOrderUp_aux = [config.leadRecOrder1, config.leadRecOrder2, config.leadRecOrder3, config.leadRecOrder4]
config.leadRecItemUp_aux = [config.leadRecItem1, config.leadRecItem2, config.leadRecItem3, config.leadRecItem4]
def fix_lead_time_manufacturer(config):
if config.leadRecOrder4 > 0:
config.leadRecItem4 += config.leadRecOrder4
config.leadRecOrder4 = 0
def set_sterman_parameters(config):
config.alpha_b = [config.alpha_b1, config.alpha_b2, config.alpha_b3, config.alpha_b4]
config.betta_b = [config.betta_b1, config.betta_b2, config.betta_b3, config.betta_b4]
def update_config(config):
config.actionList = buildActionList(config) # The list of the available actions
config.actionListLen = len(config.actionList) # the length of the action list
set_optimal(config)
config.f = [config.f1, config.f2, config.f3, config.f4] # [6.4, 2.88, 2.08, 0.8]
config.actionListLen = len(config.actionList)
if config.demandDistribution == 0:
config.actionListOpt = list(range(0, int(max(config.actionUp * 30 + 1, 3 * sum(config.f))), 1))
else:
config.actionListOpt = list(range(0, int(max(config.actionUp * 30 + 1, 7 * sum(config.f))), 1))
config.actionListLenOpt = len(config.actionListOpt)
config.c_h = [config.ch1, config.ch2, config.ch3, config.ch4]
config.c_p = [config.cp1, config.cp2, config.cp3, config.cp4]
config.stateDim = getStateDim(config) # Number of elements in the state description - Depends on ifUseASAO
get_auxuliary_leadtime_initial_values(config)
fix_lead_time_manufacturer(config)
fill_leadtime_initial_values(config)
set_sterman_parameters(config)
return config