Esempio n. 1
0
    def run_stage(self, Ti, up_info):
        for i in range(len(self.agents)):
            last_arg = deepcopy(self.agents[i].stage_arg)
            self.agents[i].stage_arg = arg.init_stage_arg(
                self.global_arg, self.main_env.arg, self.agents[i].agent_arg,
                last_arg, Ti)
        for i in range(self.global_arg['Ts']):
            logging.info("frame %3d , Ti:%3d" % (i, Ti))

            # 运行Frame
            self.run_frame(Ti, i, up_info)
            for k in range(self.global_arg["Nagent"]):
                csv_info = [
                    Ti + i,
                    self.main_env.getValue(self.agents[k].state_now, Ti),
                    self.agents[k].frame_arg['PSM']['f-req'],
                    int(self.agents[k].frame_arg['PROC']['action']),
                    self.agents[k].frame_arg['PSM']['a-need'],
                    up_info['nkinfo']['max'], up_info['nkinfo']['min'],
                    up_info['nkinfo']['mid'], up_info['nkinfo']['avg'],
                    up_info['nkinfo']['p0.75'], up_info['nkinfo']['p0.25']
                ]
                moniter.AppendToCsv(csv_info, all_config['result_csv_path'][k])
            agent_value = [
                self.main_env.getValue(self.agents[k].state_now, Ti)
                for k in range(self.global_arg["Nagent"])
            ]
            csv_info = [Ti + i] \
                       + agent_value \
                       + [sum(agent_value) / len(agent_value)] \
                       + [up_info['nkinfo'][key] for key in ['max', 'min', 'mid', 'avg', 'p0.75', 'p0.25']]
            moniter.AppendToCsv(csv_info, all_config['result_csv_path'][-1])
Esempio n. 2
0
    def __init__(self):
        # 环境初始化
        self.global_arg = arg.init_global_arg()
        env_arg = arg.init_env_arg(self.global_arg)
        # 增加nk的一个读入操作
        self.main_env = Env(env_arg)
        for model_type in ['st', 'ed']:
            if all_config['checkpoint']['env'][model_type]['enable']:
                self.main_env.nkmodel_load(all_config['checkpoint']['env']['path'], model_type)
            self.main_env.nkmodel_save(all_config["nkmodel_path"][model_type], model_type)
        # 个体初始化
        self.agents = []
        csv_head_agent = ['agent_no'] + ['st_state'] + ['st_value'] + ['insight'] + ['xplr'] + ['xplt'] + ['enable']
        moniter.AppendToCsv(csv_head_agent, all_config['agent_csv_path'])
        for i in range(self.global_arg["Nagent"]):
            # 个体随机初始位置
            start_st_label = [randint(0, self.main_env.P - 1) for j in range(self.main_env.N)]
            state_start = State(start_st_label)
            self.agents.append(Agent(arg.init_agent_arg(self.global_arg,
                                                        self.main_env.arg),
                                     self.main_env))
            self.agents[i].state_now = deepcopy(state_start)
            self.agents[i].agent_id = i

            # 去除了一开始给一个全局area,改为添加一个包含起点的点area
            start_area = Area(self.agents[i].state_now, [False] * self.main_env.N, 0)
            start_area.info = get_area_sample_distr(env=self.main_env, area=start_area, state=self.agents[i].state_now,
                                                    T_stmp=0, sample_num=1, dfs_r=1)
            start_area.sign = Sign(i, 0, 'start')
            self.agents[i].renew_m_info(start_area, 0)
            self.a_plan = None
            logging.info("state:%s, st_value:%s,insight:%.5s ,xplr:%.5s, xplt:%.5s, enable:%.5s" % (
                str(self.agents[i].state_now),
                self.main_env.getValue(self.agents[i].state_now, 0),
                self.agents[i].agent_arg['a']['insight'],
                self.agents[i].agent_arg['a']['xplr'],
                self.agents[i].agent_arg['a']['xplt'],
                self.agents[i].agent_arg['a']['enable']))
            # 记录agent信息
            csv_info_agent = ['agent%d' % i] \
                             + [self.agents[i].state_now] \
                             + [self.main_env.getValue(self.agents[i].state_now, 0)] \
                             + [self.agents[i].agent_arg['a']['insight']] \
                             + [self.agents[i].agent_arg['a']['xplr']] \
                             + [self.agents[i].agent_arg['a']['xplt']] \
                             + [self.agents[i].agent_arg['a']['enable']]
            moniter.AppendToCsv(csv_info_agent, all_config['agent_csv_path'])

        # 社会网络初始化
        soclnet_arg = arg.init_soclnet_arg(self.global_arg, env_arg)
        self.socl_net = SoclNet(soclnet_arg)
        self.socl_net.new_flat_init()  # 修改初始化方法
        # self.socl_net.flat_init()
        if all_config['checkpoint']['socl_network']['enable']:
            self.socl_net.power_load(all_config['checkpoint']['socl_network']['power'])
            self.socl_net.relat_load(all_config['checkpoint']['socl_network']['relat'])
        self.record = Record()

        self.metric = metrics.register_all_metrics(metrics.Metrics())
