public JBrainNetwork(string id, double learningRate, double lambda, int hiddenLayers, int layerSize, Map map) { this.ID = id; FileInfo definition = new FileInfo(String.Format("JBrain_{0}.jbw", id)); if (definition.Exists) { Load(); } else { this.learningRate = learningRate; this.lambda = lambda; formerPrediction = 0; inputNeurons = map.Select(region => new InputNeuron(String.Format("ARMIES_{0}", region.ID))) .Concat(map.Select(region => new InputNeuron(String.Format("OWNER_{0}", region.ID)))).ToArray(); this.hiddenLayers = new Neuron[hiddenLayers][]; for (int i = 0; i < hiddenLayers; i++) { this.hiddenLayers[i] = Enumerable.Range(0, layerSize) .Select(j => new Neuron(String.Format("LAYER_{0}_HIDDEN_{1}", i, j), ((i > 0) ? this.hiddenLayers[i - 1] : inputNeurons))).ToArray(); } outputNeuron = new OutputNeuron("OUTPUT", ((hiddenLayers > 0) ? this.hiddenLayers.Last() : inputNeurons)); Save(); } }
private void Load() { XDocument doc = XDocument.Load(String.Format("JBrain_{0}.jbw", ID)); XElement root = doc.Root; learningRate = Double.Parse(root.Attribute("learning_rate").Value); lambda = Double.Parse(root.Attribute("lambda").Value); formerPrediction = Double.Parse(root.Attribute("last_prediction").Value); inputNeurons = root.Elements("InputNeuron").Select(elem => new InputNeuron(elem.Attribute("id").Value)).ToArray(); IDictionary<int, IEnumerable<XElement>> hiddenNeuronElems = root.Elements("Neuron") .GroupBy(elem => elem.Attribute("id").Value.Split('_')[1]) .ToDictionary(grouping => Int32.Parse(grouping.Key), grouping => (IEnumerable<XElement>)grouping); hiddenLayers = new Neuron[hiddenNeuronElems.Count][]; foreach (int layer in hiddenNeuronElems.Keys) { hiddenLayers[layer] = hiddenNeuronElems[layer] .Select(elem => new Neuron(elem.Attribute("id").Value, elem.Elements("Input").ToDictionary(inElem => Neurons.Where(neuron => (neuron.ID == inElem.Attribute("id").Value)).SingleOrDefault(), inElem => Double.Parse(inElem.Attribute("weight").Value)))).ToArray(); } XElement outputNeuronElem = root.Element("OutputNeuron"); outputNeuron = new OutputNeuron(outputNeuronElem.Attribute("id").Value, outputNeuronElem.Elements("Input").ToDictionary(elem => Neurons.Where(neuron => (neuron.ID == elem.Attribute("id").Value)).SingleOrDefault(), elem => Double.Parse(elem.Attribute("weight").Value))); }