Spaces:
Sleeping
Sleeping
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 | |