Esempio n. 3
0
    def run_exp(self):
        up_info = {}
        # 单个agent的结果表
        for k in range(self.global_arg["Nagent"]):
            csv_head = ['frame', 'state', 'value', 'area_v', 'area_center', 'act', 'goal', 'goal_value']
            moniter.AppendToCsv(csv_head, all_config['result_csv_path'][k])
        # 结果汇总表
        # 添加agent max和agent min
        csv_head_value = ['frame'] \
                         + ["agent%d" % (k) for k in range(self.global_arg['Nagent'])] \
                         + ["agent_avg", "agent_max", "agent_min"] \
                         + ['peakmax', 'peakmin', 'peakavg'] \
                         + ['adj_avg']
        moniter.AppendToCsv(csv_head_value, all_config['value_csv_path'][-1])
        csv_head_area = ['frame'] \
                        + ["agent%d" % (k) for k in range(self.global_arg['Nagent'])] \
                        + ["agent_avg"] \
                        + ['nkmax']
        moniter.AppendToCsv(csv_head_area, all_config['area_csv_path'])

        csv_head_act = ['frame'] \
                       + ["agent%d" % (k) for k in range(self.global_arg['Nagent'])]
        moniter.AppendToCsv(csv_head_act, all_config['act_csv_path'])

        stage_num = self.global_arg['T'] // self.global_arg['Ts']

        # self.main_env.getModelDistri()  # 为了作图,仅测试时调用!!
        up_info['nkinfo'] = self.main_env.getModelPeakDistri()  # 将nkinfo变为peakvalue
        # all_peak_value = self.main_env.getAllPeakValue()
        # moniter.DrawHist(all_peak_value, all_config['peak_hist'])

        meet_req = {}
        for i in range(stage_num):
            Ti = i * self.global_arg['Ts'] + 1
            logging.info("stage %3d, Ti:%3d" % (i, Ti))
            self.main_env.T_clock = Ti
            # 每个stage遍历一遍当前模型,获取分布信息
            # 减少运算量,只算第一帧
            # up_info['nkinfo'] = self.main_env.getModelDistri()
            # logging.debug("max_value:{max}".format(**up_info['nkinfo']))
            # 运行一个Stage,Ti表示每个Stage的第一帧
            meet_req = self.run_stage(Ti, meet_req, up_info)
        moniter.DumpToJson(self.metric.get_data(), all_config['metrics_json_path'])
        moniter.DumpToJson(leadership_bill.leader_bill.to_json(), all_config['leadership_bill_json_path'])
