Old/Mobility/MobilityModels: RandomDistance.pl

File RandomDistance.pl, 5.2 KB (added by mrodoper, 16 years ago)
Line 
1# Author: Mete Rodoper
2
3# Difference between random walk with wrapping and this one is; this has $runningTime limitation.
4# For more detail refer the How to code and use Various Mobility Model Scripts to Emulate Mobility at ORBIT tutorial
5
6#!/usr/bin/perl
7
8use Math::Round qw(:all);
9use Math::Trig 'deg2rad';
10
11#############################################################################################################
12######################################## Input the values below #############################################
13#############################################################################################################
14
15$sourceXValue = 2; # Source X value
16$sourceYValue = 2; # Source Y value
17
18$walkDuration = 1000; # Walk duration in unit time in one direction. When this time elapses change direcion
19$speed = 100; # Average speed of the VMs
20$angle = 360; # Angle randomness of the movements
21$randomnessInterval = 2; # Maximum distance that a node can jump at an iteration
22$numberOfStops = 50; # Number of destinations before script terminates
23$runningTime = 100; # Running time bound for the script. when this equals to 0, program terminates
24
25#############################################################################################################
26#############################################################################################################
27#############################################################################################################
28
29$mobileNumber = 0;
30$previousNode = "";
31
32$numberOfStopsMax = $numberOfStops;
33$mobileNumberIterator = $mobileNumber;
34$intervalTime = 0;
35
36$pointX = $sourceXValue;
37$pointY = $sourceYValue;
38
39$endMainLoop = 0;
40
41while ($numberOfStops > 0 && $endMainLoop == 0)
42{
43 $speedChosen = int(rand($speed));
44 $angleChosen = int(rand($angle));
45
46 $angleRad = deg2rad($angleChosen);
47
48 $noOfHops = $walkDuration/$speed;
49
50 while ($noOfHops > 0 && $endMainLoop == 0)
51 {
52 $pointX = $pointX + cos($angleRad);
53 $pointY = $pointY + sin($angleRad);
54
55 $fractionX = abs($pointX - int($pointX));
56 $fractionY = abs($pointY - int($pointY));
57
58 $firstQuarter = $fractionY * $fractionY + $fractionX * $fractionX;
59 $secondQuarter = $fractionY * $fractionY + (1-$fractionX) * (1-$fractionX);
60 $thirdQuarter = (1-$fractionY) * (1-$fractionY) + (1-$fractionX) * (1-$fractionX);
61 $fourthQuarter = (1-$fractionY) * (1-$fractionY) + $fractionX * $fractionX;
62
63 $floorX = int($pointX);
64 $floorY = int($pointY);
65
66
67
68 if($pointX < 0)
69 {
70 $ceilingX = $floorX - 1;
71 }
72 else
73 {
74 $ceilingX = $floorX + 1;
75 }
76
77 if($pointY < 0)
78 {
79 $ceilingY = $floorY - 1;
80 }
81 else
82 {
83 $ceilingY = $floorY + 1;
84 }
85
86 $minDistance = $firstQuarter;
87 $min = "1";
88 if ($secondQuarter < $minDistance)
89 {
90 $min = "2";
91 $minDistance = $secondQuarter;
92 }
93 if ($thirdQuarter < $minDistance)
94 {
95 $min = "3";
96 $minDistance = $thirdQuarter;
97 }
98 if ($fourthQuarter < $minDistance)
99 {
100 $min = "4";
101 }
102
103 if ($min == "1")
104 {
105 $newX = $floorX % 20 + 1;
106 $newY = $floorY % 20 + 1;
107
108 $nodeNameAndTime = "node$newX-$newY";
109 if ($previousNode ne $nodeNameAndTime)
110 {
111 $toFile = "$intervalTime $nodeNameAndTime";
112 print "$toFile\n";;
113 push @{$store{$mobileNumber}}, $toFile;
114 $previousNode = $nodeNameAndTime;
115 $runningTime--;
116 $intervalTime = $intervalTime + $speed;
117 }
118 }
119 elsif ($min == "2")
120 {
121 $newX = $ceilingX % 20 + 1;
122 $newY = $floorY % 20 + 1;
123
124 $nodeNameAndTime = "node$newX-$newY";
125 if ($previousNode ne $nodeNameAndTime)
126 {
127 $toFile = "$intervalTime $nodeNameAndTime";
128 print "$toFile\n";;
129 push @{$store{$mobileNumber}}, $toFile;
130 $previousNode = $nodeNameAndTime;
131 $runningTime--;
132 $intervalTime = $intervalTime + $speed;
133 }
134 }
135 elsif ($min == "3")
136 {
137 $newX = $ceilingX % 20 + 1;
138 $newY = $ceilingY % 20 + 1;
139
140 $nodeNameAndTime = "node$newX-$newY";
141 if ($previousNode ne $nodeNameAndTime)
142 {
143 $toFile = "$intervalTime $nodeNameAndTime";
144 print "$toFile\n";;
145 push @{$store{$mobileNumber}}, $toFile;
146 $previousNode = $nodeNameAndTime;
147 $runningTime--;
148 $intervalTime = $intervalTime + $speed;
149 }
150 }
151 elsif ($min == "4")
152 {
153 $newX = $floorX % 20 + 1;
154 $newY = $ceilingY % 20 + 1;
155
156 $nodeNameAndTime = "node$newX-$newY";
157 if ($previousNode ne $nodeNameAndTime)
158 {
159 $toFile = "$intervalTime $nodeNameAndTime";
160 print "$toFile\n";;
161 push @{$store{$mobileNumber}}, $toFile;
162 $previousNode = $nodeNameAndTime;
163 $runningTime--;
164 $intervalTime = $intervalTime + $speed;
165 }
166 }
167
168 if ($runningTime == 0)
169 {
170 print "The chosen distance is reached. Ending Simulation...\n";
171 $endMainLoop = 1;
172 }
173 $noOfHops--;
174 }
175
176 if ($endMainLoop == 0)
177 {
178 $numberOfStopsToPrint = $numberOfStopsMax + 1 - $numberOfStops;
179 $mobileNumberIteratorToPrint = $mobileNumberIterator +1;
180 print "Destination No : $numberOfStopsToPrint is Reached for Mobile Node Number : $mobileNumberIteratorToPrint\n";
181 }
182
183 $pointX = $newX;
184 $pointY = $newY;
185
186 $numberOfStops--;
187}
188
189$mobileNumberIterator = 0;
190$nodeNumber = $mobileNumberIterator + 1;
191
192while (${$store{$mobileNumberIterator}}[$j] ne ())
193{
194 $tempWrite = ${$store{$mobileNumberIterator}}[$j];
195 system("echo $tempWrite >> VM$nodeNumber.txt");
196 $j = $j + 1;
197}
198
199