private bool AddNode(NetworkGenome temp) { List <LinkGene> list = new List <LinkGene>(temp.MutatableLinks); if (list.Count < 1) { return(false); } LinkGene split = list[(int)(Utilities.Rnd.NextDouble() * (double)list.Count)]; NodeGene NodeGenes1 = temp.Nodes.Find((Predicate <NodeGene>)(g => g.Id == split.Source)); NodeGene NodeGenes2 = temp.Nodes.Find((Predicate <NodeGene>)(g => g.Id == split.Target)); if (Math.Abs(NodeGenes1.Layer - NodeGenes2.Layer) <= 1) { return(false); } NodeGene NodeGenes3 = new NodeGene("Identity", 0, Utilities.Rnd.Next(Math.Min(NodeGenes1.Layer, NodeGenes2.Layer) + 1, Math.Max(NodeGenes1.Layer, NodeGenes2.Layer)), NodeType.Hidden); NodeGenes3.Id = HistoricalMarkings.GetNodeMarking(split.Id, NodeGenes3.Layer, this.Generation); NodeGenes3.Function = this.SelectFunction(); LinkGene LinkGenes1 = new LinkGene(HistoricalMarkings.GetLinkMarking(NodeGenes1.Id, NodeGenes3.Id, this.Generation), NodeGenes1.Id, NodeGenes3.Id, split.Weight); LinkGene LinkGenes2 = new LinkGene(HistoricalMarkings.GetLinkMarking(NodeGenes3.Id, NodeGenes2.Id, this.Generation), NodeGenes3.Id, NodeGenes2.Id, Math.Max(-this.Mutate.WeightRange / 2.0, Math.Min(this.Mutate.WeightRange / 2.0, Utilities.Rnd.NextGuassian(0.0, 0.2) * this.Mutate.WeightRange / 2.0))); temp.Nodes.Add(NodeGenes3); temp.Links.Add(LinkGenes1); temp.Links.Add(LinkGenes2); if (Utilities.Rnd.NextDouble() > this.Mutate.KeepLinkOnAddNode) { temp.Links.Remove(split); } return(true); }
public int CompareTo(object obj) { NodeGene nodeGene = obj as NodeGene; if (nodeGene == null) { throw new InvalidOperationException("Object being compared to is not a NodeGene!"); } return(this.Id.CompareTo(nodeGene.Id)); }
private bool ChangeNode(NetworkGenome temp) { List <NodeGene> list = new List <NodeGene>(temp.MutatableNodes); if (list.Count < 1) { return(false); } NodeGene NodeGenes = list[(int)(Utilities.Rnd.NextDouble() * (double)list.Count)]; string str = NodeGenes.Function; for (int index = 0; NodeGenes.Function == str && index < 7; ++index) { NodeGenes.Function = this.SelectFunction(); } return(!(NodeGenes.Function == str)); }
private bool AddConnection(NetworkGenome temp) { List <NodeGene> list1 = new List <NodeGene>((IEnumerable <NodeGene>)temp.Nodes); NodeGene source = list1[(int)(Utilities.Rnd.NextDouble() * (double)list1.Count)]; List <NodeGene> list2 = new List <NodeGene>(Enumerable.Where <NodeGene>((IEnumerable <NodeGene>)temp.Nodes, (Func <NodeGene, bool>)(nodes => { if (nodes.Type == NodeType.Bias || nodes.Type == NodeType.Input) { return(false); } if (!this.Mutate.Recurrence) { return(nodes.Layer > source.Layer); } return(true); }))); if (list2.Count < 1) { return(false); } NodeGene target = list2[(int)(Utilities.Rnd.NextDouble() * (double)list2.Count)]; if (Enumerable.Any <LinkGene>((IEnumerable <LinkGene>)temp.Links, (Func <LinkGene, bool>)(l => { if (l.Source == source.Id) { return(l.Target == target.Id); } return(false); }))) { return(false); } temp.Links.Add(new LinkGene(0, source.Id, target.Id, Math.Max(-this.Mutate.WeightRange / 2.0, Math.Min(this.Mutate.WeightRange / 2.0, Utilities.Rnd.NextGuassian(0.0, 0.1) * this.Mutate.WeightRange / 2.0))) { Id = HistoricalMarkings.GetLinkMarking(source.Id, target.Id, this.Generation) }); return(true); }
private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() != DialogResult.OK) { return; } NetworkGenome networkGenome = NetworkGenome.LoadFromFile(openFileDialog.FileName); Graph graph = new Graph("Genome: " + (object)networkGenome.Id); graph.GraphAttr.LayerDirection = LayerDirection.BT; graph.Directed = true; graph.GraphAttr.LayerSep = 10.0; graph.BuildNodeHierarchy = true; graph.GraphAttr.OptimizeLabelPositions = true; graph.GraphAttr.NodeAttr.Padding = 1.0; int num = networkGenome.Nodes.Find((Predicate <NodeGene>)(n => n.Type == NodeType.Output)).Layer; ArrayList arrayList1 = new ArrayList(); for (int i = 0; i < num + 1; ++i) { ArrayList arrayList2 = new ArrayList(); foreach (NodeGene nodeGene in Enumerable.Where <NodeGene>((IEnumerable <NodeGene>)networkGenome.Nodes, (Func <NodeGene, bool>)(node => node.Layer == i))) { arrayList2.Add((object)nodeGene.Id.ToString()); } graph.AddSameLayer((IEnumerable)arrayList2); } graph.GraphAttr.Orientation = Microsoft.Glee.Drawing.Orientation.Landscape; graph.NeedCalculateLayout = true; graph.GraphAttr.Fontsize = 8; graph.GraphAttr.EdgeAttr.Fontsize = 7; graph.Cluster = true; graph.GraphAttr.LabelFloat = LabelFloat.Float; using (List <LinkGene> .Enumerator enumerator = networkGenome.Links.GetEnumerator()) { while (enumerator.MoveNext()) { LinkGene link = enumerator.Current; if (link.Weight != 0.0 && link.Source != -1) { //Edge edge = graph.AddEdge(link.Source.ToString(), link.Id.ToString(), link.Target.ToString()); Edge edge = graph.AddEdge(link.Source.ToString(), link.Weight.ToString("0.##"), link.Target.ToString()); edge.Attr.Fontsize = 7; edge.EdgeAttr.Fontsize = 7; if (link.Weight <= 0.0) { edge.Attr.Color = Microsoft.Glee.Drawing.Color.Red; } NodeGene nodeGene1 = networkGenome.Nodes.Find((Predicate <NodeGene>)(n => n.Id == link.Source)); NodeGene nodeGene2 = networkGenome.Nodes.Find((Predicate <NodeGene>)(n => n.Id == link.Target)); edge.Attr.Weight = Math.Max(nodeGene1.Layer - nodeGene2.Layer, 0); edge.UserData = (object)link; } } } for (int index = 0; index < networkGenome.Nodes.Count; ++index) { (graph.FindNode(networkGenome.Nodes[index].Id.ToString()) ?? graph.AddNode(networkGenome.Nodes[index].Id.ToString())).UserData = (object)networkGenome.Nodes[index]; } foreach (NodeGene nodeGene in networkGenome.Nodes) { if (nodeGene.Layer == 0) { Visualizers.CreateSourceNode(graph.FindNode(nodeGene.Id.ToString())); } else if (nodeGene.Layer == num) { this.CreateTargetNode(graph.FindNode(nodeGene.Id.ToString())); } else { this.CreateHiddenNode(graph.FindNode(nodeGene.Id.ToString())); } } this.gViewer.Graph = graph; }
public NodeGene(NodeGene copyFrom) : this(copyFrom.Fixed, copyFrom.Function, copyFrom.Id, copyFrom.Layer, copyFrom.Mutated, copyFrom.Type) { }