def act_commit(env, socl_net, agent_no, agent, record, T, Tfi, new_plan, member): assert isinstance(env, Env) and isinstance(agent, Agent) assert isinstance(socl_net, SoclNet) assert isinstance(new_plan, Plan) and isinstance(record, Record) agent.policy_now = 'commit_f' # 添加当前行动记录 # 以owener的power为概率接受一个plan,如果是自身,概率为1 p_comit = 1 if new_plan.info['owner'] != agent_no: p_comit = socl_net.power[new_plan.info['owner']][agent_no]['weight'] agent.renew_m_plan(new_plan, T + Tfi) if (p_comit > uniform(0, 1)): # P0-07 同上,覆盖计划前对原计划执行情况进行比较,并更新power if not agent.a_plan is None: dF = env.getValue(agent.state_now) \ - record.get_agent_record(agent_no, agent.a_plan.info['T_acpt'])["value"] # if "commit" in agent.a_plan.info and agent.a_plan.info['commit']: dp_f_a = new_plan.info['owner'] dP_r = agent.agent_arg['dP_r']['other'] # 仅对他人的power进行更新 if dp_f_a != agent_no: dP = agent.agent_arg["dPower"](dF, dP_r) d_pwr_updt_g = agent.agent_arg["d_pwr_updt_g"]( socl_net.power[dp_f_a][agent_no]['weight'], dP) logging.debug("pwr change: from:%s,to:%s,dp:%.5s" % (dp_f_a, agent_no, d_pwr_updt_g)) socl_net.power_delta(dp_f_a, agent_no, d_pwr_updt_g) if d_pwr_updt_g < 0: # 如果结果不好,还要扣关系分 d_re_updt_g = d_pwr_updt_g socl_net.relat_delta(dp_f_a, agent_no, d_re_updt_g) else: dp_f_a = agent_no dP_r = agent.agent_arg['dP_r']['self'] # dP = agent.agent_arg["dPower"](dF, dP_r) # d_pwr_updt_g = agent.agent_arg["d_pwr_updt_g"](socl_net.power[dp_f_a][agent_no]['weight'], dP) # socl_net.power_delta(dp_f_a, agent_no, d_pwr_updt_g) leadership_bill.leader_bill.add_record(record_type="m-plan", gen=new_plan.sign, user=Sign( agent_no, T + Tfi, 'act_commit')) assert new_plan.area.sign is not None leadership_bill.leader_bill.add_record(record_type="m-info", gen=new_plan.area.sign, user=Sign( agent_no, T + Tfi, 'act_commit')) agent.a_plan = deepcopy(new_plan) agent.a_plan.info['T_acpt'] = T + Tfi agent.a_plan.info['commit'] = True agent.a_plan.info['member'] = member agent.policy_now = 'commit_t' # 添加当前行动记录 commited = True else: commited = False logging.debug(agent.policy_now) return socl_net, agent, commited
def act_dyjs(env, socl_net, agent_no, agent, record, T, Tfi): assert isinstance(socl_net, SoclNet) global_arg = arg.init_global_arg() # 根据对自己影响的大小选择强化对象 out_power = [] agent.policy_now = 'dyjs_noaim' # 添加当前行动记录 for x in range(global_arg["Nagent"]): if x != agent_no: out_power.append(socl_net.power[x][agent_no]['weight']) elif x == agent_no: out_power.append(0) if max(out_power) > socl_net.arg['power_thld']: # 对自己影响力大于一个阈值的人才会考虑定义角色 to_power = random_choice(norm_softmax(out_power)) for aim in range(global_arg['Nagent']): if aim != to_power: delta = env.arg['ACT']['dyjs']['delta_power']( socl_net.power[to_power][aim]['weight']) socl_net.power_delta(to_power, aim, delta) leadership_bill.leader_bill.add_record( record_type='talking', meeting="dyjs", talking_type="dyjs", speaker=Sign(agent_no, T + Tfi, 'act_dyjs'), listener=Sign(aim, T + Tfi, 'act_dyjs')) agent.policy_now = 'dyjs' # 添加当前行动记录 logging.debug(agent.policy_now) return socl_net, agent
def _meeting_req_add_bill_record(host, member, meeting_name, ti): for x in host: for y in member: if y not in host: leadership_bill.leader_bill.add_record( record_type='talking', meeting=meeting_name, talking_type="meet_req", speaker=Sign(x, ti - 1, "req"), listener=Sign(y, ti, "req"))
def meeting_xtfg(env, agents, member, host, socl_net, record, T, Tfi): # 协调分工 assert isinstance(env, Env) and isinstance(socl_net, SoclNet) assert isinstance(host, set) and isinstance(member, set) assert host.issubset(member) _meeting_req_add_bill_record(host, member, "xtfg", T + Tfi) cent_weigh = socl_net.get_power_out_close_centrality() # cent_weigh = socl_net.get_power_out_degree_centrality() # 改为od plan_pool = [] # 获取所有host加权后的计划得分的比值 for x in member: agents[x].meeting_now = 'xtfg' # 添加当前行动记录 for x in host: if not agents[x].a_plan is None: plan_v = env.arg['plan']['eval'](agents[x].a_plan.len_to_finish( agents[x].a_plan.area.center), agents[x].a_plan.goal_value) plan_pool.append({ "id": x, "plan": agents[x].a_plan, "weight": cent_weigh[x] * plan_v }) w_sum = sum([pair['weight'] for pair in plan_pool]) sample_pool = [ plan_pool[i]['weight'] / w_sum for i in range(len(plan_pool)) ] for x in member: to_commit_pair = plan_pool[random_choice(sample_pool)] to_commit = to_commit_pair['plan'] socl_net, agents[x], commited = acts.act_commit( env, socl_net, x, agents[x], record, T, Tfi, to_commit, member) # 传入member,以便加入plan.info,后续执行时增强关系 # socl_net,agents[x] = acts.act_commit(env, socl_net, x, agents[x],record, T, Tfi, to_commit) if commited: leadership_bill.leader_bill.add_record( record_type='talking', meeting="xtfg", talking_type="commit_plan", speaker=Sign(to_commit_pair['id'], T + Tfi, 'meeting_xtfg'), listener=Sign(x, T + Tfi, 'meeting_xtfg')) for u in member: for v in member: if u > v: socl_net.relat[u][v]['weight'] = agents[u].agent_arg[ 're_incr_g'](socl_net.relat[u][v]['weight']) return agents, socl_net
def meeting_xxjl(env, agents, member, host, socl_net, record, T, Tfi): # 信息交流 assert isinstance(env, Env) and isinstance(socl_net, SoclNet) assert isinstance(host, set) and isinstance(member, set) assert host.issubset(member) _meeting_req_add_bill_record(host, member, "xxjl", T + Tfi) ret_info_pairs = [] logging.debug("memeber:%s,host:%s" % (member, host)) for x in member: logging.debug("agent%s meeting_now" % x) agents[x].meeting_now = 'xxjl' # 添加当前行动记录 for x in member: if not x in host: socl_net, agents[x] = acts.act_hqxx(env, socl_net, x, agents[x], record, T, Tfi) for x in member: ret_info_pairs.append({ "agent_id": x, "info": agents[x].get_latest_m_info(env.arg['meeting']['xxjl']['last_p_t'], env.arg['meeting']['xxjl']['max_num']) }) for x in member: for ret_info_pair in ret_info_pairs: y = ret_info_pair['agent_id'] infos = ret_info_pair['info'] if x == y or len(infos) < 1: continue agents[x].renew_m_info_list(infos, T + Tfi) max_info_max = max([_info.info['max'] for _info in infos]) if max_info_max > env.getValue(agents[x].state_now): leadership_bill.leader_bill.add_record( record_type='talking', meeting='xxjl', talking_type='get_useful_info', speaker=Sign(y, T + Tfi, 'xxjl'), listener=Sign(x, T + Tfi, 'xxjl')) for u in member: for v in member: if u > v: socl_net.relat[u][v]['weight'] = agents[u].agent_arg[ 're_incr_g'](socl_net.relat[u][v]['weight']) return agents, socl_net
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 meeting_tljc(env, agents, member, host, socl_net, record, T, Tfi): # 讨论决策 assert isinstance(member, set) and isinstance(host, set) assert host.issubset(member) assert isinstance(agents[0], Agent) _meeting_req_add_bill_record(host, member, "tljc", T + Tfi) # host的max_area中,最好的区域用于制定计划 all_max_area = [agents[x].get_max_area() for x in host] max_area = max(all_max_area, key=lambda a: a.info['max']) for x in member: agents[x].meeting_now = 'tljc' # 添加当前行动记录 new_plans = [] for x in member: new_plans.append(acts._act_jhnd_get_plan(env, agents[x], max_area)) new_plans[-1].info['owner'] = x new_plans[-1].info['T_gen'] = T + Tfi new_plans[-1].sign = Sign(x, T + Tfi, 'tljc') for x in member: agents[x].renew_m_plan_list(new_plans, T + Tfi) fin_plan = max(new_plans, key=lambda plan: plan.goal_value) # 仅根据goal_value排序,不考虑距离 for x in member: socl_net, agents[x], use_plan = acts.act_jhjc(env, socl_net, x, agents[x], record, T, Tfi, fin_plan) if use_plan: for h in host: leadership_bill.leader_bill.add_record( record_type='talking', meeting='tljc', talking_type='get_a_plan', speaker=Sign(h, T + Tfi, 'tljc'), listener=Sign(x, T + Tfi, 'tljc')) for u in member: for v in member: if u > v: socl_net.relat[u][v]['weight'] = agents[u].agent_arg[ 're_incr_g'](socl_net.relat[u][v]['weight']) return agents, socl_net
def act_whlj(env, socl_net, agent_no, agent, record, T, Tfi): assert isinstance(socl_net, SoclNet) global_arg = arg.init_global_arg() to_select = [x for x in range(global_arg['Nagent'])] del to_select[agent_no] to_whlj = sample(to_select, env.arg['ACT']['whlj']['k']) for aim in to_whlj: delta = env.arg['ACT']['whlj']['delta_relate']( socl_net.relat[aim][agent_no]['weight']) socl_net.relat_delta(aim, agent_no, delta) leadership_bill.leader_bill.add_record( record_type='talking', meeting="whlj", talking_type="whlj", speaker=Sign(agent_no, T + Tfi, 'act_whlj'), listener=Sign(aim, T + Tfi, 'act_whlj')) agent.policy_now = 'whlj' # 添加当前行动记录 logging.debug(agent.policy_now) return socl_net, agent
def act_jhnd(env, socl_net, agent_no, agent, record, T, Tfi): # 计划拟定 assert isinstance(env, Env) and isinstance(agent, Agent) max_area = agent.get_max_area( ) # TODO WARNING 有可能get一个到达过的局部最优点,不停生成回到这个点的计划 new_plan = _act_jhnd_get_plan(env, agent, max_area) new_plan.sign = Sign(agent_no, T + Tfi, 'act_jhnd') new_plan.info['owner'] = agent_no new_plan.info['T_gen'] = T + Tfi agent.renew_m_plan(new_plan, Tfi) socl_net, agent, use_plan = act_jhjc(env, socl_net, agent_no, agent, record, T, Tfi, new_plan) return socl_net, agent
def act_jhzx(env, socl_net, agent_no, agent, record, T, Tfi): # 计划执行 assert isinstance(agent.a_plan, Plan) # 已经完成原地不动,在area上,向goal移动,在area外向area中心点移动 agent.state_now = agent.a_plan.next_step(agent.state_now) # 将现有的点作为一个区域保存 new_area = Area(agent.state_now, [False] * env.N, 0) new_area.info = get_area_sample_distr(env=env, area=new_area, state=agent.state_now, T_stmp=T + Tfi, sample_num=1, dfs_r=1) # NOTE cid 删除OB扰动,实际到达的点应该给一个客观值 # for k in new_area.info: # new_area.info[k] = agent.agent_arg['ob'](new_area.info[k]) new_area.sign = Sign(agent_no, T + Tfi, "act_jhzx") agent.renew_m_info(new_area, T + Tfi) # 添加当前行动记录 agent.policy_now = 'jhzx' # 计划执行完毕后,清空计划 if agent.a_plan.is_arrive(agent.state_now): # NOTE cid 添加了清空计划前对计划的评价 if agent.a_plan is not None: dF = env.getValue(agent.state_now) \ - record.get_agent_record(agent_no, agent.a_plan.info['T_acpt'])["value"] # if "commit" in agent.a_plan.info and agent.a_plan.info['commit']: # 意味着来自tljc的plan就不更新了? dp_f_a = agent.a_plan.info['owner'] dP_r = agent.agent_arg['dP_r']['other'] # 仅对他人的power进行更新 if dp_f_a != agent_no: dP = agent.agent_arg["dPower"](dF, dP_r) d_pwr_updt_g = agent.agent_arg["d_pwr_updt_g"]( socl_net.power[dp_f_a][agent_no]['weight'], dP) logging.debug("pwr change: from:%s,to:%s,dp:%.5s" % (dp_f_a, agent_no, d_pwr_updt_g)) socl_net.power_delta(dp_f_a, agent_no, d_pwr_updt_g) if d_pwr_updt_g < 0: # 如果结果不好,还要扣关系分 d_re_updt_g = d_pwr_updt_g socl_net.relat_delta(dp_f_a, agent_no, d_re_updt_g) else: dp_f_a = agent_no dP_r = agent.agent_arg['dP_r']['self'] agent.policy_now = 'jhzx_fin' agent.a_plan = None logging.debug(agent.policy_now) return socl_net, agent
def act_hqxx(env, socl_net, agent_no, agent, record, T, Tfi): # 获取信息 assert isinstance(env, Env) and isinstance(agent, Agent) mask_t_id = sample(range( env.N), env.arg["ACT"]["hqxx"]["mask_n"]) # 随机从N个位点中选择mask_n的位允许修改 mask_t = [False for i in range(env.N)] for i in mask_t_id: mask_t[i] = True jump_d = env.arg['ACT']['hqxx']['dist'] state_t = agent.state_now # 寻找一个包含当前节点的区域的中心,记为state_t for i in range(jump_d): state_t = state_t.walk(sample(mask_t_id, 1)[0], sample([-1, 1], 1)[0]) # 生成一个区域 new_area = Area(state_t, mask_t, env.arg['ACT']['hqxx']['dist']) # 从区域中取样,获取信息,目前支持Max,Min,Avg,Mid,p0.15,p0.85 new_area.info = get_area_sample_distr( env=env, area=new_area, T_stmp=T + Tfi, state=agent.state_now, sample_num=env.arg['ACT']['hqxx']['sample_n'], dfs_r=env.arg['ACT']['hqxx']['dfs_p']) # 加ob扰动 for k in new_area.info: new_area.info[k] = agent.agent_arg['ob'](new_area.info[k]) # 把信息更新到状态中 new_area.sign = Sign(agent_no, T + Tfi, 'act_hqxx') agent.renew_m_info(new_area, T + Tfi) logging.debug(len(agent.frame_arg['PSM']['m-info'])) agent.policy_now = 'hqxx' # 添加当前行动记录 logging.debug(agent.policy_now) return socl_net, agent
def act_zyzx(env, socl_net, agent_no, agent, record, T, Tfi): global_area = Area(agent.state_now, [True] * env.N, env.P // 2 * env.N) # 自由执行自带从global_area找下一个点 state_next = global_area.rand_walk(agent.state_now) value_now = env.getValue(agent.state_now, T) value_next = env.arg['ACT']['zyzx']['ob'](env.getValue( state_next, T)) # 改为所有人是一样的ob影响参数 # agent.agent_arg['ob'](env.getValue(state_next, T)) dE = value_next - value_now kT0 = env.arg['ACT']['xdzx']['kT0'] cd = env.arg['ACT']['xdzx']['cool_down'] # cd = env.arg['ACT']['xdzx']['cool_down'] ** (env.arg['P'] ** (env.arg['N'] - inter_area_mskn)) # 随着时间推移,容忍度越来越低 按stage来衰减 cd_T = T tol = kT0 * cd**cd_T # 容忍度 # logging.debug("tol:{}".format(tol)) if (dE >= 0 or (tol >= 1e-10 and exp(dE / tol) > uniform(0, 1))): agent.state_now = state_next new_area = Area(agent.state_now, [False] * env.N, 0) new_area.info = get_area_sample_distr(env=env, area=new_area, state=agent.state_now, T_stmp=T + Tfi, sample_num=1, dfs_r=1) new_area.sign = Sign(agent_no, T + Tfi, "act_zyzx") # NOTE cid 删除OB扰动,实际到达的点应该给一个客观值 # for k in new_area.info: # new_area.info[k] = agent.agent_arg['ob'](new_area.info[k]) agent.renew_m_info(new_area, T + Tfi) agent.policy_now = 'zyzx' # 添加当前行动记录 logging.debug(agent.policy_now) return socl_net, agent
def act_jhjc(env, socl_net, agent_no, agent, record, T, Tfi, new_plan): assert isinstance(env, Env) and isinstance(agent, Agent) assert isinstance(record, Record) and isinstance(socl_net, SoclNet) new_plan_value = env.arg['ACT']['jhjc']["plan_eval"]( new_plan.len_to_finish(agent.state_now), new_plan.goal_value) org_plan_value = env.getValue( agent.state_now) # 如果没有a_plan,至少以当前位置作为plan value if agent.a_plan is not None: org_plan_value = env.arg['ACT']['jhjc']["plan_eval"]( agent.a_plan.len_to_finish(agent.state_now), agent.a_plan.goal_value) agent.policy_now = 'jhjc_old' # 添加当前行动记录,维持老计划 # logging.debug("new_v: %.5s, org_v:%.5s" % (new_plan_value, org_plan_value)) if new_plan_value >= org_plan_value: # P0-07 在覆盖新计划前对旧计划的执行情况进行判断并据此更新SoclNet.power if agent.a_plan is not None: dF = env.getValue(agent.state_now) \ - record.get_agent_record(agent_no, agent.a_plan.info['T_acpt'])["value"] # if "commit" in agent.a_plan.info and agent.a_plan.info['commit']: dp_f_a = new_plan.info['owner'] dP_r = agent.agent_arg['dP_r']['other'] # 仅对他人的power进行更新 if dp_f_a != agent_no: dP = agent.agent_arg["dPower"](dF, dP_r) d_pwr_updt_g = agent.agent_arg["d_pwr_updt_g"]( socl_net.power[dp_f_a][agent_no]['weight'], dP) logging.debug("pwr change: from:%s,to:%s,dp:%.5s" % (dp_f_a, agent_no, d_pwr_updt_g)) socl_net.power_delta(dp_f_a, agent_no, d_pwr_updt_g) if d_pwr_updt_g < 0: # 如果结果不好,还要扣关系分 d_re_updt_g = d_pwr_updt_g socl_net.relat_delta(dp_f_a, agent_no, d_re_updt_g) else: dp_f_a = agent_no dP_r = agent.agent_arg['dP_r']['self'] # dP = agent.agent_arg["dPower"](dF, dP_r) # d_pwr_updt_g = agent.agent_arg["d_pwr_updt_g"](socl_net.power[dp_f_a][agent_no]['weight'], dP) # socl_net.power_delta(dp_f_a, agent_no, d_pwr_updt_g) new_plan.info['T_acpt'] = T + Tfi agent.a_plan = new_plan assert new_plan.area.sign is not None leadership_bill.leader_bill.add_record(record_type="m-plan", gen=new_plan.sign, user=Sign( agent_no, T + Tfi, 'act_jhjc')) leadership_bill.leader_bill.add_record(record_type="m-info", gen=new_plan.area.sign, user=Sign( agent_no, T + Tfi, 'act_jhjc')) logging.debug("plan_dist: %s" % agent.a_plan.len_to_finish(agent.state_now)) agent.policy_now = 'jhjc_new' # 添加当前行动记录,选择新计划 use_plan = True else: use_plan = False logging.debug(agent.policy_now) return socl_net, agent, use_plan