Esempio n. 4
0
    def run_exp(self):
        up_info = {}

        for i in range(self.global_arg["Nagent"]):
            self.agents.append(
                Agent(arg.init_agent_arg(self.global_arg, self.main_env.arg)))
            self.agents[i].state_now = State(
                [0 for _ in range(self.main_env.N)])
            self.agents[i].inter_area.info = get_area_sample_distr(
                env=self.main_env,
                T=0,
                area=self.agents[i].inter_area,
                state=self.agents[i].state_now,
                sample_num=self.main_env.arg['ACT']['hqxx']['sample_n'],
                dfs_r=self.main_env.arg['ACT']['hqxx']['dfs_p'])
            self.agents[i].inter_area.info['start_t'] = 0

        stage_num = self.global_arg['T'] // self.global_arg['Ts']
        for k in range(self.global_arg["Nagent"]):
            csv_head = [
                'frame', 'SSMfi', 'SSM_f-req', 'proc_action', 'SSM_f_need',
                'nkmax', 'nkmin', 'nkmid', 'nkavg', 'nk0.75', "nk0.25"
            ]
            #                        'peakmax', 'peakmin', 'peakmid', 'peakavg', 'peak0.75', "peak0.25"]
            moniter.AppendToCsv(csv_head, all_config['result_csv_path'][k])
        csv_head = ['frame'] \
                   + ["%s%d" % (using_brain[k].func_name, k) for k in range(self.global_arg['Nagent'])] \
                   + ["agent_avg"] \
                   + ['nkmax', 'nkmin', 'nkmid', 'nkavg', 'nk0.75', "nk0.25"]
        moniter.AppendToCsv(csv_head, all_config['result_csv_path'][-1])

        for i in range(stage_num):
            Ti = i * self.global_arg['Ts'] + 1
            logging.info("stage %3d , Ti:%3d" % (i, Ti))
            up_info['nkinfo'] = self.main_env.getModelDistri(Ti)
            #            up_info['nk_peak'] = self.main_env.getModelPeakDistri(Ti)

            # 运行一个Stage,Ti表示每个Stage的第一帧
            self.run_stage(Ti, up_info)
