예제 #1
0
파일: topology.py 프로젝트: zongwangZ/src
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()
예제 #2
0
파일: topology.py 프로젝트: zongwangZ/src
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()
예제 #3
0
파일: topology.py 프로젝트: zongwangZ/src
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()
예제 #4
0
파일: topology.py 프로젝트: zongwangZ/src
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()
예제 #5
0
파일: q_learning.py 프로젝트: zongwangZ/src
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()
예제 #6
0
파일: q_learning.py 프로젝트: zongwangZ/src
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()