2016-03-08 62 views
0

模拟项目的早期阶段,当程序运行时,它应该读入下面的文件中,然后它应该处理每个神经元和突触该程序。有两种类型的突触,未命名的突触和已命名的突触。上面的Synapse X是连接神经元A和B的命名的突触。未命名的突触在名称字段中有一个短划线。神经元和突触名称是非数字的。任何被命名的突触都可能是次级突触的目标。上述突触B X是将神经元B连接至(主要)突触X的次级突触。可以命名或未命名的突触具有两个亚类:初级和次级。Java:从输入文件读取数据,然后将数据移动到子类

我的问题:此代码是一个学期项目的一部分,前几个部分并不难,但我不确定子类。如何在突触线中扫描并确定哪些属于子类Primary,哪些属于Secondary?我应该对InitializeNetwork方法做些什么,或者我需要别的什么地方?

示例输入文件:*

neuron A 1.0 0.95 
neuron B 1.0 0.0 
synapse X A B 1.2 0.5 
synapse - B A 0.3 -0.5 
synapse - B X 0.3 0.5 

我到目前为止的代码:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.LinkedList; 
import java.util.Scanner; 

// Utility classes 

/** Error reporting methods 
*/ 
class Errors { 
    static void fatal(String message) { 
     System.err.println("Fatal error: " + message); 
     System.exit(1); 
    } 
    static void warning(String message) { 
     System.err.println("Error: " + message); 
    } 
} 

/** Input scanning support methods 
*/ 
class ScanSupport { 
    /** Force there to be a line end here, complain if not 
    */ 
    static void lineEnd(Scanner sc, String message) { 
     String skip = sc.nextLine(); 
     if (!"".equals(skip)) { 
      // Bug: do we want to allow comments here 
      Errors.warning(message + " -- expected a newline"); 
     } 
     // Bug: what if sc.nextLine() was illegal (illegal state) 
    } 

    /** Get the next float, or complain if there isn't one 
    */ 
    static String nextName(Scanner sc, String message) { 
     if (sc.hasNext("[a-zA-Z]\\w*")) { 
      return sc.next(); 
     } else { 
      Errors.warning(message + " -- expected a name"); 
      return null; 
     } 
    } 

    /** Get the next float, or complain if there isn't one 
    */ 
    static float nextFloat(Scanner sc, String message) { 
     if (sc.hasNextFloat()) { 
      return sc.nextFloat(); 
     } else { 
      Errors.warning(message + " -- expected a number"); 
      return 99.99f; 
     } 
    } 
} 

// Simulation classes 

/** Neurons are the vertices in the neuron network 
* @see Synapse 
*/ 
class Neuron { 
    String name;   // name of this neuron 
    private float threshold; // voltage at which the neuron fires 
    private float voltage;  // voltage at the given time 
    private float time;  // (see above) 

    private LinkedList <Synapse> synapses; // the outputs of this neuron 

    public class IllegalNameException extends Exception {} 

    // initializer 
    public Neuron(Scanner sc) throws IllegalNameException { 
     // scan and process one neuron 
     name = ScanSupport.nextName(sc, "Neuron ??"); 
     if (name == null) { 
      sc.nextLine(); 
      throw new IllegalNameException(); 
     } 
     if (NeuronNetwork.findNeuron(name) != null) { 
      Errors.warning(
       "Neuron " + name + " -- duplicate declaration" 
      ); 
      sc.nextLine(); 
      throw new IllegalNameException(); 
     } 
     threshold = ScanSupport.nextFloat(sc, "Neuron " + name); 
     voltage = ScanSupport.nextFloat(sc, "Neuron " + name); 
     time = 0.0f; 
     ScanSupport.lineEnd(sc, "Neuron " + name); 
    } 

    // other methods 
    public String toString() { 
     return (
      "Neuron " + 
      name + 
      " " + 
      threshold + 
      " " + 
      voltage 
     ); 
    } 
} 

/** Synapses join neurons 
* @see Neuron 
*/ 
class Synapse { 
    Neuron source; 
    Neuron destination; 
    Float delay; 
    Float strength; 

    // name is source destination 

