diff --git a/Environment.py b/Environment.py index 143c379..bd60219 100644 --- a/Environment.py +++ b/Environment.py @@ -84,6 +84,7 @@ class FMSEnv(ap.Model): if self.t >= self.int_stop_time: self.running = False self.stop() + # else: # # # print(f"running the {self.t} step") @@ -121,22 +122,9 @@ def GA_run(inventory_bound=None): S = tuple(tuple([i, j]) for i, j in zip(material, inventory_bound[ len(pd.read_excel("initial_material.xlsx").to_numpy()): len( pd.read_excel("initial_material.xlsx").to_numpy()) * 2])) - # print(s) - # print(S) + dct_para = { 'time': 300, # 进行总时间数 - # 'xv_int_max_order': random.randint(30, 50), - # 'xv_dlv_product_para': tuple([(30, 100), (30, 50)]), - # 'xv_dlv_product_para': tuple([30,40,30,20]), # 读取生产率 np.read. - # 'xv_int_dlv_period_lam': 8.5, - # 'xv_int_create_order_lam': 2, - # 'xv_ary_price_product': tuple([0.3,0.2,0.5,1]), - # 'xv_ary_cost_material_per': tuple([0.1,0.1,0.2,0.4]), - # 'xv_ary_volume_material': tuple([1.0, 1.5]), - # 'xv_ary_volume_product': tuple([3.0, 5.0]), - # 'xv_array_lead_time': 2, # 读取原材料表格 np.read, 暂时不读 变量代表的含义 - # 'xv_int_lead_time_c': 3, - # 'xv_int_lead_time_d': 1, 'xv_ary_product_id': tuple(pd.read_excel("initial_product.xlsx").iloc[:, 0]), # 产成品id顺序 'xv_ary_material_id': tuple(pd.read_excel("initial_material.xlsx").iloc[:, 0]), # 原材料id顺序 'xv_product_num': len(pd.read_excel("initial_product.xlsx").to_numpy()), # 产成品个数 @@ -150,43 +138,8 @@ def GA_run(inventory_bound=None): 'xv_ary_s': s, # s 'xv_ary_S': S, # S # 应读取遗传算法中随机生成的s,暂写为'1' 创建两个excel分别存储产品和原材料的库存 每个excel中存系统代码和库存 - # 'xv_flt_initial_cash': 50000.0, - # 'dct_status_info': json.dumps({ #需要引入生产状态表 - # "0": {"xv_flt_produce_rate": tuple([0.0, 0.0]), - # "xv_ary_mat_material": tuple([0.0, 0.0]), - # "xv_flt_broken_rate": 0, - # "xv_flt_run_cost": 0.0, - # "name": "wait" - # }, - # "1": {"xv_flt_produce_rate": tuple([90.0, 0.0]), - # "xv_ary_mat_material": tuple([4.0, 1.0]), - # "xv_flt_broken_rate": 0.03, - # "xv_flt_run_cost": 40.0, - # "name": "produceA" - # }, - # "2": {"xv_flt_produce_rate": tuple([0.0, 60.0]), - # "xv_ary_mat_material": tuple([1.5, 5.0]), - # "xv_flt_broken_rate": 0.05, - # "xv_flt_run_cost": 50.0, - # "name": "produceB" - # }, - # "3": {"xv_flt_produce_rate": tuple([55.0, 30.0]), - # "xv_ary_mat_material": tuple([2.0, 1.5]), - # "xv_flt_broken_rate": 0.07, - # "xv_flt_run_cost": 60.0, - # "name": "produceAB" - # }, - # "-1": {"xv_flt_produce_rate": 0.0, - # "xv_ary_mat_material": tuple([0.0, 0.0]), - # "xv_flt_broken_rate": 0.1, - # "xv_flt_run_cost": 100.0, - # "name": "failed" - # } - # }) - } sample = ap.Sample(dct_para) - exp = ap.Experiment(FMSEnv, sample, iterations=1, record=True) results = exp.run() return results['variables']['FMSEnv']['op_os_all_delay_time'][dct_para['time']] / 2 diff --git a/ga_new.py b/ga_new.py index 330e61e..07d821f 100644 --- a/ga_new.py +++ b/ga_new.py @@ -42,7 +42,7 @@ class GeneticAlgorithm: :ivar function: Object that can be used to evaluate the objective function """ - def __init__(self, function, dim, lb, ub, int_var=None, pop_size=20, num_gen=300, start="Random"): + def __init__(self, function, dim, lb, ub, int_var=None, pop_size=6, num_gen=300, start="Random"): self.nvariables = dim # column self.nindividuals = pop_size + (pop_size % 2) # Make sure this is even row @@ -102,6 +102,11 @@ class GeneticAlgorithm: ind = np.where(population[:, i] > self.upper_boundary[i]) population[ind, i] -= 1 + for pop in population: + for i in range(len(pop) // 2): + if pop[i] >= pop[i + len(pop) // 2]: + pop[i], pop[i + len(pop) // 2] = pop[i + len(pop) // 2], pop[i] + # Evaluate all individuals # function_values = self.function(population) we cannot compute in this way to ensure x is one-dim in policy n_row, n_dim = population.shape @@ -125,7 +130,8 @@ class GeneticAlgorithm: for _ in range(self.ngenerations): print('------------------------------') print("当前为第{}代".format(_)) - print("最优个体为:{}".format(best_individual)) + print("最优s为:{}".format(best_individual[0:115])) + print("最优S为:{}".format(best_individual[115:230])) print("最优值为:{}".format(best_value)) print("------------------------------") # Do tournament selection to select the parents @@ -174,6 +180,11 @@ class GeneticAlgorithm: # Keep the best individual population[0, :] = best_individual + for pop in population: + for i in range(len(pop) // 2): + if pop[i] >= pop[i + len(pop) // 2]: + pop[i], pop[i + len(pop) // 2] = pop[i + len(pop) // 2], pop[i] + # Evaluate all individuals # function_values = self.function(population) we cannot compute in this way to ensure x is one-dim in policy n_row, n_dim = population.shape diff --git a/initial_material.xlsx b/initial_material.xlsx index 3ff30df..30fd9af 100644 Binary files a/initial_material.xlsx and b/initial_material.xlsx differ