Написал программу, реализующую соединение элементов в схему "Исключающее ИЛИ", состоящую из двух нейронов, одного элемента "И", двух входов схемы и двух входов смещения нейронов. "-1" означает логическое "False", "+1" - "True". При отладке в среде Netbeans выдает исключение указателя на Null: Exception in thread "main" java.lang.NullPointerException at neuroinf.Neuroinf.main(Neuroinf.java:45) Так и не понял, почему. В отладке nu1 нормально инициализируется. Вот исходники программы: | Код | package neuroinf;
/** Neuroinf.java * Главный класс * */ public class Neuroinf { /** * @param args the command line arguments */public static class MyThreshold extends Threshold {
@Override double calculate(double input) { double threshold = 0; if (input < threshold) return -1; else return 1; //throw new UnsupportedOperationException("Not supported yet."); } } public static void main(String[] args) { // read, readLine MyThreshold myThreshold = new MyThreshold(); // TODO code application logic here Circuit circuit = new Circuit(); Neuron neuron1 = new Neuron(); Neuron neuron2 = new Neuron(); InputElement inputElement1 = new InputElement(); InputElement inputElement2 = new InputElement(); InputElement shift1 = new InputElement(1); InputElement shift2 = new InputElement(1); AndElement andElement = new AndElement(); // Создаем пороговые функции для нейронов neuron1.threshold = myThreshold; neuron2.threshold = myThreshold; // Сигналы смещения нейрона neuron1.offset = new NeuronInput (1, shift1); neuron2.offset = new NeuronInput (1, shift2); NeuronInput nu1 = new NeuronInput(1, inputElement1); // Соединяем элементы в схему neuron1.inputs.add(nu1); // Тут выдает исключение neuron1.inputs.add(new NeuronInput(-1, inputElement2)); neuron2.inputs.add(new NeuronInput(-1, inputElement1)); neuron2.inputs.add(new NeuronInput(1, inputElement2)); andElement.Element1 = neuron1; andElement.Element2 = neuron2; circuit.Elements.add(inputElement1); circuit.Elements.add(inputElement2); circuit.Elements.add(shift1); circuit.Elements.add(shift2); circuit.Elements.add(neuron1); circuit.Elements.add(neuron2); circuit.Elements.add(andElement); // Инициализация входов inputElement1.output = -1; inputElement2.output = -1; // Расчет схемы circuit.calculate(); System.out.println("Выход схемы:" + andElement.output); } }
|
| Код | package neuroinf;
import java.util.Iterator; import java.util.List;
/** Neuron.java * Реализация класса нейрона */ public class Neuron extends Element {
NeuronInput offset; // Вход смещения List<NeuronInput> inputs; // Список входных элементов к данному элементу Threshold threshold; // Ссылка на класс, реализующий пороговую функцию // Реализация функции расчета нейрона @Override void calculate() { double sum = 0; // Сумматор входов for (Iterator it = inputs.iterator(); it.hasNext();) { NeuronInput input = (NeuronInput) it.next(); sum += input.element.output * input.weight; } // Суммируем с сигналом смещения sum += offset.element.output * offset.weight; // Реализация порогового элемента output = threshold.calculate(sum); // throw new UnsupportedOperationException("Not supported yet."); } }
|
| Код | package neuroinf;
/** NeuronInput.java * Класс входа нейрона со ссылкой на входной к нейрону элемент и весом * */ public class NeuronInput { double weight; Element element; NeuronInput (double w, Element el) { weight = w; element = el; } }
|
| Код | package neuroinf;
/** InputElement.java * * Входной к схеме элемент со значением, нужен для реализации входного элемента */ public class InputElement extends Element { double input; // Значение входа InputElement () { } InputElement (double in) { input = in; } @Override void calculate() { output = input; //throw new UnsupportedOperationException("Not supported yet."); } }
|
| Код | package neuroinf;
/** * Element.java * Абстрактный класс со значением выхода * Все элементы соединяются в схему так: * Величина на вход элемента попадает с выхода output присоединенного к нему элемента */ abstract class Element { abstract void calculate (); // Вычисляет значение output исходя из выходов // входных элементов public double output; // Выходное значение элемента }
|
| Код | package neuroinf;
import java.util.Iterator; import java.util.List;
/** * Circuit.java * Реализация схемы */
public class Circuit { //List<Element> inputs; // Элементы, имитирующие вход // List<Element> outputElements; //Список выходных элементов List<Element> Elements; // Список элементов схемы, упорядоченных в порядке их расчета void calculate() { // Расчет параметров элементов согласно списку for (Iterator it = Elements.iterator(); it.hasNext();) { Element el = (Element) it.next(); el.calculate(); } } }
|
| Код | package neuroinf;
/** * Абстрактный класс для функции вычисления порога */ abstract class Threshold { // Пороговая функция, вычисляет значения по аргументу input abstract double calculate(double input); }
|
| Код | package neuroinf;
/** * AndElement.java * Двухвходовый элемент "И" */ public class AndElement extends Element { Element Element1, Element2; // Входные элементы @Override void calculate() { //throw new UnsupportedOperationException("Not supported yet."); if (Element1.output == -1 && Element2.output == -1) output = -1; if (Element1.output == 1 && Element2.output == -1) output = -1; if (Element1.output == -1 && Element2.output == 1) output = -1; if (Element1.output == 1 && Element2.output == 1) output = 1; } }
|
Это сообщение отредактировал(а) Rasool - 8.8.2011, 18:59
|