def sum_data_influence_direct(): parameter = { "region": 8, "start_point": 5, "n": 100, # 生成方差的次数 "sum_data_range": list(range(1000, 23000, 2000)), "exp_times": 100, # 测量的重复次数 } # 保存参数 func_name = sys._getframe().f_code.co_name print(func_name, " is running at ", time.strftime("%Y-%m-%d_%H-%M-%S")) data_saver = DataSaver(func_name) data_saver.add_item("parameter", parameter) # 均匀分布的参数 region = parameter["region"] start_point = parameter["start_point"] # 确定数据量变化的范围 x_axis = sum_data_range = parameter["sum_data_range"] # 确定产生方差的次数 n = parameter["n"] # 确定测量重复的次数 exp_times = parameter["exp_times"] y_axis = [] for sum_data in sum_data_range: print(sum_data, time.strftime("%Y-%m-%d_%H-%M-%S")) MSE = 0 for i in range(n): var_vector = np.random.randint(start_point, start_point + region + 1, 5) # 计算最优比例 topo = Topology(var_vector=var_vector, way="Direct") # 测量 mse = 0 for j in range(exp_times): cov = topo.gen_delay(topo.reduced_matrix, topo.Phi, sum_data) measured_X = topo.cal_measured_link_parameter(cov) mse += np.dot((np.array(measured_X) - np.array(var_vector))**2, topo.H_x) / exp_times MSE += mse / n y_axis.append(MSE) # 画图 print("x_axis:", x_axis) print("y_axis:", y_axis) plt.figure() plt.plot(x_axis, y_axis, marker="o", color="blue", label="Direct") plt.xlabel("#probe") plt.ylabel("MSE") # plt.title("the influence of #probe") plt.legend() dir = os.path.join(os.getcwd(), "data", func_name) fig_name = dir + "/" + func_name + "_" + time.strftime( "%Y-%m-%d_%H-%M-%S") + ".png" if not os.path.exists(dir): os.makedirs(dir) plt.savefig(fig_name) plt.show() plt.close() data_saver.add_item("x_axis", x_axis) data_saver.add_item("y_axis", y_axis) data_saver.to_file()
def uniform_direct(): """ 按照 Fig 1.a 选定合适的 链路时延方差 Fig 1.b x-axis: k 步逼近,y-axis: NT的估计误差 (所有 链路的 平均估计误差);重复实验k次 最直接的一个方案:分成 k 步来逼近,每步按照 (最优比例-均匀比例)/k 来修正上一步的比例 是的哈,按照上面的式子,你肯定最终 是收敛到最优方案的 """ parameter = { "var_vector": [5, 8, 16, 12, 10], # 由图1 a中 "average_proportion": [0.2, 0.2, 0.2, 0.2, 0.2], "k_step": 10, "sum_data": 10000, "exp_times": 500 } # 保存参数 func_name = sys._getframe().f_code.co_name print(func_name, "is running at ", time.strftime("%Y-%m-%d_%H-%M-%S")) data_saver = DataSaver(func_name) data_saver.add_item("parameter", parameter) # 计算最优比例,直接测量 var_vector = parameter["var_vector"] direct_topo = Topology(var_vector=var_vector, way="Direct") direct_proportion = direct_topo.Phi data_saver.add_item("direct_proportion", direct_proportion) # 平均比列 average_proportion = parameter["average_proportion"] k_step = parameter["k_step"] # 分多少次接近最优比列 x_axis = list(range(k_step + 1)) all_proportion = [] for i in range(k_step): proportion = np.array(average_proportion) + (np.array( direct_proportion) - np.array(average_proportion)) / k_step * i all_proportion.append(proportion.tolist()) all_proportion.append(direct_proportion) # 这里各个链路占的比例应该也从平均比例变化到H_x H_x_proportions = [] for i in range(k_step): proportion = np.array(average_proportion) + (np.array( direct_topo.H_x) - np.array(average_proportion)) / k_step * i H_x_proportions.append(proportion.tolist()) H_x_proportions.append(direct_topo.H_x.tolist()) data_saver.add_item("data_proportion", all_proportion) data_saver.add_item("H_x_proportions", H_x_proportions) y_axis = [] # 数据总量 sum_data = parameter["sum_data"] exp_times = parameter["exp_times"] # 实验重复次数 for index, proportion in enumerate(all_proportion): print(index, time.strftime("%Y-%m-%d_%H-%M-%S")) mse = 0 for _ in range(exp_times): cov = direct_topo.gen_delay(direct_topo.reduced_matrix, proportion, sum_data) measured_X = direct_topo.cal_measured_link_parameter(cov) # mse += np.mean((np.array(measured_X) - np.array(var_vector))**2)/exp_times mse += np.dot((np.array(measured_X) - np.array(var_vector))**2, H_x_proportions[index]) / exp_times y_axis.append(mse) print("x_axis:", x_axis) print("y_axis:", y_axis) # 画图 plt.figure() plt.plot(x_axis, y_axis, marker="o", color="blue") plt.xlabel("step") plt.ylabel("MSE") plt.legend() plt.title("average proportion to FIM proportion") dir = os.path.join(os.getcwd(), "data", func_name) fig_name = dir + "/" + func_name + "_" + time.strftime( "%Y-%m-%d_%H-%M-%S") + ".png" if not os.path.exists(dir): os.makedirs(dir) plt.savefig(fig_name) plt.show() plt.close() data_saver.add_item("x_axis", x_axis) data_saver.add_item("y_axis", y_axis) data_saver.to_file()
def region_error_direct(): """ 画出均匀分布区间和估计误差 Fig 1.a 所有的链路的时延方差 服从均匀分布(区间长度从 0 开始;0 区间长度表示所有链路具有相同的时延方差),x-axis:区间的长度,y-axis: NT的估计误差 (所有 链路的 平均估计误差);重复实验k次 :return: """ # 参数设置 parameter = { "regions": list(range(0, 20 + 2, 2)), "start_point": 5, "exp_times": 100, # 测量的重复次数 "n": 100, # 生成方差的次数 "sum_data": 10000, } # 保存参数 func_name = sys._getframe().f_code.co_name print(func_name, " is running at ", time.strftime("%Y-%m-%d_%H-%M-%S")) data_saver = DataSaver(func_name) data_saver.add_item("parameter", parameter) x_axis = regions = parameter["regions"] # 设定均匀分布的区间长度值 start_point = parameter["start_point"] # 设置均匀分布的中间值 exp_times = parameter["exp_times"] n = parameter["n"] # 数据总量 sum_data = parameter["sum_data"] y_axis = [] for region in regions: print(region, time.strftime("%Y-%m-%d_%H-%M-%S")) Direct_mse = 0 for i in range(n): # 1.均匀分布生成方差 var_vector = np.random.randint(start_point, start_point + region + 1, 5) # 2.构建topo topo = Topology(var_vector=var_vector, way="Direct") direct_mse = 0 for j in range(exp_times): # 3.生成数据,并且推断 # FIM值 direct_cov = topo.gen_delay(topo.reduced_matrix, topo.Phi, sum_data) direct_measured_X = topo.cal_measured_link_parameter( direct_cov) # 计算mse direct_mse += np.dot((np.array(direct_measured_X) - var_vector) **2, topo.H_x) / exp_times Direct_mse += direct_mse / n y_axis.append(Direct_mse) data_saver.add_item("Direct_mse", y_axis) plt.figure() plt.plot(regions, y_axis, label="Direct", marker=".", color="black") plt.xlabel("scale") plt.ylabel("MSE") # plt.ylim([0,1]) plt.legend() # plt.title("the variation of scale vs MSE") dir = os.path.join(os.getcwd(), "data", func_name) fig_name = dir + "/" + func_name + "_" + time.strftime( "%Y-%m-%d_%H-%M-%S") + ".png" if not os.path.exists(dir): os.makedirs(dir) plt.savefig(fig_name) plt.show() plt.close() data_saver.to_file()
def cdf_mse(): """ 选出Fig 1 中 区间长度为0,中间,最大共3个值: Fig 2,3,4 给出对应的 3副 CDF 统计图 ,x-axis: 估计误差(注意 这里是统计每条链路每一次得到的 估计误差),y-axis:估计误差的累积概率 :return: """ parameter = { # "regions": [0,10,20], "regions": [15], "start_point": 5, "n": 2000, # 生成方差的次数 "sum_data": 10000, "exp_times": 100, # 测量的重复次数 } # 保存参数 func_name = sys._getframe().f_code.co_name data_saver = DataSaver(func_name) data_saver.add_item("parameter", parameter) # 均匀分布的参数,0,中间,最大 regions = parameter["regions"] start_point = parameter["start_point"] # 确定产生方差的次数 n = parameter["n"] # 确定测量重复的次数 exp_times = parameter["exp_times"] # 产生的总数据量 sum_data = parameter["sum_data"] for region in regions: print(region) MSE = np.empty(shape=[0, 5]) for i in range(n): var_vector = np.random.randint(start_point, start_point + region + 1, 5) # 计算最优比例 topo = Topology(var_vector) optimal_proportion = topo.Phi # 测量 mse = np.array([0, 0, 0, 0, 0], dtype=float) for j in range(exp_times): cov = topo.gen_delay(topo.reduced_matrix, optimal_proportion, sum_data) measured_X = topo.cal_measured_link_parameter(cov) mse += (np.array(measured_X) - np.array(var_vector))**2 / exp_times MSE = np.row_stack((MSE, mse)) MSE_data = MSE.flatten() # 画CDF图 plt.figure() plt.hist(MSE_data, cumulative=True, normed=True) plt.xlabel("MSE") plt.ylabel("CDF") # plt.title("the cdf ("+str(region)+")") plt.legend() dir = os.path.join(os.getcwd(), "data", func_name) fig_name = dir + "/" + func_name + "_" + str( region) + "_" + time.strftime("%Y-%m-%d_%H-%M-%S") + ".png" if not os.path.exists(dir): os.makedirs(dir) plt.savefig(fig_name) plt.show() plt.close() # 对MSE数据进行保存 data_saver.add_item(str(region), MSE) data_saver.to_file()
def test(times): data_saver = DataSaver("qlearning_test") data_saver.add_item("start_time", time.strftime("%Y-%m-%d_%H-%M-%S")) from src.envs.ec.ec_env import ECMA env = ECMA() RL = QLearningTable() data_saver.add_item("qlearning_param",RL.param) data_saver.add_item("episodes",times) for episode in range(0, times): env.reset() observation = env.get_obs() observation = list(np.round(np.array(observation,dtype=float).flatten(), 3)) while True: action = RL.choose_action(str(observation)) refined_action = RL.refine_action(action) reward, done ,_ = env.step(refined_action) observation_ = env.get_obs() observation_ = list(np.round(np.array(observation_,dtype=float).flatten(), 3)) observation = copy.deepcopy(observation_) data_saver.append(str(episode),[observation,refined_action,reward]) if done: if episode / 1000 > 0: print(episode, time.strftime("%Y-%m-%d_%H-%M-%S")) break data_saver.add_item("end_time", time.strftime("%Y-%m-%d_%H-%M-%S")) data_saver.to_file()
def train(times=10000): data_saver = DataSaver("qlearning_training") data_saver.add_item("start_time", time.strftime("%Y-%m-%d_%H-%M-%S")) #创建环境 env = create_env() RL = QLearningTable() data_saver.add_item("RL_param",RL.param) data_saver.add_item("episodes",times) for episode in range(0, times): env.reset() observation = env.get_obs() observation = list(np.round(np.array(observation,dtype=float).flatten(), 3)) while True: action = RL.choose_action(str(observation)) refined_action = RL.refine_action(action) reward, done ,_ = env.step(refined_action) observation_ = env.get_obs() observation_ = list(np.round(np.array(observation_,dtype=float).flatten(), 3)) RL.learn(str(observation), action, reward, str(observation_),done) observation = copy.deepcopy(observation_) data_saver.append(str(episode),[observation,refined_action,reward]) if done: if episode / 1000 > 0: print(episode, time.strftime("%Y-%m-%d_%H-%M-%S")) if episode / 10000: RL.save_model() break data_saver.add_item("end_time", time.strftime("%Y-%m-%d_%H-%M-%S")) data_saver.to_file()