math.tex
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:18k
源码类别:

通讯编程

开发平台:

Visual C++

  1. %
  2. % personal commentary:
  3. %        DRAFT DRAFT DRAFT
  4. %        - KFALL
  5. % RNG section reviewed and revised 11-Sep-98, johnh.
  6. %
  7. % RNG section revised 28-Aug-02 by Tim Buchheim to include material
  8. % from Michelle Weigle which describes the new implementation of RNG
  9. chapter{Mathematical Support}
  10. label{chap:math}
  11. The simulator includes a small collection of mathematical
  12. functions used to implement random variate generation and integration.
  13. This area of the simulator is currently undergoing some
  14. changes.
  15. The procedures and functions described in this chapter can be found in
  16. nsf{tools/rng.{cc, h}},
  17. nsf{tools/random.{cc, h}},
  18. nsf{tools/ranvar.{cc, h}},
  19. nsf{tools/pareto.{cc, h}},
  20. nsf{tools/expoo.{cc, h}},
  21. nsf{tools/integrator.{cc, h}}, and
  22. nsf{tcl/lib/ns-random.tcl}.
  23. section{Random Number Generation}
  24. label{sec:random}
  25. The RNG class contains an implementation of the combined multiple
  26. recursive generator MRG32k3a proposed by L'Ecuyer
  27. cite{lecuyer99}. The C++ code was adapted from cite{lecuyer01}.
  28. This replaces the previous implementation of code{RNG}, which used
  29. the minimal standard multiplicative linear congruential generator of
  30. Park and Miller~cite{Park88:Random}.  The newer (MRG32k3a) code{RNG} is
  31. used in ns versions 2.1b9 and later.
  32. The MRG32k3a generator provides $1.8$x$10^{19}$ independent
  33. streams of random numbers, each of which consists of
  34. $2.3$x$10^{15}$ substreams. Each substream has a period
  35. (emph{i.e.}, the number of random numbers before overlap) of
  36. $7.6$x$10^{22}$. The period of the entire generator is
  37. $3.1$x$10^{57}$. Figure ref{streams} provides a graphical idea of
  38. how the streams and substreams fit together.
  39. begin{figure}[ht]
  40. centering
  41. includegraphics[angle=270,width=6 in]{rng-streams.eps}
  42. caption{Overall arrangement of streams and substreams.
  43. cite{lecuyer01}} label{streams}
  44. end{figure}
  45. A default RNG ({tt defaultRNG}), created at simulator initialization
  46. time, is provided. If multiple random variables are used in a
  47. simulation, each random variable should use a separate RNG object.
  48. When a new RNG object is created, it is automatically seeded to
  49. the beginning of the next independent stream of random numbers.
  50. Used in this manner, the implementation allows for a maximum of
  51. $1.8$x$10^{19}$ random variables.
  52. Often, multiple independent replications of a simulation are
  53. needed (emph{i.e.}, to perform statistical analysis given
  54. multiple runs with fixed parameters).  For each replication, a
  55. different substream should be used to ensure that the random
  56. number streams are independent. (This process is given as an OTcl
  57. example later.) This implementation allows for a maximum of
  58. $2.3$x$10^{15}$ independent replications. Each random variable in
  59. a single replication can produce up to $7.6$x$10^{22}$ random
  60. numbers before overlapping.
  61. {bf Note:} Only the most common functions are described here. For
  62. more information, see cite{lecuyer01} and the source code found
  63. in {tt tools/rng.h} and {tt tools/rng.cc}.  For a comparison of this RNG to
  64. the more common LCG16807 RNG (and why LCG16807 is not a good RNG), 
  65. see cite{lecuyer-wsc}.
  66. subsection{Seeding The RNG}
  67. Due to the nature of the RNG and its implementation, it is not
  68. necessary to set a seed (the default is 12345).  If you wish to
  69. change the seed, functions are available. You should only set the
  70. seed of the default RNG.  Any other RNGs you create are
  71. automatically seeded such that they produce independent streams.
  72. The range of valid seeds is 1 to {tt MAXINT}.
  73. To get non-deterministic behavior, set the seed of the default RNG
  74. to 0.  This will set the seed based on the current time of day and
  75. a counter.  {bf This method should not be used to set seeds for
  76. independent replications.}  There is no guarantee that the streams
  77. produced by two random seeds will not overlap.  The only way to
  78. guarantee that two streams do not overlap is to use the substream
  79. capability provided by the RNG implementation.
  80. subsubsection{Example}
  81. begin{verbatim}
  82.  # Usage: ns rng-test.tcl [replication number]
  83.  if {$argc > 1} {
  84.     puts "Usage: ns rng-test.tcl [replication number]"
  85.     exit
  86.  }
  87.  set run 1
  88.  if {$argc == 1} {
  89.     set run [lindex $argv 0]
  90.  }
  91.  if {$run < 1} {
  92.     set run 1
  93.  }
  94.  # seed the default RNG
  95.  global defaultRNG
  96.  $defaultRNG seed 9999
  97.  # create the RNGs and set them to the correct substream
  98.  set arrivalRNG [new RNG]
  99.  set sizeRNG [new RNG]
  100.  for {set j 1} {$j < $run} {incr j} {
  101.     $arrivalRNG next-substream
  102.     $sizeRNG next-substream
  103.  }
  104.  # arrival_ is a exponential random variable describing the time
  105.  # between consecutive packet arrivals
  106.  set arrival_ [new RandomVariable/Exponential]
  107.  $arrival_ set avg_ 5
  108.  $arrival_ use-rng $arrivalRNG
  109.  # size_ is a uniform random variable describing packet sizes
  110.  set size_ [new RandomVariable/Uniform]
  111.  $size_ set min_ 100
  112.  $size_ set max_ 5000
  113.  $size_ use-rng $sizeRNG
  114.  # print the first 5 arrival times and sizes
  115.  for {set j 0} {$j < 5} {incr j} {
  116.     puts [format "%-8.3f  %-4d" [$arrival_ value] 
  117.             [expr round([$size_ value])]]
  118.  }
  119. end{verbatim}
  120. subsubsection{Output}
  121. begin{verbatim}
  122.  % ns rng-test.tcl 1
  123.  6.358     4783
  124.  5.828     1732
  125.  1.469     2188
  126.  0.732     3076
  127.  4.002     626
  128.  % ns rng-test.tcl 5
  129.  0.691     1187
  130.  0.204     4924
  131.  8.849     857
  132.  2.111     4505
  133.  3.200     1143
  134. end{verbatim}
  135. subsection{OTcl Support}
  136. subsubsection{Commands}
  137. The following commands on the RNG class can be accessed from OTcl
  138. and are found in {tt tools/rng.cc}:
  139. begin{description}
  140.     item[{tt seed $n$}] -- seed the RNG to $n$, if $n == 0$, the seed
  141.     is set according to the current time and a counter
  142.     item[{tt next-random}] -- return the next random number
  143.     item[{tt seed}] -- return the current value of the seed
  144.     item[{tt next-substream}] -- advance to the next substream
  145.     item[{tt reset-start-substream}] -- reset the stream to the beginning
  146.     of the current substream
  147.     item[{tt normal $avg$ $std$}] -- return a number sampled from a normal
  148.     distribution with the given average and standard deviation
  149.     item[{tt lognormal $avg$ $std$}] -- return a number sampled from a
  150.       lognormal distribution with the given average and standard deviation
  151. end{description}
  152. The following commands on the RNG class can be accessed from OTcl
  153. and are found in {tt tcl/lib/ns-random.tcl}:
  154. begin{description}
  155.     item[{tt exponential $mu$}] -- return a number sampled from an
  156.       exponential distribution with mean $mu$ 
  157.     item[{tt uniform $min$ $max$}] -- return an integer sampled from a
  158.     uniform distribution on [$min$, $max$]
  159.     item[{tt integer $k$}] -- return an integer sampled from a uniform
  160.     distribution on [0, $k$-1]
  161. end{description}
  162. subsubsection{Example}
  163. begin{verbatim}
  164.  # Usage: ns rng-test2.tcl [replication number]
  165.  if {$argc > 1} {
  166.     puts "Usage: ns rng-test2.tcl [replication number]"
  167.     exit
  168.  }
  169.  set run 1
  170.  if {$argc == 1} {
  171.     set run [lindex $argv 0]
  172.  }
  173.  if {$run < 1} {
  174.     set run 1
  175.  }
  176.  # the default RNG is seeded with 12345
  177.  # create the RNGs and set them to the correct substream
  178.  set arrivalRNG [new RNG]
  179.  set sizeRNG [new RNG]
  180.  for {set j 1} {$j < $run} {incr j} {
  181.     $arrivalRNG next-substream
  182.     $sizeRNG next-substream
  183.  }
  184.  # print the first 5 arrival times and sizes
  185.  for {set j 0} {$j < 5} {incr j} {
  186.     puts [format "%-8.3f  %-4d" [$arrivalRNG lognormal 5 0.1] 
  187.             [expr round([$sizeRNG normal 5000 100])]]
  188.  }
  189. end{verbatim}
  190. subsubsection{Output}
  191. begin{verbatim}
  192.  % ns rng-test2.tcl 1
  193.  142.776   5038
  194.  174.365   5024
  195.  147.160   4984
  196.  169.693   4981
  197.  187.972   4982
  198.  % ns rng-test2.tcl 5
  199.  160.993   4907
  200.  119.895   4956
  201.  149.468   5131
  202.  137.678   4985
  203.  158.936   4871
  204. end{verbatim}
  205. subsection{C++ Support}
  206. subsubsection{Member Functions}
  207. The random number generator is implemented by the RNG class and is
  208. defined in {tt tools/rng.h}.
  209. {bf Note:} The Random class in {tt tools/random.h} is an older
  210. interface to the standard random number stream.
  211. Member functions provide the following operations:
  212. begin{description}
  213.     item[{tt void set_seed (long seed)}] -- set the seed of the RNG, if
  214.     $seed == 0$, the seed is set according to the current time and a
  215.     counter
  216.     item[{tt long seed (void)}] -- return the current seed
  217.     item[{tt long next (void)}] -- return the next random number as an
  218.     integer on [0, {tt MAXINT}]
  219.     item[{tt double next_double (void)}] -- return the next random number
  220.     on [0, 1]
  221.     item[{tt void reset_start_substream (void)}] -- reset the stream
  222.     to the beginning of the current substream
  223.     item[{tt void reset_next_substream (void)}] -- advance to the next
  224.     substream
  225.     item[{tt int uniform (int k)}] -- return an integer sampled from a
  226.       uniform distribution on [0, k-1]
  227.     item[{tt double uniform (double r)}] -- return a number sampled from a
  228.       uniform distribution on [0, r]
  229.     item[{tt double uniform (double a, double b)}] -- return a number
  230.       sampled from a uniform distribution on [a, b]
  231.     item[{tt double exponential (void)}] -- return a number sampled from an
  232.     exponential distribution with mean 1.0
  233.     item[{tt double exponential (double k)}] -- return a number sampled from
  234.       an exponential distribution with mean k 
  235.     item[{tt double normal (double avg, double std)}] -- return a number
  236.       sampled from a normal distribution with the given average and standard 
  237.     deviation
  238.     item[{tt double lognormal (double avg, double std)}] -- return a number
  239.       sampled from a lognormal distribution with the given average and
  240.       standard deviation
  241. end{description}
  242. subsubsection{Example}
  243. begin{verbatim}
  244.  /* create new RNGs */
  245.  RNG arrival (23456);
  246.  RNG size;
  247.  /* set the RNGs to the appropriate substream */
  248.  for (int i = 1; i < 3; i++) {
  249.    arrival.reset_next_substream();
  250.    size.reset_next_substream();
  251.  }
  252.  /* print the first 5 arrival times and sizes */
  253.  for (int j = 0; j < 5; j++) {
  254.    printf ("%-8.3f  %-4dn", arrival.lognormal(5, 0.1),
  255.              int(size.normal(500, 10)));
  256.  }
  257. end{verbatim}
  258. subsubsection{Output}
  259. begin{verbatim}
  260.  161.826   506
  261.  160.591   503
  262.  157.145   509
  263.  137.715   507
  264.  118.573   496
  265. end{verbatim}
  266. section{Random Variables}
  267. label{sec:ranvar}
  268. The clsref{RandomVariable}{../ns-2/ranvar.h}
  269. provides a thin layer of functionality on top
  270. of the base random number generator and the default random number stream.
  271. It is defined in nsf{ranvar.h}:
  272. begin{program}
  273.   class RandomVariable : public TclObject {
  274.   public:
  275.         virtual double value() = 0;
  276.         int command(int argc, const char*const* argv);
  277.         RandomVariable();
  278.   protected:
  279.         RNG* rng_;
  280.   };
  281. end{program}
  282. Classes derived from this abstract class implement specific
  283. distributions.  Each distribution is parameterized with the values of
  284. appropriate parameters.  The value method is used to return a value
  285. from the distribution.  
  286. The currently defined distributions, and their associated parameters are:
  287. begin{tabular}{rl}
  288. clsref{UniformRandomVariable}{tools/ranvar.h} & code{min_}, code{max_} \
  289. clsref{ExponentialRandomVariable}{tools/ranvar.h} & code{avg_} \
  290. clsref{ParetoRandomVariable}{tools/ranvar.h} & code{avg_}, code{shape_}\
  291. clsref{ParetoIIRandomVariable}{tools/ranvar.h} & code{avg_}, code{shape_}\
  292. clsref{ConstantRandomVariable}{tools/ranvar.h} & code{val_}\
  293. clsref{HyperExponentialRandomVariable}{tools/ranvar.h} & code{avg_}, code{cov_}\
  294. clsref{NormalRandomVariable}{tools/ranvar.h} & code{avg_}, code{std_}\
  295. clsref{LogNormalRandomVariable}{tools/ranvar.h} & code{avg_}, code{std_}\
  296. end{tabular}
  297. The RandomVariable class is available in OTcl.  For instance, to
  298. create a random variable that generates number uniformly on [10, 20]:
  299. begin{program}
  300.         set u [new RandomVariable/Uniform]
  301.         $u set min_ 10
  302.         $u set max_ 20
  303.         $u value
  304. end{program}
  305. By default, RandomVariable objects use the default random number
  306. generator described in the previous section.  The use-rng method can
  307. be used to associate a RandomVariable with a non-default RNG:
  308. begin{program}
  309.         set rng [new RNG]
  310.         $rng seed 0
  311.         set e [new RandomVariable/Exponential]
  312.         $e use-rng $rng
  313. end{program}
  314. section{Integrals}
  315. label{sec:integral}
  316. The  clsref{Integrator}{../ns-2/integrator.h}
  317. supports the approximation of (continuous) integration by (discrete)
  318. sums; it is defined in nsf{integrator.h} as
  319. begin{program}
  320. {rm From integrator.h:}
  321.         class Integrator : public TclObject {
  322.         public:
  323.                 Integrator();
  324.                 void set(double x, double y);
  325.                 void newPoint(double x, double y);
  326.                 int command(int argc, const char*const* argv);
  327.         protected:
  328.                 double lastx_;
  329.                 double lasty_;
  330.                 double sum_;
  331.         };
  332. {rm From integrator.cc:}
  333.         Integrator::Integrator() : lastx_(0.), lasty_(0.), sum_(0.)
  334.         {
  335.                 bind("lastx_", &lastx_);
  336.                 bind("lasty_", &lasty_);
  337.                 bind("sum_", &sum_);
  338.         }
  339.         void Integrator::set(double x, double y)
  340.         {
  341.                 lastx_ = x;
  342.                 lasty_ = y;
  343.                 sum_ = 0.;
  344.         }
  345.         void Integrator::newPoint(double x, double y)
  346.         {
  347.                 sum_ += (x - lastx_) * lasty_;
  348.                 lastx_ = x;
  349.                 lasty_ = y;
  350.         }
  351.         int Integrator::command(int argc, const char*const* argv)
  352.         {
  353.                 if (argc == 4) {
  354.                         if (strcmp(argv[1], "newpoint") == 0) {
  355.                                 double x = atof(argv[2]);
  356.                                 double y = atof(argv[3]);
  357.                                 newPoint(x, y);
  358.                                 return (TCL_OK);
  359.                         }
  360.                 }
  361.                 return (TclObject::command(argc, argv));
  362.         }
  363. end{program}
  364. This class provides a base class used by other classes such
  365. as code{QueueMonitor} that keep running sums.
  366. Each new element of the running sum is added by
  367. the fcn[x, y]{newPoint} function.
  368. After the $k$th execution of code{newPoint}, the running sum
  369. is equal to $sum_{i=1}^{k}y_{i-1}(x_i - x_{i-1})$ where
  370. $x_0 = y_0 = 0$ unless code{lastx_}, code{lasty_}, or code{sum_}
  371. are reset via OTcl.
  372. Note that a new point in the sum can be added either by the
  373. C++ member code{newPoint} or the OTcl member code{newpoint}.
  374. The use of integrals to compute certain types of averages
  375. (e.g. mean queue lengths) is given in (pp. 429--430, cite{Jain91:Art}).
  376. section{code{ns-random}}
  377. {bf code{ns-random} is an obsolete way to generate random numbers. 
  378. This information is provided only for backward compatibility.}
  379. code{ns-random} is implemented in nsf{misc.{cc,h}}. 
  380. When called with no argument, it generates a random number with
  381. uniform distribution between 0 and code{MAXINT}.
  382. When an integer argument is provided, it seeds the random generater
  383. with the given number.
  384. A special case is when code{ns-random 0} is called, it randomly seeds
  385. the generator based on current time.
  386. This feature is useful to produce non-deterministic results across
  387. runs.
  388. section{Some mathematical-support related objects}
  389. label{sec:mathobjects}
  390. textsc{Integrator objects}
  391. Integrator Objects support the approximate computation of continuous
  392. integrals using discrete sums. The running sum(integral) is computed as:
  393. code{sum_ += [lasty_ * (x lastx_)]} where (x, y) is the last element
  394. entered and
  395. (lastx_, lasty_) was the element previous to that added to the sum.
  396. lastx_ and lasty_ are updated as new elements are added. The first
  397. sample point defaults to (0,0) that can be changed by changing the values
  398. of (lastx_,lasty_). 
  399. code{$integrator newpoint <x> <y>}\ %$
  400. Add the point (x,y) to the sum. Note that it does not make sense for x to
  401. be less than lastx_. 
  402. There are no configuration parameters specific to this object. \
  403. State Variables are:
  404. begin{description}
  405. item[lastx_]
  406. x-coordinate of the last sample point. 
  407. item[lasty_]
  408. y-coordinate of the last sample point. 
  409. item[sum_] Running sum (i.e. the integral) of the sample points. 
  410. end{description}
  411. textsc{Samples Object}
  412. Samples Objects support the computation of mean and variance statistics
  413. for a given sample. 
  414. code{$samples mean}\
  415. Returns mean of the sample. 
  416. code{$samples variance}\
  417. Returns variance of the sample. 
  418. code{$samples cnt}\
  419. Returns a count of the sample points considered. 
  420. code{$samples reset }\
  421. Reset the Samples object to monitor a fresh set of samples. 
  422. There are no configuration parameters or state variables specific to this
  423. object. 
  424. section{Commands at a glance}
  425. label{sec:mathcommand}
  426. Following is a list of mathematical support related commands commonly used
  427. in simulation scripts:
  428. begin{flushleft}
  429. code{set rng [new RNG]}\
  430. This creates a new random number generator.
  431. code{$rng seed <0 or n>}\
  432. This command seeds the RNG. If 0 is specified, the RNG is seeded
  433. heuristically. Otherwise the RNG is seeded with the value <n>.
  434. code{$rng next-random}\
  435. This returns the next random number from RNG.
  436. code{$rng uniform <a> <b>}\
  437. This returns a number uniformly distributed on <a> and <b>.
  438. code{$rng integer <k>}\
  439. This returns an integer uniformly distributed on 0 and k-1.
  440. code{$rng exponential}\
  441. This returns a number that has exponential distribution with average 1.
  442. code{set rv [new Randomvariable/<type of random-variable>]}\
  443. This creates an instance of a random variable object that generates random 
  444. variables with specific distribution. The different types of random 
  445. variables derived from the base class are:\
  446. RandomVariable/Uniform, RandomVariable/Exponential, RandomVariable/Pareto,
  447. RandomVariable/Constant, RandomVariable/HyperExponential.
  448. Each of these distribution types are parameterized with values of
  449. appropriate parameters. For details see section ref{sec:ranvar} of this
  450. chapter.
  451. code{$rv use-rng <rng>}\
  452. This method is used to associated a random variable object with a
  453. non-default RNG. Otherwise by default, the random variable object is
  454. associated with the default random number generator.
  455. end{flushleft}
  456. % LocalWords:  ranvar pareto expoo tcl lib ns cc integrator RNG rng TclObject
  457. % LocalWords:  enum RNGSources PREDEF int MAXINT rX edv prob edp setbit iph ECN
  458. % LocalWords:  ip ecn eed OURCE OTcl RandomVariable argc const argv min avg val
  459. % LocalWords:  UniformRandomVariable ExponentialRandomVariable cov newPoint pp
  460. % LocalWords:  ParetoRandomVariable ConstantRandomVariable lastx lasty strcmp
  461. % LocalWords:  HyperExponentialRandomVariable newpoint atof QueueMonitor