    public Synapse(Scanner sc) { 
     // scan and process one synapse 
     String sourceName = ScanSupport.nextName(sc, "Synapse ??"); 
     String dstName = ScanSupport.nextName(sc, 
      "Synapse " + 
      (sourceName != null ? sourceName : "??") + 
      " ??" 
     ); 
     delay = ScanSupport.nextFloat(sc, 
      "Synapse " + 
      (sourceName != null ? sourceName : "??") + 
      " " + 
      (dstName != null ? dstName : "??") + 
      " ??" 
     ); 
     strength = ScanSupport.nextFloat(sc, 
      "Synapse " + 
      (sourceName != null ? sourceName : "??") + 
      " " + 
      (dstName != null ? dstName : "??") + 
      " " + delay + " ??" 
     ); 
     ScanSupport.lineEnd(sc, 
      "Synapse " + 
      (sourceName != null ? sourceName : "??") + 
      " " + 
      (dstName != null ? dstName : "??") + 
      delay + " " + strength 
     ); 

     // check correctness of fields 
     source = NeuronNetwork.findNeuron(sourceName); 
     if (source == null) { 
      Errors.warning(
       "Synapse " + 
       (sourceName != null ? sourceName : "??") + 
       " " + 
       (dstName != null ? dstName : "??") + 
       " -- no such source" 
      ); 
     } 
     destination = NeuronNetwork.findNeuron(dstName); 
     if (destination == null) { 
      Errors.warning(
       "Synapse " + 
       (sourceName != null ? sourceName : "??") + 
       " " + 
       (dstName != null ? dstName : "??") + 
       " -- no such destination" 
      ); 
     } 
     if (delay < 0.0f) { 
      Errors.warning(
       "Synapse " + 
       (sourceName != null ? sourceName : "??") + 
       " " + 
       (dstName != null ? dstName : "??") + 
       " " + delay + " " + strength + 
       " -- illegal negative delay" 
      ); 
      delay = 99.99f; 
     } 
    } 

    // other methods 
    public String toString() { 
     return (
      "Synapse " + 
      (source != null ? source.name : "---") + 
      " " + 
      (destination != null ? destination.name : "---") + 
      " " + delay + " " + strength 
     ); 
    } 
} 

/** NeuronNetwork is the main class that builds the whole model 
* @see Neuron 
* @see Synapse 
*/ 
public class NeuronNetwork { 

    // the sets of all neurons and all synapses 
    static LinkedList <Neuron> neurons 
     = new LinkedList <Neuron>(); 
    static LinkedList <Synapse> synapses 
     = new LinkedList <Synapse>(); 

    /** Look up s in neurons, find that Neuron if it exists 
    * return null if not. 
    */ 
    public static Neuron findNeuron(String s) { 
     for (Neuron n: neurons) { 
      if (n.name.equals(s)) { 
       return n; 
      } 
     } 
     return null; 
    } 

    /** Initialize the neuron network by scanning its description 
    */ 
    static void initializeNetwork(Scanner sc) { 
     while (sc.hasNext()) { 
      String command = sc.next(); 
      if ("neuron".equals(command)) { 
       try { 
        neurons.add(new Neuron(sc)); 
       } catch (Neuron.IllegalNameException e) { 
        // no action required 
       } 
      } else if ("synapse".equals(command)) { 
       synapses.add(new Synapse(sc)); 
      } else { 
       Errors.warning(command + " -- what is that"); 
       sc.nextLine(); 
      } 
     } 
    } 

    /** Print out the neuron network from the data structure 
    */ 
    static void printNetwork() { 
     for (Neuron n:neurons) { 
      System.out.println(n.toString()); 
     } 
     for (Synapse s:synapses) { 
      System.out.println(s.toString()); 
     } 
    } 

    /** Main program 
    * @see initializeNetwork 
    */ 
    public static void main(String[] args) { 
     try { 
      if (args.length < 1) { 
       Errors.fatal("-- missing file name"); 
      } 
      if (args.length > 1) { 
       Errors.fatal("-- too many arguments"); 
      } 
      initializeNetwork(new Scanner(new File(args[0]))); 
     } catch (FileNotFoundException e) { 
      Errors.fatal("" + args[0] + " -- file not found"); 
     } 
     printNetwork(); 
    } 
} 

回答

0

我会质疑,如果你真的想在这里用继承。使用合成可能是一个更好的主意,其中突触的行为由组成它的类定义。看看策略模式,它可能最终会比一些继承层次结构更好地工作。

http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

+0

我明白,但我想了解继承是如何工作的。 –

相关问题