Network.java
上传用户:kingseaxu
上传日期:2009-01-01
资源大小:49k
文件大小:15k
源码类别:

3G开发

开发平台:

Java

  1. import java.util.*;
  2. import java.awt.Point;
  3. import java.io.*;
  4. class Network {
  5.     static double x_range; /* the maximum x coordinate of network */
  6.     static double y_range; /* the maximum y coordinate of network */
  7.     static int node_num; /* number of nodes */
  8.     static int seed_num; /* number of seed node, 0..seed_num-1 are seeds, seed_num..node_num-1 are other nodes */
  9.     static int min_v; /* minimum velocity */
  10.     static int max_v; /* maximum velocity */
  11.     static int group_v; /* maximum group velocity */
  12.     static int node_r; /* transmission range of node */
  13.     static int seed_r; /* transmission range of seed */
  14.     static double doi; /* radio range error */
  15.     static double delta; /* possible error of sample points */
  16.     Vector[] neighbors; /* neighbor lists of nodes */
  17.     Point[] seed_pos; /* the positions of seeds */
  18.     int relation[][]; /* relationship of nodes to seeds (within one hop or two hops) */
  19.     double[][] path_length; /* estimated distance from nodes to seeds, for MIT algorithm only */
  20.     Node[] node; /* nodes in the network */
  21.     double avg_MIT_error; /* average amorphous computing estimate error */
  22.     double avg_USC_error; /* average centroid estimate error */
  23.     double avg_MCL_error; /* average monte calo estimate error */
  24.     Point group_ref; /* accumulated offset of group motion */
  25.    
  26.     public Network(Input in) {
  27.    
  28.     int i;
  29.    
  30.     x_range = Double.parseDouble(in.getParameter("x_range"));
  31.     y_range = Double.parseDouble(in.getParameter("y_range"));
  32.     node_num = Integer.parseInt(in.getParameter("node_num"));
  33.     seed_num = Integer.parseInt(in.getParameter("seed_num"));
  34.     node_r = Integer.parseInt(in.getParameter("node_r"));
  35.     seed_r = Integer.parseInt(in.getParameter("seed_r"));
  36.     min_v = Integer.parseInt(in.getParameter("min_v"));
  37.     max_v = Integer.parseInt(in.getParameter("max_v"));
  38.     group_v = Integer.parseInt(in.getParameter("group_v"));
  39.     delta = Integer.parseInt(in.getParameter("delta"));
  40.     doi = Integer.parseInt(in.getParameter("doi"));
  41.    
  42.     avg_MIT_error = 0;
  43.     avg_USC_error = 0;
  44.     avg_MCL_error = 0;
  45.     node = new Node[node_num];
  46.    
  47.     for (i = 0; i < seed_num; i++) 
  48.         node[i] = new Node(i, seed_r, true);
  49.         
  50.     for (i = seed_num; i < node_num; i++)
  51.         node[i] = new Node(i, node_r, false);
  52.         
  53.     neighbors = new Vector[node_num];
  54.    
  55.     for (i = 0; i < node_num; i++)
  56.         neighbors[i] = new Vector();
  57.    
  58.     path_length = new double[node_num][seed_num];
  59.    
  60.     relation = new int[node_num][seed_num];
  61.    
  62.     seed_pos = new Point[seed_num];
  63.    
  64.     group_ref = new Point(0, 0);
  65.     }   
  66.     
  67.     /** update locations and corresponding information of all nodes */
  68.     public void updateLocation() {
  69.      for (int i = 0; i < seed_num; i++)
  70.          seed_pos[i] = new Point(node[i].p);
  71.     
  72.      Establish_NeighborList();
  73.     
  74.      Establish_Relation();
  75.     
  76.      Establish_Path(false);    
  77.     
  78.     }
  79.     
  80.     /** update locations and corresponding information of nodes from start to end */
  81.     public void updateLocation(int start, int end) {
  82.      for (int i = 0; i < seed_num; i++)
  83.          seed_pos[i] = new Point(node[i].p);
  84.     
  85.      Establish_NeighborList(start, end);
  86.     
  87.      Establish_Relation(start, end);
  88.     
  89.     
  90.     }
  91.     
  92.     /** establish neighbor list of nodes */
  93.     public void Establish_NeighborList() {
  94.     
  95.      int i, j;
  96.     
  97.      for (i = 0; i < node_num; i++)
  98.          neighbors[i].clear();
  99.     
  100.      for (i = 0; i < node_num; i++) {
  101.          
  102.          for (j = 0; j < seed_num; j++)
  103.           if ( (i != j) && CanHear(node[i].p.distance(node[j].p), seed_r)) 
  104.               neighbors[i].add(new Integer(j));
  105.               
  106.          for (j = seed_num; j < node_num; j++)
  107.           if ( (i != j) && CanHear(node[i].p.distance(node[j].p), node_r)) 
  108.               neighbors[i].add(new Integer(j));
  109.          
  110.      }
  111.     }
  112.     
  113.     public void Establish_NeighborList(int start, int end) {
  114.     
  115.      int i, j;
  116.     
  117.      for (i = 0; i < seed_num; i++) {
  118.          neighbors[i].clear();
  119.          for (j = 0; j < node_num; j++) {
  120.           if ( (i != j) && CanHear(node[i].p.distance(node[j].p), seed_r)) 
  121.               neighbors[i].add(new Integer(j));
  122.           boolean can_hear = CanHear(node[i].p.distance(node[j].p), seed_r);
  123.           if ( (i != j) && can_hear && !neighbors[j].contains(new Integer(i)))
  124.           neighbors[j].add(new Integer(i));
  125.           if ( (i != j) && !can_hear && neighbors[j].contains(new Integer(i)))
  126.           neighbors[j].remove(new Integer(i));
  127.          
  128.          }
  129.               
  130.          for (j = seed_num; j < node_num; j++) {
  131.           if ( (i != j) && CanHear(node[i].p.distance(node[j].p), node_r)) 
  132.               neighbors[i].add(new Integer(j));
  133.           boolean can_hear = CanHear(node[i].p.distance(node[j].p), node_r);
  134.           if ( (i != j) && can_hear && !neighbors[j].contains(new Integer(i)))
  135.           neighbors[j].add(new Integer(i));
  136.           if ( (i != j) && !can_hear && neighbors[j].contains(new Integer(i)))
  137.           neighbors[j].remove(new Integer(i));
  138.          }
  139.      }
  140.          
  141.     }
  142.     
  143.     /** Establish relations of nodes to seeds (direct or indirect seeds) */
  144.     public void Establish_Relation() {
  145.     
  146.      int i, j, id;
  147.     
  148.         /* 0: no relation; 1: within one hop, 2: within two hops */
  149.      for (i = seed_num; i < node_num; i++) 
  150.          for (j = 0; j < seed_num; j++) {
  151.           relation[i][j] = 0;
  152.              if (neighbors[i].contains(new Integer(j))) {
  153.                  relation[i][j] = 1;
  154.                  for (int k = 0; k < neighbors[i].size(); k++) {
  155.                   id = ((Integer)neighbors[i].get(k)).intValue();
  156.                   if ( (id >= seed_num) && (relation[id][j] == 0))
  157.                       relation[id][j] = 2;
  158.                  }
  159.              }
  160.          }
  161.     
  162.     }
  163.      
  164.      public void Establish_Relation(int start, int end) {
  165.     
  166.      int i, j, id;
  167.     
  168.         /* 0: no relation; 1: within one hop, 2: within two hops */
  169.      for (i = start; i < end; i++) 
  170.          for (j = 0; j < seed_num; j++) {
  171.           relation[i][j] = 0;
  172.              if (neighbors[i].contains(new Integer(j))) {
  173.                  relation[i][j] = 1;
  174.                  for (int k = 0; k < neighbors[i].size(); k++) {
  175.                   id = ((Integer)neighbors[i].get(k)).intValue();
  176.                   if ( (id >= seed_num) && !neighbors[id].contains(new Integer(j)))
  177.                       relation[id][j] = 2;
  178.                  }
  179.              }
  180.          }
  181.     
  182.     }
  183.    
  184.     /* Adapted from Tian's APIT simulation code */
  185.     /** Establish path length for amorphous computing */
  186.     void Establish_Path(boolean SMOOTH ) {
  187.         
  188.         int i, j, k, id;
  189.         LinkedList queue = new LinkedList();
  190.         
  191.         for (i = 0; i < node_num; i++)
  192.             for (j = 0; j < seed_num; j++) {
  193.                 if (i == j)
  194.                     path_length[i][j] = 0;
  195.                 else
  196.                  path_length[i][j] = -1;
  197.             }
  198.             
  199.         /* use breadth first search to find shortest path */
  200.         for (i = 0; i < seed_num; i++) {
  201.             queue.add(new Integer(i));
  202.             while (queue.size() > 0) {
  203.                 j = ((Integer)queue.getFirst()).intValue();
  204.                 queue.removeFirst();
  205.              for (k = 0; k < neighbors[j].size(); k++) {
  206.                  id = ((Integer)neighbors[j].get(k)).intValue();
  207.                     if (path_length[id][i] < 0) {
  208.                         path_length[id][i] = path_length[j][i] + 1;
  209.                         queue.addLast(new Integer(id));
  210.                     }
  211.                 }
  212.             }
  213.         }
  214.             
  215. if (SMOOTH) {
  216.     int num[] = new int[seed_num];
  217.         
  218.     for (i = 0; i < node_num; i++) {
  219.    
  220.      for (k = 0; k < seed_num; k++)
  221.             num[k] = 1;
  222.         
  223.         for (j = 0; j < neighbors[i].size(); j++) {
  224.             id = ((Integer)neighbors[i].get(j)).intValue();
  225.             for (k = 0; k < seed_num; k++) {
  226.              if (path_length[i][k] < 0)
  227.                  continue;
  228.                  if (path_length[j][k] >= 0) {
  229.                      path_length[i][k] += path_length[j][k];
  230.                      num[k]++;
  231.                  }
  232.              }
  233.          }
  234.          
  235.          for (k = 0; k < seed_num; k++)
  236.              path_length[i][k] = (float)(path_length[i][k] / num[k]) - (float)0.5;
  237.      }
  238.  }
  239.  
  240.  /* estimate real distance */
  241.  double dhop = node_r * KleinrockFomula();
  242.      
  243.  for (i = 0; i < node_num; i++)
  244.      for (j = 0; j < seed_num; j++)
  245.          if (path_length[i][j] > 0)
  246.              path_length[i][j] *= dhop;
  247.  
  248.          
  249.   
  250.     }
  251.  
  252.     
  253.     /* Adapted from Tian's APIT simulation code */
  254.     /** decide if two nodes are neighbors */
  255.     public boolean CanHear(double Distance,double RadioRange) {
  256. if ( Distance < (1 + doi * (2 * Math.random() - 1)) * RadioRange)
  257.     return true;
  258. else 
  259.     return false;
  260.     }
  261.  
  262.     
  263.     /* Adapted from Tian's APIT simulation code */
  264.     /** amorphous computing formular */
  265.     public double IntegralPart(double t, double AvgNumberOfNeighbors) {
  266.   
  267.    double PI = 3.14159265;
  268. return Math.exp( -(AvgNumberOfNeighbors / PI) * (Math.acos(t) - t * Math.sqrt(1 - t * t)));
  269.     }
  270.     
  271.     
  272.     /* Adapted from Tian's APIT simulation code */
  273.     /** amorphous computing formular */
  274.     public double KleinrockFomula(){
  275. double PI = 3.14159265;
  276. int STEP_NUMBER = 10000;
  277. int i;
  278. double AvgNumberOfNeighbors;
  279. double sum = 0;
  280. double lowerbound = -1.0;
  281. double upperbound = 1.0;
  282. double step = (upperbound- lowerbound)/STEP_NUMBER;
  283. AvgNumberOfNeighbors = PI * node_num * node_r * node_r / x_range / y_range;
  284. for( i = 0; i < STEP_NUMBER - 2 ; i = i + 2){
  285.   sum += ( IntegralPart(lowerbound + i * step, AvgNumberOfNeighbors) + 
  286.        4 * IntegralPart(lowerbound + (i + 1) * step, AvgNumberOfNeighbors) +
  287.    IntegralPart(lowerbound + (i + 2) * step, AvgNumberOfNeighbors)
  288.   ) * step / 3;
  289. }
  290. return 1 + Math.exp(-AvgNumberOfNeighbors) - sum;
  291.     }
  292.  
  293.  
  294.     /** statistics of estimate error */
  295.     public double statistics(int TYPE, int id, int step) {
  296.     
  297.      /* TYPE: 1-->MCL, 2-->Centroid, 3-->Amorphous Computing */
  298.     
  299.      double es_error = node[id].p.distance(node[id].this_time.es_p);
  300.         
  301.      return es_error;
  302.     }
  303.     
  304.    
  305.     /** log data to filename */
  306.     public static void logToFile(String filename, String data) 
  307.     throws FileNotFoundException, IOException {
  308.     
  309.      BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(filename, true));
  310.     
  311.      os.write(data.getBytes(), 0, data.length());
  312.      os.close();
  313.     
  314.     }
  315.     
  316.     
  317.     public static void main(String[] argv) {
  318. Network net;
  319. int start; /* start of simulated node */
  320. int end; /* end of simulated node */
  321. int stable_step = 50; /* stablized step */
  322. int step_num = 80; /* totoal number of steps */
  323. int iteration_num  = 10; /* number of iterations */
  324. int maxv; /* maximum node speed */
  325. double MCL_error, MIT_error, USC_error;
  326. double final_MCL, final_MIT, final_USC;
  327. Input in = new Input("Network.prop");
  328. for (maxv = 10;  maxv <= 50;  maxv += 10) {
  329.             final_MCL = 0;
  330.             final_MIT = 0;
  331.             final_USC = 0; 
  332.               
  333.             for (int iteration = 0; iteration < iteration_num; iteration++) {
  334.        System.out.println("maximum speed is " + maxv + ", in iteration " + iteration + "......");
  335.       
  336.          in.setParameter("max_v", Integer.toString(maxv));
  337.          net = new Network(in); 
  338.         
  339.          start = net.seed_num;
  340.          end = net.seed_num + 32;
  341.         
  342. for (int step = 0; step < step_num; step++) {
  343.          System.out.println("in iteration " + iteration + ", in Step " + step + "......");
  344.     
  345.          net.updateLocation();
  346.     
  347.          MCL_error = 0;
  348.          MIT_error = 0;
  349.          USC_error = 0;
  350.     
  351.          for (int i = start; i < end; i++) {
  352.                   
  353.           net.node[i].MCLocalization(net.relation[i], net.seed_pos, net.group_ref);
  354.           MCL_error += net.statistics(1, i, step) / (end - start);
  355.     
  356.           net.node[i].Centroid_Localization(net.neighbors[i], net.seed_pos);
  357.           USC_error += net.statistics(2, i, step) / (end - start);
  358.     
  359.           net.node[i].Multilateration(net.seed_pos, net.path_length[i]);
  360.           MIT_error += net.statistics(3, i, step) / (end - start);
  361.     
  362.          }
  363.     
  364.          for (int i = 0; i < Network.node_num; i++)
  365.           net.node[i].random_waypoint();
  366.     
  367.          System.out.println("In step " + step + ", in MCL algorithm, the average estimation error is: " + MCL_error);
  368.          System.out.println("In step " + step + ", in USC algorithm, the average estimation error is: " + USC_error);
  369.          System.out.println("In step " + step + ", in MIT algorithm, the average estimation error is: " + MIT_error);
  370.          System.out.println("");
  371.          System.out.println("");
  372.          System.out.println("");
  373.     
  374.          if (step >= stable_step) {
  375.           net.avg_MCL_error += MCL_error / (step_num - stable_step);
  376.           net.avg_USC_error += USC_error / (step_num - stable_step);
  377.           net.avg_MIT_error += MIT_error / (step_num - stable_step);
  378.          }
  379.     
  380.      }
  381.         System.out.println("In MCL algorithm, the average estimation error is: " + net.avg_MCL_error);
  382.         System.out.println("In USC algorithm, the average estimation error is: " + net.avg_USC_error);
  383.         System.out.println("In MIT algorithm, the average estimation error is: " + net.avg_MIT_error);
  384.         System.out.println("");
  385.      final_MCL += net.avg_MCL_error / iteration_num;
  386.      final_USC += net.avg_USC_error / iteration_num;
  387.      final_MIT += net.avg_MIT_error / iteration_num;
  388.             }
  389.             
  390.             System.out.println(" For maximum speed = " + maxv + ", in MCL algorithm is: " + final_MCL);
  391.             System.out.println(" For maximum speed = " + maxv + ", in USC algorithm is: " + final_USC);
  392.             System.out.println(" For maximum speed = " + maxv + ", in MIT algorithm is: " + final_MIT);
  393.             System.out.println("");
  394.        
  395.             
  396.             String MCL_data = Double.toString((double)maxv / Network.seed_r);            
  397.             String USC_data = Double.toString((double)maxv / Network.seed_r);
  398.             String MIT_data = Double.toString((double)maxv / Network.seed_r);
  399.             
  400.             MCL_data += "t";           
  401.             USC_data += "t";
  402.             MIT_data += "t";
  403.             
  404.             MCL_data += Double.toString(final_MCL / Network.seed_r);
  405.             USC_data += Double.toString(final_USC / Network.seed_r);
  406.             MIT_data += Double.toString(final_MIT / Network.seed_r);
  407.             
  408.             MCL_data += "rn";
  409.             USC_data += "rn";
  410.             MIT_data += "rn";
  411.             
  412.             try {
  413.     
  414.      Network.logToFile("MCL_max_speed_error", MCL_data);
  415.         Network.logToFile("USC_max_speed_error", USC_data);
  416.         Network.logToFile("MIT_max_speed_error", MIT_data);
  417.        
  418.          } catch (Exception e) {System.err.print(e);}
  419.        
  420.        }
  421.     }
  422.   
  423. }
  424.