public BlackWhiteSubject newData() { BlackWhiteSubject currentData; double r = RandomPool.Get("sensor").NextDouble(); if (r < accuracy)//正しいデータ { currentData = theFact.Value; } else //間違ったデータ { if (theFact.Value == BlackWhiteSubject.Black)//天邪鬼if { currentData = BlackWhiteSubject.White; } else { currentData = BlackWhiteSubject.Black; } } //知らせる SendOpinion(currentData, agent); return(currentData); }
public I_Agent Generate(I_Node node, InfoEnum init_op, double g_sigma, double r_sigma, AgentInitMode mode) { var node_id = node.NodeID; var init_weight_list = new Dictionary <int, double>(); foreach (var neighbor in node.NeighborNodeIDList) { init_weight_list.Add(neighbor, 1.0); } double init_belief = 0; var ir = RandomPool.Get(SeedEnum.AgentSeed); switch (mode) { case AgentInitMode.Random: init_belief = ir.NextDouble(r_sigma, g_sigma); break; case AgentInitMode.RandomWeakPulledByOpinion: if (init_op == InfoEnum.Green) { init_belief = ir.NextDouble(0.5, g_sigma); } else { init_belief = ir.NextDouble(r_sigma, 0.5); } break; case AgentInitMode.RandomStrongPulledByOpinion: if (init_op == InfoEnum.Green) { init_belief = ir.NextDouble(g_sigma, 1.0); } else { init_belief = ir.NextDouble(0, r_sigma); } break; case AgentInitMode.Normal: init_belief = ir.NextNormal(0.5, 0.1); break; case AgentInitMode.NormalWeakPulledByOpinion: break; case AgentInitMode.NormalStrongPulledByOpinion: break; default: break; } return(new BaseAgent(node_id, init_belief, init_weight_list, init_op, g_sigma, r_sigma)); }
public void SetSensors(int num, double sensor_acc) { this.SensorNum = num; this.SensorAcc = sensor_acc; var ir = RandomPool.Get(SeedEnum.AgentSeed); var list = this.AgentList.Select(agent => agent.NodeID).OrderBy(id => ir.Next()).Take(num) .ToList(); this.AgentList.Where(agent => list.Contains(agent.NodeID)).ToList().ForEach(agent => agent.SetSensor(true, sensor_acc)); }
public void randomNext() { double r = RandomPool.Get("fact").NextDouble(); if (r < 0.5) { Value = BlackWhiteSubject.White; } else { Value = BlackWhiteSubject.Black; } }
public IEnumerable <Link> SelectLinksToRewire(IEnumerable <Link> links) { int linksNum = links.Count(); int rewireNum = (int)(p_rewire * linksNum); IEnumerable <int> selectedIndex = RandomPool.Get("envset").getRandomIndexes(linksNum, rewireNum); List <Link> selectedLinks = new List <Link>(); foreach (var index in selectedIndex) { selectedLinks.Add(links.ElementAt(index)); } return(selectedLinks); }
public override Network create() { Console.WriteLine("make random network!"); //ネットワーク Network net = new Network(); //ノードであるAgent for (int i = 0; i < NodeNum; i++) { net.AddNode(NodeCreate());//エージェントを選択可能にしたいよね } foreach (var Node_i in net.Nodes) { foreach (var Node_j in net.Nodes) { if (Node_i == Node_j) { break; } double r = RandomPool.Get("envset").NextDouble(); if (r < 0.3) { //0.3の確率でコネクション作成 net.ConnectNode(Node_i, Node_j); } } var nodes = net.Nodes; if (Node_i.Neighbours.Count() == 0) { int r; do { r = RandomPool.Get("envset").Next(NodeNum); } while (nodes.ElementAt(r) == Node_i); net.ConnectNode(Node_i, nodes.ElementAt(r)); } } //まだ!! return(net); }
private void PrepareSensor(int sensorNum) { //センサー Sensors = new List <Sensor>(); //センサーをもつエージェントを決める var selectedIndexes = RandomPool.Get("setenv").getRandomIndexes(this.Network.Nodes.Count(), sensorNum); foreach (var i in selectedIndexes) { //センサーを生成 Sensor s = new Sensor(TheFact); //センサーにエージェントをセット(内部でAgentのhavesensorをtrueにしてる.微妙に密結合) s.SetAgent((Agent)this.Network.Nodes.ElementAt(i)); this.Sensors.Add(s); } }
//センサーエージェントは、センサーの値を観測 private void SensorObservation() { //*** 10%のセンサーが新しい値を取得する.*** int sensorNum = Environment.Sensors.Count; int observationNum = (int)(Math.Ceiling(sensorNum * 0.1)); var indexes = RandomPool.Get("sensor").getRandomIndexes(sensorNum, observationNum); //L.g("sensor").Write(""); foreach (int index in indexes) { Sensor s = Environment.Sensors.ElementAt(index); var data = s.newData(); // L.g("sensor").Write("s->" + s.Agent.ID + " " + ( data == BlackWhiteSubject.White ? 1 : -1 ) + ", "); } //L.g("sensor").WriteLine(""); }
void SendEnvMessage(I_Network network, I_AgentSet agent_set, InfoEnum correct, InfoEnum incorrect, double op_intro_rate) { this.OpinionIntroCounts++; if (this.OpinionIntroCounts < this.OpinionIntroductionDuration) { return; } this.OpinionIntroCounts = 0; this.EnvOpinionCounts++; var correct_opinion = correct; var incorrect_opinion = incorrect; foreach (var agent in agent_set.AgentList) { if (!(agent.IsSensor)) { continue; } if (RandomPool.Get(SeedEnum.PlayStepSeed).NextDouble() > op_intro_rate) { continue; } var env_info = InfoEnum.Undeter; if (RandomPool.Get(SeedEnum.PlayStepSeed).NextDouble() < agent.SensorAccuracy) { env_info = correct_opinion; } else { env_info = incorrect_opinion; } this.SendMessageQueue.Enqueue(new Message(-1, agent.NodeID, env_info)); } }
private INode RuletSelect(IEnumerable <INode> nodes) { int sum = 0; int cum = 0; double r = RandomPool.Get("envset").NextDouble(); foreach (var node in nodes) { sum += node.Neighbours.Count; } foreach (var node in nodes) { cum += node.Neighbours.Count; if (r < (double)cum / sum) { return(node); } } throw new Exception("何が起こった!?"); }
static public AgentAlgorithm CreateAlgorithm(string name, double h_trg) { IAATBasedAgent algo = creators[name](); //信念など if (algo is SubOpinion) //今はまだ場合分けが少ないからいいけどいずれはFactory Methodになるかも。 { algo.Thought = new ThoughtTwin(RandomPool.Get("envset").NextNormal(0.5, 0.1)); } else { algo.Thought = new Thought(RandomPool.Get("envset").NextNormal(0.5, 0.1)); } //候補集合 algo.CandidateSelector = new CandidateUpdaterSelector(); algo.TargetAwarenessRate = h_trg; //最後に初期化 algo.Initialize(); return(algo as AgentAlgorithm); }
public override Network create() { //RandomPool.Get("envset").Init(); Network net = new Network(); INode[] Nodes = new INode[NodeNum]; //エージェントを登録 for (int i = 0; i < NodeNum; i++) { Nodes[i] = NodeCreate(); net.AddNode(Nodes[i]); } //まずは輪っかをつくる for (int i = 0; i < NodeNum; i++) { //degreeが偶数じゃないとちゃんと働きません!!つか奇数ってどうやるの!? for (int j = 1; j <= degree / 2; j++) { int index = i + j; if (index >= NodeNum) {//indexが範囲を超えていたら、一周回らせて収める index = index - NodeNum; } net.ConnectNodes(Nodes[i], Nodes[index]); } } /* pの割合のリンクをreconnectする。*/ //rewireするべきlinkをみつける var linksToRewire = SelectLinksToRewire(net.Links); foreach (var link in linksToRewire)//それぞれのリンクを張り替える { //リンクをはずす。 net.DisconnectNode(link); //軸はどっちか INode pivot = (RandomPool.Get("envset").NextDouble() <= 0.5 ? link.Node1 : link.Node2); //ご近所じゃないやつを探す var neighbourOfPivot = net.GetNeighbour(pivot); var allNodes = new List <INode>(net.Nodes); foreach (var node in neighbourOfPivot) { allNodes.Remove(node); } allNodes.Remove(pivot); var notNeighbour = allNodes; //次のパートナーを選ぶ。 INode nextPartner = notNeighbour.ElementAt(RandomPool.Get("envset").Next(notNeighbour.Count)); net.ConnectNodes(pivot, nextPartner); } RandomPool.Get("envset").Init(); return(net); }
//*** constructor and properties ***// public Agent() { thought = new Thought(RandomPool.Get("setenv").NextNormal(0.5, 0.1));//ランダム要素はここだけ Initialize(); }
public override Network create() { //RandomPool.Get("envset").Init(); Network net = new Network(); INode[] Nodes = new INode[NodeNum]; //エージェントを登録 for (int i = 0; i < NodeNum; i++) { Nodes[i] = NodeCreate(); net.AddNode(Nodes[i]); } //まずは輪っかをつくる for (int i = 0; i < NodeNum - 1; i++) { //degreeが偶数じゃないとちゃんと働きません!!つか奇数ってどうやるの!? for (int j = 1; j <= degree / 2; j++) { int index = i + j; if (index >= NodeNum) {//indexが範囲を超えていたら、一周回らせて収める index = index - NodeNum; } net.ConnectNodes(Nodes[i], Nodes[index]); } } List <AgentIO> sensorAgents = new List <AgentIO>(); //センサーエージェントの一覧を求める foreach (var node in net.Nodes) { if ((node as AgentIO).HasSensor) { sensorAgents.Add(node as AgentIO); } } /* pの割合のリンクをreconnectする。*/ //rewireするべきlinkをみつける var linksToRewire = SelectLinksToRewire(net.Links); foreach (var link in linksToRewire)//それぞれのリンクを張り替える { //リンクをはずす。 net.DisconnectNode(link); //軸はどっちか INode pivot = (RandomPool.Get("envset").NextDouble() <= 0.5 ? link.Node1 : link.Node2); //ご近所じゃないやつを探す var neighbourOfPivot = net.GetNeighbour(pivot); var allNodes = new List <INode>(net.Nodes); foreach (var node in neighbourOfPivot) { allNodes.Remove(node); } allNodes.Remove(pivot); var notNeighbour = allNodes; //次のパートナーを選ぶ。 INode nextPartner = notNeighbour.ElementAt(RandomPool.Get("envset").Next(notNeighbour.Count)); net.ConnectNodes(pivot, nextPartner); } //Nodes[NodeNum -1]に,全員をつながせたい //2014_0707:n人と繋がるように(NodeNum - n)に変更 //2014_0708:全員と繋げるためにリンクの張替え後に移動しました //2014_0901leaderNodeをランダムに繋げるように設定 //for (int i = 0; i < 30; i++) //{ // Node[0]と,LeaderNodesをつなぐ // int o = RandomPool.Get("envset").Next(linkNum);//leaderと繋がるノード // if (o != l) // { // net.ConnectNodes(Nodes[o], Nodes[l]); // } int l = RandomPool.Get("envset").Next(linkNum);//leaderノード int k = 0; int o = 0; while (o >= 0 && k != 30) { o = RandomPool.Get("envset").Next(linkNum); //leaderと繋がるノード if (o != l) { net.ConnectNodes(Nodes[o], Nodes[l]); //leaderとNodeをランダムに繋ぐ k++; } } // RandomPool.Get("envset").Init();///ここでノード指定?環境のノードっぽい return(net); }