SigmoidNetwork(int inputs, int outputs, int hiddenLayers, int neuronsPerLayer, double inputCompFactor, double compFactor, double multFactor)
        {
            /**
             * Construct the input layer, one connection per neuron
             */
            inputLayer = new Layer();
            for(int i = 1; i <= inputs; i++)
            {
                Neuron neuron = new SigmoidNeuron(inputCompFactor, multFactor);
                inputLayer.addNeuron(neuron);

                Connection connection = new Connection(1);
                neuron.addInput(connection);
                inputConnections.add(connection);
            }

            /**
             * Initialize the previous neurons list, which will keep track of where all neurons in the previous layer were, 
             * to easily build all necessary connections
             */
            ArrayList<Neuron> previousNeurons = inputLayer.getNeurons();

            /**
             * Build the hidden layers and fully interconnect them with each previous layer
             */
            for(int j = 1; j <= hiddenLayers; j++)
            {
                ArrayList<Neuron> newNeurons = new ArrayList<Neuron>();

                Layer layer = new Layer();
                for(int i = 1; i <= neuronsPerLayer; i++)
                {
                    Neuron neuron = new SigmoidNeuron(compFactor, multFactor);
                    layer.addNeuron(neuron);
                    newNeurons.add(neuron);

                    for(Neuron previousNeuron : previousNeurons)
                    {
                        Connection connection = new Connection(generateWeight());
                        previousNeuron.addOutput(connection);
                        neuron.addInput(connection);

                        adjustableConnections.add(connection);
                    }
                }
                this.hiddenLayers.add(layer);
                previousNeurons = newNeurons;
            }

            /**
             * Build the output layer and fully interconnect it with the last hidden layer.
             * Also add one connection per output neuron, with weight 1 (to ensure the outputs aren't distorted by the final connection)
             */
            outputLayer = new Layer();
            for(int i = 1; i <= outputs; i++)
            {
                Neuron neuron = new SigmoidNeuron(compFactor, multFactor);
                outputLayer.addNeuron(neuron);

                for(Neuron previousNeuron : previousNeurons)
                {
                    Connection connection = new Connection(generateWeight());
                    previousNeuron.addOutput(connection);
                    neuron.addInput(connection);
                    adjustableConnections.add(connection);
                }

                Connection connection = new Connection(1);
                neuron.addOutput(connection);
                outputConnections.add(connection);
            }
        }