| |
| 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 |
| } |
| |
| 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) |
| 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) |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |