public void Generate(ExtendRandom agent_network_rand, List <Agent> agents, bool bad_sensor_mode, SensorArrangementEnum sensor_arrange, List <List <int> > communityList = null) { foreach (var agent in agents) //全てのエージェントを初期化 { agent.SetSensor(false); } List <int> sensor_list = new List <int>(); int bad_sensor = -1; if (communityList.Count != 0 && sensor_arrange == SensorArrangementEnum.Each) //ネットワークがコミュニティ構造を持つとき { int rest = 0; if (this.SensorSize > communityList.Count) //コミュニティの数よりセンサの数の方が多いとき { for (var i = 0; i < this.SensorSize; i++) { //sensor_list = agents.Select(agent => agent.AgentID).OrderBy(id => agent_network_rand.Next()).Take(this.SensorSize).ToList(); var sensors = agents.Where(agent => communityList[i % communityList.Count].Contains(agent.AgentID)); //コミュニティのメンバー.センサ候補 var sensor = sensors.Select(agent => agent.AgentID).OrderBy(id => agent_network_rand.Next()).Take(1).ToList().First(); //一人センサを選ぶ sensor_list.Add(sensor); } rest = this.SensorSize % communityList.Count; } else //コミュニティの数がセンサの数以下の時 { for (var i = 0; i < this.SensorSize; i++) { //sensor_list = agents.Select(agent => agent.AgentID).OrderBy(id => agent_network_rand.Next()).Take(this.SensorSize).ToList(); var sensors = agents.Where(agent => communityList[i].Contains(agent.AgentID)); //コミュニティのメンバー.センサ候補 var sensor = sensors.Select(agent => agent.AgentID).OrderBy(id => agent_network_rand.Next()).Take(1).ToList().First(); //一人センサを選ぶ sensor_list.Add(sensor); } } if (bad_sensor_mode) { if (rest != 0) { while (true) { int candidate = agent_network_rand.Next(0, sensor_list.Count); bool flag = false; for (var j = 0; j < rest; j++) { if (candidate % communityList.Count == j) { flag = true; } } if (!flag) { bad_sensor = candidate; break; } } } else { bad_sensor = agent_network_rand.Next(0, sensor_list.Count); } agents.Where(agent => sensor_list[bad_sensor] == agent.AgentID).ToList().ForEach(agent => agent.SetBadSensor(true)); this.BadCommunityIndex = bad_sensor; agents.Where(agent => communityList[bad_sensor].Contains(agent.AgentID)).ToList().ForEach(agent => agent.SetBadCommunity(true)); } } else //ネットワークがコミュニティ構造を持たないとき { sensor_list = agents.Select(agent => agent.AgentID).OrderBy(id => agent_network_rand.Next()).Take(this.SensorSize).ToList(); if (bad_sensor_mode) { bad_sensor = agent_network_rand.Next(0, sensor_list.Count); agents.Where(agent => sensor_list[bad_sensor] == (agent.AgentID)).ToList().ForEach(agent => agent.SetBadSensor(true)); this.BadCommunityIndex = bad_sensor; } } var malicious_sensor_list = sensor_list.OrderBy(id => agent_network_rand.Next()).Take(this.MaliciousSensorSize).ToList(); agents.Where(agent => sensor_list.Contains(agent.AgentID)).ToList().ForEach(agent => agent.SetSensor(true, false)); //センサエージェントに選ばれたエージェントをセンサとして認定 agents.Where(agent => malicious_sensor_list.Contains(agent.AgentID)).ToList().ForEach(agent => agent.SetSensor(true, true)); //誤情報センサに選ばれたエージェントを認定 }
public AgentNetwork SetSensorArrange(SensorArrangementEnum arrange) { this.SensorArragne = arrange; return(this); }
public OSMSetting(ExperimentType experiment_type) { common_weight = 0.5; common_curiocity = 0.5; dist_weight = 0.5; malicious_dist_weight = 0; //0.8 //int malicious_sensor_size = (int)(0.04 * agent_size); sample_size = 1; change_round = 0; dim = 2; correct_dim = 0; malicious_dim = 1; switch (experiment_type) { case ExperimentType.OSM_LFR_Bad_Each_Exponential: agent_size = 100; algo = AlgoEnum.OSMonly; targeth = 0.9; sensor_weight = 0.8; //0.8 malicious_sensor_size = 0; op_form_threshold = 0.9; bad_sensor_mode = true; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Exponential; belief_update = BeliefUpdateFunctionEnum.Bayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.OSM_LFR_Bad_Each_Shitei_SameOpinionBayse: agent_size = 100; algo = AlgoEnum.OSMonly; targeth = 0.9; sensor_weight = 0.8; //0.8 malicious_sensor_size = 0; op_form_threshold = 0.9; bad_sensor_mode = true; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Shitei; belief_update = BeliefUpdateFunctionEnum.SameOpinionAdjustBayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.OSM_LFR_Normal_Each_Exponential: agent_size = 100; algo = AlgoEnum.OSMonly; targeth = 0.9; sensor_weight = 0.8; //0.8 op_form_threshold = 0.9; bad_sensor_mode = true; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Exponential; belief_update = BeliefUpdateFunctionEnum.Bayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.AAT_LFR_Bad_Each_Shitei: agent_size = 100; algo = AlgoEnum.AAT; targeth = 0.9; sensor_weight = 0.55; //0.8 op_form_threshold = 0.9; sample_size = 1; change_round = 0; bad_sensor_mode = true; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Shitei; belief_update = BeliefUpdateFunctionEnum.Bayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.AAT_LFR_Bad_Each_Exponential: agent_size = 100; algo = AlgoEnum.AAT; targeth = 0.9; sensor_weight = 0.8; //0.8 op_form_threshold = 0.9; bad_sensor_mode = true; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Exponential; belief_update = BeliefUpdateFunctionEnum.Bayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.AAT_LFR_Bad_Each_Exponential_SameOpinionBayse: agent_size = 100; algo = AlgoEnum.AAT; targeth = 0.7; sensor_weight = 0.8; //0.8 op_form_threshold = 0.9; bad_sensor_mode = true; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Exponential; belief_update = BeliefUpdateFunctionEnum.SameOpinionAdjustBayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.AAT_LFR_Bad_Each_Shitei_SameOpinionBayse: agent_size = 100; algo = AlgoEnum.AAT; targeth = 0.8; sensor_weight = 0.8; //0.8 op_form_threshold = 0.9; bad_sensor_mode = true; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Exponential; belief_update = BeliefUpdateFunctionEnum.SameOpinionAdjustBayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.AAT_LFR_Normal_Each_Shitei: agent_size = 100; algo = AlgoEnum.AAT; targeth = 0.9; sensor_weight = 0.55; //0.8 op_form_threshold = 0.8; bad_sensor_mode = false; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Shitei; belief_update = BeliefUpdateFunctionEnum.Bayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.AAT_LFR_Normal_Each_Exponential: agent_size = 100; algo = AlgoEnum.AAT; targeth = 0.9; sensor_weight = 0.8; //0.8 op_form_threshold = 0.9; bad_sensor_mode = false; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Each; env_distribution = EnvDistributionEnum.Exponential; belief_update = BeliefUpdateFunctionEnum.Bayse; add_share_only_community = false; select_graph = GraphEnum.LFR; break; case ExperimentType.AAT_SW_Normal_Random_Exponential: agent_size = 100; algo = AlgoEnum.AAT; targeth = 0.9; sensor_weight = 0.8; //0.8 op_form_threshold = 0.9; bad_sensor_mode = false; opinion_share_num = 1; sensor_arrange = SensorArrangementEnum.Random; env_distribution = EnvDistributionEnum.Exponential; belief_update = BeliefUpdateFunctionEnum.Bayse; add_share_only_community = false; select_graph = GraphEnum.Grid2D; break; } sensor_size = (int)(0.05 * agent_size); }