home *** CD-ROM | disk | FTP | other *** search
- {AUTHOR: Mark Aldon Weiss donated to public domain}
-
- CONST
-
- MaxNumPts = 2000;
-
- MaxNumRuns = 500;
-
-
-
- VAR
-
- X,Y,Distance: Array[1..MaxNumPts] of Real;
-
- NearestNeighbor: Array[1..MaxNumPts] of Integer;
-
- Probability: Array[1..MaxNumRuns] of Real;
-
- i,j,NumPts: 1..MaxNumPts; NumRuns,Run:1..MaxNumRuns;
-
- NumCommuting: 1..MaxNumPts;
-
- ch: char;
-
- Smallest,StDev,Avg: Real;
-
-
-
- BEGIN { M A I N P R O G R A M }
-
- Writeln;
- Writeln('This program is a Monte Carlo computation of the following problem.');
- Writeln('Given random points in the plane, what is the probability that a');
- Writeln('point''s nearest neighbor has as IT''s nearest neighbor, the first');
- Writeln('point?'#7);
- Writeln;
- Writeln('TURN THE PRINTER ON before we continue.');
- Writeln;
- REPEAT
- Write('Did you turn the printer on? '); Readln(ch); Writeln;
- IF NOT( ch IN ['y','Y'] ) THEN Writeln('Well go turn it on'#7#7#7)
- UNTIL ch IN ['y','Y'];
- Writeln(lst);
- Writeln(lst,#27'E RESULTS of NEAREST NEIGHBOR TEST on TURBO PASCAL RNG');
- Writeln(lst,#27'F');
- Write('Good, now how many points per run do you want (',MaxNumPts:5,' max)? ');
- Readln(NumPts); Writeln;
- Write('How many runs do you want (',MaxNumRuns:3,' max)? ');
- Readln(NumRuns); Writeln;
- Writeln(lst,#27'G EACH RUN HAS ',NumPts:3,' POINTS'#27'H'); Writeln(lst);
- FOR Run := 1 to NumRuns DO
- Begin
- for i := 1 to NumPts do begin X[i] := RANDOM; Y[i] := RANDOM end;
- NumCommuting := 0;
- FOR i := 1 to NumPts DO
- Begin
- FOR j := 1 to NumPts DO
- Distance[j] := SQR( X[i] - X[j] ) + SQR( Y[i] - Y[j]);
- { whether its the square of the distance or not does't matter }
- { why have the computer take the sqaure root when it's not needed }
- Distance[i] := 20; {any number > 1 so dist. pt. to self not smallest}
- Smallest := Distance[1]; NearestNeighbor[i] := 1;
- FOR j := 2 to Numpts DO
- IF Distance[j] < Smallest THEN
- begin Smallest := Distance[j]; NearestNeighbor[i] := j end
- End;
- FOR i := 1 to NumPts DO
- IF NearestNeighbor[ NearestNeighbor[i] ] = i THEN
- NumCommuting := NumCommuting + 1;
- Probability[Run] := NumCommuting/NumPts;
- Writeln;
- Writeln(lst);
- Writeln('Run',Run:4,' There were ',NumCommuting:4,' commuting points out of');
- Writeln(Numpts:5,' the probability was therfore ',Probability[Run]:7:5);
- Writeln(lst,'Run',Run:4,' probability = ',Probability[Run]:11:8);
- Writeln(lst);
- Writeln;
- Avg := 0; StDev := 0;
- for i := 1 to Run do Avg := Avg + Probability[i];
- Avg := Avg/Run;
- for i := 1 to Run do StDev := StDev + SQR( Probability[i] - Avg );
- if Run <> 1 then StDev := SQRT( StDev/(Run-1) ) else StDev := 0;
- Writeln('The average so far is ',Avg:7:5);
- Writeln('The standard deviation is ',StDev:7:5);
- Writeln(lst,'The average so far is ',Avg:11:8);
- Writeln(lst,'The standard deviation is ',StDev:11:8)
- End;
- Writeln; Writeln;
- Writeln('The nearest neighbor problem may be solved analytically.');
- Writeln('The result is 6pi / ( 8pi + 3 SQRT(3) ) = 0.621505')
-
- END. { M A I N P R O G R A M }