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])
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())
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'])
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)
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
# 其他汇总信息,位于每个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'])