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

3G开发

开发平台:

Java

  1. import java.util.*;
  2. import java.io.*;
  3. import java.net.*;
  4. import java.lang.*;
  5. import java.awt.Point;
  6. import Jama.*; 
  7. public class Node  { 
  8.     int id; /* id of node */
  9.     Point p; /* coordinate of node */
  10.     int r; /* radio range of node */
  11.     boolean is_seed; /* if node is seed or not */
  12.     Point dst; /* the destination in random waypoint model */
  13.     double dst_length; /* the length of next destination */
  14.     double dst_direction; /* the direciton of next destination */
  15.     Location_info this_time; /* the location info of this time */
  16.     Location_info last_time; /* the location info of last time */
  17.     
  18.     
  19.    public Node(int i, int nr, boolean seed) {
  20.      int x, y;
  21.     
  22.      x = (int)Math.round(Network.x_range * Math.random());
  23.      y = (int)Math.round(Network.y_range * Math.random());
  24.      p = new Point(x, y);    
  25.      dst = null;
  26.      dst_length = -1;
  27.     id = i;
  28.      r = nr;
  29.      is_seed = seed;
  30.      this_time = null;
  31.      last_time = null;
  32.     
  33.     }
  34.    
  35.     /* Adapted from Tian's APIT simulation code */
  36.     /** Centroid localization */
  37.     public void Centroid_Localization (Vector neighbors, Point[] position) {
  38.     
  39.      int i, j, seed_id;
  40.      int es_x, es_y, es_num;
  41.     
  42.      es_x = 0;
  43.      es_y = 0;
  44.      es_num = 0;
  45.      for (i = 0; i < neighbors.size(); i++) {
  46.          seed_id = ((Integer)neighbors.get(i)).intValue();
  47.          if ( seed_id < Network.seed_num ) {
  48.           es_x += position[seed_id].x;
  49.           es_y += position[seed_id].y;
  50.           es_num++;
  51.          }
  52.      }
  53.          
  54.      if (es_num > 0)
  55.          this_time.es_p.setLocation(es_x / es_num, es_y / es_num);
  56.      else
  57.          this_time.es_p.setLocation(Network.x_range / 2, Network.y_range / 2); 
  58.     
  59.     }
  60.     
  61.     /* Adapted from Tian's APIT simulation code */
  62.     /** Amporphous Computing localization */
  63.     public void Multilateration(Point [] position, double [] path_length)
  64.     {
  65.   int i, j;
  66.   int numAnchors;
  67.   int Anchors[] = new int[Network.seed_num];
  68.   double [][] array_x, array_y;
  69.   Matrix X = new Matrix(1, 1);
  70.   Matrix Y = new Matrix(1, 1);
  71.  
  72.  
  73.   numAnchors = 0;
  74.   for (j = 0; j < Network.seed_num; j++) 
  75.       if (path_length[j] > 0) {
  76.   Anchors[numAnchors] = j;
  77.   numAnchors++;
  78.       }
  79.        
  80.   if (numAnchors < 3) {
  81.       this_time.es_p.setLocation(Network.x_range / 2, Network.y_range / 2);
  82.       return;
  83.   }
  84.       
  85.  
  86.   array_x = new double[numAnchors - 1][2];
  87.   array_y = new double[numAnchors - 1][1];
  88.        
  89.   for (j = 0; j < numAnchors - 1; j++) {
  90.       array_x[j][0] = 2 * (position[Anchors[numAnchors - 1]].x - position[Anchors[j]].x);
  91.       array_x[j][1] = 2 * (position[Anchors[numAnchors - 1]].y - position[Anchors[j]].y);
  92.       X = new Matrix(array_x);
  93.       
  94.       array_y[j][0] = path_length[Anchors[j]] * path_length[Anchors[j]] 
  95.                  - path_length[Anchors[numAnchors - 1]] * path_length[Anchors[numAnchors - 1]]
  96.                  + position[Anchors[numAnchors - 1]].x * position[Anchors[numAnchors - 1]].x
  97.                  + position[Anchors[numAnchors - 1]].y * position[Anchors[numAnchors - 1]].y
  98.                  - position[Anchors[j]].x * position[Anchors[j]].x 
  99.                  - position[Anchors[j]].y * position[Anchors[j]].y;
  100.                      
  101.       Y = new Matrix(array_y);
  102.   }
  103.       
  104.   Matrix TempM1 = X.transpose();
  105.   Matrix TempM2 = TempM1.times(X);
  106.   Matrix TempM3 = TempM2.inverse();
  107.   Matrix TempM4 = TempM3.times(TempM1);
  108.   Matrix retMatrix = TempM4.times(Y);
  109.  
  110. this_time.es_p.setLocation(retMatrix.get(0, 0), retMatrix.get(1, 0));
  111.     
  112.     }
  113.     
  114.     
  115.     /** MCL localizaiton */
  116.     public void MCLocalization (int []relation, Point []position, Point ref) {
  117.     
  118.      int i, j, x, y, l, n;
  119.      Point pt;
  120.      String s, k;  
  121.     
  122.      if (this_time != null )
  123.          last_time = this_time;
  124.              
  125.      this_time = new Location_info();
  126.     
  127.      /* update one hop and two hop list */
  128.      for (i = 0; i < relation.length; i++) {
  129.          
  130.          if (relation[i] == 1) { /* one hop list */
  131.      this_time.one_hop_list.put(Integer.toString(i), pointToString(position[i]));
  132.          }
  133.          else if (relation[i] == 2) { /* two hop list */
  134.           this_time.two_hop_list.put(Integer.toString(i), pointToString(position[i]));
  135.          }
  136.          
  137.      }
  138.     
  139.      /* update sample points */
  140.      if ( (last_time == null) || (last_time.sample_num == 0)) { /* not initialized yet */
  141.          
  142.          System.out.println("node " + id + " has no sample points");
  143.          
  144.          if (!this_time.one_hop_list.isEmpty()) {
  145.           Enumeration e = this_time.one_hop_list.elements();
  146.           k = (String)e.nextElement();
  147.           pt = stringToPoint(k);
  148.          
  149.           /* try absolute samples */
  150.           for (i = 0; i < 10000; i++) {
  151.               pt = getSample(pt, Network.seed_r);
  152.               if (meetCondition(pt) >= 1) {
  153.                 this_time.sample_points[this_time.sample_num] = pt;
  154.                 this_time.sample_weight[this_time.sample_num] = 1;
  155.                this_time.sample_num++;
  156.               }
  157.               if (this_time.sample_num == this_time.max_sample_num)
  158.                break;
  159.           }
  160.          
  161.           /* if no enough absolute samples, try relaxed samples */
  162.           if ( (i == 10000) && (this_time.sample_num < this_time.max_sample_num)) {
  163.               for (i = 0; i < 10000; i++) {
  164.                pt = getSample(pt, Network.seed_r);
  165.                if (meetCondition(pt) >= 0) {
  166.                     this_time.sample_points[this_time.sample_num] = pt;
  167.                     this_time.sample_weight[this_time.sample_num] = 1;
  168.                    this_time.sample_num++;
  169.                }
  170.                if (this_time.sample_num == this_time.max_sample_num)
  171.                    break;
  172.               }
  173.           }
  174.          }
  175.          
  176.      }
  177.      else { /* already initialized */
  178.          Point[] temp = new Point[200 * this_time.max_sample_num];
  179.          int[] weight = new int[200 * this_time.max_sample_num];
  180.             int temp_num = 0;
  181.          
  182.          /* try absolute samples */
  183.          for (i = 0; i < 200; i++) {
  184.              for (j = 0; j < last_time.sample_num; j++) {
  185.               pt = last_time.sample_points[j];  
  186.               pt = getSample(pt, Network.max_v);
  187.               int cond = meetCondition(pt);
  188.               if (cond >= 1) {
  189.                   temp[temp_num] = pt;
  190.                   weight[temp_num] = 1;
  191.                   temp_num++;
  192.               }
  193.           }
  194.           if (temp_num >= this_time.max_sample_num)
  195.               break;
  196.          }
  197.          
  198.          /* no enough absolute sample, then try relaxed samples */
  199.          if (temp_num < this_time.max_sample_num) {
  200.           System.out.println("node " + id + ", not enough absolute sample");
  201.           for (i = 0; i < 200; i++) {
  202.               for (j = 0; j < last_time.sample_num; j++) {
  203.                   pt = last_time.sample_points[j];
  204.                   pt = getSample(pt, Network.max_v);
  205.                   int cond = meetCondition(pt);
  206.                   if (cond >= 0) {
  207.                       temp[temp_num] = pt;
  208.                       weight[temp_num] = 1;
  209.                       temp_num++;
  210.                }
  211.               }
  212.               if (temp_num >= this_time.max_sample_num)
  213.                   break;
  214.           }
  215.          
  216.          }
  217.          
  218.          if (temp_num < this_time.max_sample_num) {
  219.           System.out.println ("node " + id + ", not enough samples");
  220.           for (i = 0;i < temp_num; i++) {
  221.               this_time.sample_points[i]= temp[i];
  222.               this_time.sample_weight[i] = weight[i];
  223.           }
  224.           this_time.sample_num = temp_num;
  225.          }
  226.          else {
  227.           for (i = 0; i < this_time.max_sample_num; i++) {
  228.               int index = (int)(temp_num * Math.random());
  229.               this_time.sample_points[i] = temp[index];
  230.               this_time.sample_weight[i] = weight[index];
  231.               temp[index] = temp[temp_num - 1];
  232.               temp_num--;
  233.           }
  234.           this_time.sample_num = this_time.max_sample_num;
  235.          }
  236.       
  237.      }
  238.     
  239.      /* estimate location */
  240.         int es_x = 0;
  241.         int es_y = 0;
  242.         int es_num = 0;
  243.            
  244.      for (i = 0; i < this_time.sample_num; i++) {    
  245.          es_x += this_time.sample_points[i].x * this_time.sample_weight[i];
  246.          es_y += this_time.sample_points[i].y * this_time.sample_weight[i];
  247.          es_num += this_time.sample_weight[i];
  248.      }
  249.         
  250.      if (this_time.sample_num == 0)
  251.          this_time.es_p.setLocation(ref.x + Network.x_range / 2, ref.y + Network.y_range / 2);
  252.      else
  253.          this_time.es_p.setLocation(es_x / es_num, es_y / es_num);
  254.     
  255.      this_time.sample_range = 0;    
  256.      for (i = 0; i < this_time.sample_num; i++) 
  257.          if (this_time.es_p.distance(this_time.sample_points[i]) > this_time.sample_range)
  258.              this_time.sample_range = (float)this_time.es_p.distance(this_time.sample_points[i]);
  259.     
  260.     }
  261.     
  262.     
  263.     /** Print location information */
  264.     public void print() {
  265.     
  266.      /* print one hop list */
  267.      System.out.println("one hop list.........................................");
  268.     
  269.      Enumeration e = this_time.one_hop_list.keys() ;
  270.     
  271.      while (e.hasMoreElements()) {
  272.          int k = Integer.parseInt((String)(e.nextElement()));
  273.             String s = (String)(this_time.one_hop_list.get(Integer.toString(k)));
  274.             Point p = stringToPoint(s);
  275.             System.out.println("node: " + id + " key: " + k + " value: " + p.toString() );
  276.         }
  277.         
  278.         /* print two hop list */
  279.         System.out.println("two hop list...........................................");
  280.         
  281.         e = this_time.two_hop_list.keys() ;
  282.          
  283.      while (e.hasMoreElements()) {
  284.          int k = Integer.parseInt((String)(e.nextElement()));
  285.             String s = (String)(this_time.two_hop_list.get(Integer.toString(k)));
  286.             Point p = stringToPoint(s);
  287.             System.out.println("node: " + id + " key: " + k + " value: " + p.toString() );
  288.         }
  289.         
  290.     }
  291.     
  292.     
  293.     /** Convert string to point */
  294.     public Point stringToPoint(String s) {
  295.      String temp[] = s.split(",");
  296.      int x = Integer.parseInt(temp[0]);
  297. int y = Integer.parseInt(temp[1]);
  298. Point p = new Point(x,y);
  299. return p;
  300.     }
  301.     
  302.     
  303.     /** Convert point to string */
  304.     public String pointToString(Point p) {
  305.      String s = "";
  306.      s += p.x;
  307.      s += ",";
  308.      s += p.y;
  309.      return s;
  310.     }
  311.     
  312.     
  313.     /** Test if a point satisfies the filtering condition */
  314.     /* 1: absolutely meet, 0: meet after relaxing by "fdelta", -1: Not meet */ 
  315.     public int meetCondition(Point p) {
  316.     
  317.      Enumeration e1 = this_time.one_hop_list.keys();
  318.      Enumeration e2 = this_time.two_hop_list.keys();
  319.     
  320.      String k, s;
  321.      Point pt;
  322.      int retval = 1;
  323.     
  324.      while (e1.hasMoreElements()) {
  325.          k = (String)e1.nextElement();
  326.          s = (String)this_time.one_hop_list.get(k);
  327.          pt = stringToPoint(s);
  328.          if (pt.distance(p) >= Network.seed_r + Network.delta)  
  329.              return (-1);
  330.          else if (pt.distance(p) >= Network.seed_r) {
  331.           retval = 0;
  332.          }
  333.      }
  334.     
  335.      while (e2.hasMoreElements()) {
  336.          k = (String)e2.nextElement();
  337.          s = (String)this_time.two_hop_list.get(k);
  338.          pt = stringToPoint(s);
  339.          if ( (pt.distance(p) < Network.seed_r - Network.delta) || (pt.distance(p) >= Network.seed_r + r + Network.delta))  
  340.              return (-1);
  341.          else if ( (pt.distance(p) < Network.seed_r) || (pt.distance(p) >= Network.seed_r + r)) {
  342.              retval = 0; 
  343.          }
  344.          
  345.      }
  346.       
  347.      return retval;
  348.     } 
  349.     
  350.     
  351.     /** get samples from a circle centered at p with radius */
  352.     public Point getSample(Point p, int radius) {
  353.      Point sample_p;
  354.      int x, y;
  355.     
  356.      for (; ;) {
  357.          x = p.x -  radius + (int)Math.round(2 * radius * Math.random());
  358.          y = p.y -  radius + (int)Math.round(2 * radius * Math.random());
  359.         
  360.          sample_p = new Point(x, y);
  361.          if (sample_p.distance(p) < radius) 
  362.           return sample_p;
  363.      }
  364.     }
  365.     
  366.     /** random waypoint mobility model */
  367.     public void random_waypoint() {
  368.         int x, y;
  369.         float v, d, dx, dy;
  370.         
  371.         if (dst == null) {
  372.          x = (int)Math.round(Network.x_range * Math.random());
  373.          y = (int)Math.round(Network.y_range * Math.random());
  374.          dst = new Point(x, y);    
  375.         }
  376.         
  377.         d = (float)p.distance(dst);
  378.         dx = dst.x - p.x;
  379.      dy = dst.y - p.y;
  380.         v = Network.max_v * (float)Math.random();
  381.         if (v < d) {
  382.             x = p.x + (int)Math.round(v * dx / d);
  383.             y = p.y + (int)Math.round(v * dy / d);
  384.             p.setLocation(x, y);
  385.         }
  386.         else {
  387.             p.setLocation(dst);
  388.             dst = null;
  389.         }
  390.      
  391.     }
  392.     
  393.     
  394.     /** group waypoint mobility model */
  395.     public void group_waypoint(double v, double a, Point ref) {
  396.         int x, y, group_x, group_y;
  397.         double way_v;
  398.         
  399.         if (dst_length < 0) {
  400.          x = (int)Math.round(Network.x_range * Math.random());
  401.          y = (int)Math.round(Network.y_range * Math.random());
  402.          dst = new Point(ref.x + x, ref.y + y);    
  403.          dst_length = p.distance(dst);
  404.          dst_direction = Math.acos((dst.x- p.x) / dst_length);
  405.          if (dst.y < p.y)
  406.           dst_direction = 2 * Math.PI - dst_direction;
  407.         }
  408.         
  409.         group_x = (int)Math.round(v * Math.cos(a));
  410.         group_y = (int)Math.round(v * Math.sin(a));
  411.         
  412.         way_v = (Network.max_v - Network.group_v) * Math.random();
  413.         
  414.         if (dst_length <= way_v) {
  415.             way_v = dst_length;
  416.             dst_length = -1;
  417.         }
  418.         else 
  419.             dst_length -= way_v;
  420.             
  421.         
  422.         x = p.x + (int)Math.round(way_v * Math.cos(dst_direction)) + group_x;
  423.         y = p.y + (int)Math.round(way_v * Math.sin(dst_direction)) + group_y;
  424.         
  425.         p.setLocation(x, y);
  426.     }
  427.     
  428.   
  429.       
  430.     
  431.     public void logToFile() 
  432.     throws FileNotFoundException, IOException {
  433.     
  434.     }
  435. }
  436.         
  437.