Esempio n. 5
0
    def run_stage(self, Ti, meet_req, up_info):
        # 将Agent上一个stage的最终状态拷贝过来
        for i in range(len(self.agents)):
            last_arg = deepcopy(self.agents[i].stage_arg)
            self.agents[i].stage_arg = arg.init_stage_arg(self.global_arg,
                                                          self.main_env.arg,
                                                          self.agents[i].agent_arg,
                                                          last_arg,
                                                          Ti)
        meet_req = {}
        #  NOTE cid传了个up_info进去,避免重复遍历
        self.record.add_env_record(self.main_env, Ti, up_info)
        self.record.add_socl_net_record(self.socl_net, Ti)
        for i in range(self.global_arg['Ts']):
            logging.info("frame %3d , Ti:%3d" % (i, Ti))
            self.record.add_agents_record(self.main_env, self.agents, Ti + i)
            # 运行Frame, 并将运行后生成的会议请求记录下来
            meet_req = self.run_all_frame(Ti, i, meet_req, up_info)

            # 输出每个个体的具体信息
            for k in range(self.global_arg["Nagent"]):
                tmp_goal = ''
                tmp_goal_value = ''
                if not self.agents[k].a_plan is None:
                    tmp_goal = self.agents[k].a_plan.goal
                    tmp_goal_value = self.agents[k].a_plan.goal_value

                csv_info_result = [
                    Ti + i,
                    str(self.agents[k].state_now),
                    self.main_env.getValue(self.agents[k].state_now, Ti),
                    self.agents[k].get_max_area().info['max'],
                    str(self.agents[k].get_max_area().center),
                    str(self.agents[k].policy_now) + '&' + str(self.agents[k].meeting_now),
                    str(tmp_goal),
                    tmp_goal_value
                ]
                moniter.AppendToCsv(csv_info_result, all_config['result_csv_path'][k])

            # 输出当前value
            agent_value = [self.main_env.getValue(self.agents[k].state_now, Ti) for k in
                           range(self.global_arg["Nagent"])]
            agent_avg = sum(agent_value) / len(agent_value)

            csv_info_value = [Ti + i] \
                             + agent_value \
                             + [agent_avg, max(agent_value), min(agent_value)] \
                             + [up_info['nkinfo'][key] for key in ['max', 'min', 'avg']] \
                             + [(agent_avg - up_info['nkinfo']['min']) / (
                    up_info['nkinfo']['max'] - up_info['nkinfo']['min'])]
            moniter.AppendToCsv(csv_info_value, all_config['value_csv_path'][-1])

            # 输出max_area
            agent_max_area = [self.agents[k].get_max_area().info['max'] for k in
                              range(self.global_arg["Nagent"])]
            csv_info_area = [Ti + i] \
                            + agent_max_area \
                            + [sum(agent_max_area) / len(agent_max_area)] \
                            + [up_info['nkinfo']['max']]
            moniter.AppendToCsv(csv_info_area, all_config['area_csv_path'])

            # NOTE cid 添加act信息(相应增加agent类里的变量)
            act_list = [self.agents[k].policy_now + '&' + self.agents[k].meeting_now for k in
                        range(self.global_arg["Nagent"])]
            csv_info_act = [Ti + i] \
                           + act_list
            moniter.AppendToCsv(csv_info_act, all_config['act_csv_path'])

            # 按stage输出
        if self.global_arg['mul_agent']:
            # net_title, net_data = self.record.output_socl_net_per_frame(Ti + i)
            power_save_path = os.path.join(all_config['network_csv_path'], "power_%04d.csv" % (Ti))
            relat_save_path = os.path.join(all_config['network_csv_path'], "relat_%04d.csv" % (Ti))
            self.socl_net.power_save(power_save_path)
            self.socl_net.relat_save(relat_save_path)
            #  P1-05 增加Socil Network的结果输出
        self.metric.calc_metric(['stage'], Ti,
                                socl_net=self.socl_net,
                                agents=self.agents,
                                env=self.main_env)
        return meet_req
Esempio n. 6
0
        # 其他汇总信息,位于每个exp的总目录下
        all_config['value_csv_path'] = []
        all_config['value_csv_path'].append(
            os.path.join("result", all_config['batch_id'], exp_id, "%s_value.csv" % (exp_id))
        )

        # max_area输出
        all_config['area_csv_path'] = os.path.join("result", all_config['batch_id'], exp_id, "%s_area.csv" % (exp_id))
        # 添加一个act的记录文件
        all_config['act_csv_path'] = os.path.join("result", all_config['batch_id'], exp_id, "%s_act.csv" % (exp_id))

        all_config['nkmodel_path'] = {}
        for model_type in ['st', 'ed']:
            all_config['nkmodel_path'][model_type] = os.path.join("result", all_config['batch_id'], exp_id,
                                                                  "%s_nkmodel_%s.pickle" % (exp_id, model_type))
        all_config['agent_csv_path'] = os.path.join("result", all_config['batch_id'], exp_id,
                                                    "%s_agent_attribute.csv" % (exp_id))
        all_config['peak_hist'] = os.path.join("result", all_config['batch_id'], exp_id, "%s_peak_hist.png" % (exp_id))
        all_config['total_hist'] = os.path.join("result", all_config['batch_id'], exp_id,
                                                "%s_total_hist.png" % (exp_id))
        all_config['metrics_json_path'] = os.path.join("result", all_config['batch_id'], exp_id,
                                                       "%s_metrics.json" % exp_id)
        all_config['leadership_bill_json_path'] = os.path.join("result", all_config['batch_id'], exp_id,
                                                               "%s_leadership_bill.json" % exp_id)

        logging.info("run exp %3d" % exp_num)
        main_control = MulControl()
        main_control.run_exp()  # 开始运行实验

    moniter.AppendToCsv(exp_list, all_config['exp_list_path'])