pdppo / code /Lot-sizing /cfg_env /generate_setting.py
leokana's picture
include experiment results and updated code
ff58990
# -*- coding: utf-8 -*-
import json
import numpy as np
import warnings
def totuple(a):
try:
return tuple(totuple(i) for i in a)
except TypeError:
return a
def generate_json_file(time_horizon,
n_items,
n_machines,
initial_setup,
machine_production,
max_inventory_level,
initial_inventory_level,
holding_costs,
lost_sales_costs,
demand_distribution,
setup_costs,
setup_loss,
file_name):
file_dict = {
"time_horizon": time_horizon,
"n_items": n_items,
"n_machines": n_machines,
"initial_setup": initial_setup,
"machine_production": machine_production,
"max_inventory_level": max_inventory_level,
"initial_inventory": initial_inventory_level,
"holding_costs": holding_costs,
"lost_sales_costs": lost_sales_costs,
"demand_distribution": demand_distribution,
"setup_costs": setup_costs,
"setup_loss": setup_loss
}
# Serializing json
json_object = json.dumps(file_dict, indent = 4)
print(json_object)
with open(f"{file_name}.json", "w") as outfile:
outfile.write(json_object)
def generate_vector_min_bias(n_elements = 10,max_value = 10,min_value= 0 ,max_prob = 0.6):
if max_value == min_value:
return np.ones(n_elements,dtype = int)*max_value
else:
choices = np.arange(min_value,max_value+1)
probs = np.zeros(len(choices))
probs[0] = max_prob
if len(choices)<2:
leftprob = 1-max_prob
else:
leftprob = (1-max_prob)/(len(choices)-1)
probs[1:] = leftprob
return np.random.choice(choices,n_elements,p = probs.tolist())
def generate_matrix(n_lines,n_columns,max_value,min_value,max_prob):
final_matrix = []
for i in range(n_lines):
final_matrix.append(generate_vector_min_bias(n_columns,max_value,min_value,max_prob))
if n_lines <2:
return final_matrix[0].tolist()
else:
final_matrix = [l.tolist() for l in final_matrix]
return final_matrix
def check_all_zeros(matrix):
for i in range(len(matrix)):
if sum(np.array(matrix)[:,i]) == 0:
return warnings.warn("The generated matrix contains columns with zeros only")
time_horizon = 100
n_items = 25
n_machines = 15
#initial_setup = generate_matrix(1,n_machines,n_items,0,0.4)
initial_setup = generate_matrix(1,n_machines,n_items,0,0.4)
machine_production = generate_matrix(n_machines,n_items,40,0,0.4)
check_all_zeros(machine_production)
max_inventory_level = generate_matrix(1,n_items,100,100,0.5)
initial_inventory_level = generate_matrix(1,n_items,50,0,0.05)
holding_costs = generate_matrix(1,n_items,0.01,0.01,0.5)
lost_sales_costs = generate_matrix(1,n_items,0.3,0.1,0.5)
demand_distribution = {
"name": "binomial",
"n": 20,
"p": 0.4
}
setup_costs = generate_matrix(n_machines,n_items,30,15,0.2)
setup_loss = generate_matrix(n_machines,n_items,3,1,0.7)
file_name = f'setting_{n_items}items_{n_machines}machines_t{time_horizon}_i{max_inventory_level[0]}'
generate_json_file( time_horizon,
n_items,
n_machines,
initial_setup,
machine_production,
max_inventory_level,
initial_inventory_level,
holding_costs,
lost_sales_costs,
demand_distribution,
setup_costs,
setup_loss,
file_name)
# time_horizon = 100
# n_items = 25
# n_machines = 10
# #initial_setup = generate_matrix(1,n_machines,n_items,0,0.4)
# initial_setup = generate_matrix(1,n_machines,n_items,0,0.4)
# machine_production = generate_matrix(n_machines,n_items,40,0,0.4)
# check_all_zeros(machine_production)
# max_inventory_level = generate_matrix(1,n_items,100,100,0.5)
# initial_inventory_level = generate_matrix(1,n_items,0,0,0.05)
# holding_costs = generate_matrix(1,n_items,0.01,0.01,0.5)
# lost_sales_costs = generate_matrix(1,n_items,0.2,0.2,0.5)
# demand_distribution = {
# "name": "binomial",
# "n": 20,
# "p": 0.4
# }
# setup_costs = generate_matrix(n_machines,n_items,2,1,0.2)
# setup_loss = generate_matrix(n_machines,n_items,1,1,0.7)
# file_name = f'setting_{n_items}items_{n_machines}machines'
# generate_json_file( time_horizon,
# n_items,
# n_machines,
# initial_setup,
# machine_production,
# max_inventory_level,
# initial_inventory_level,
# holding_costs,
# lost_sales_costs,
# demand_distribution,
# setup_costs,
# setup_loss,
# file_name)
# for m in [2,5,10]:
# for n in [10,20,30,40,50,60,70,80,90,100]:
# time_horizon = 5
# n_items = n
# n_machines = m
# #initial_setup = generate_matrix(1,n_machines,n_items,0,0.4)
# initial_setup = generate_matrix(1,n_machines,n_items,0,0.4)
# machine_production = generate_matrix(n_machines,n_items,4,0,0.2)
# check_all_zeros(machine_production)
# max_inventory_level = generate_matrix(1,n_items,10,10,0.5)
# initial_inventory_level = generate_matrix(1,n_items,0,0,0.05)
# holding_costs = generate_matrix(1,n_items,0.1,0.1,0.5)
# lost_sales_costs = generate_matrix(1,n_items,3,1,0.5)
# demand_distribution = {
# "name": "binomial",
# "n": 4,
# "p": 0.4
# }
# setup_costs = generate_matrix(n_machines,n_items,2,1,0.2)
# setup_loss = generate_matrix(n_machines,n_items,1,1,0.7)
# file_name = f'setting_{n_items}items_{n_machines}machines_t{time_horizon}'
# generate_json_file( time_horizon,
# n_items,
# n_machines,
# initial_setup,
# machine_production,
# max_inventory_level,
# initial_inventory_level,
# holding_costs,
# lost_sales_costs,
# demand_distribution,
# setup_costs,
# setup_loss,
# file_name)