Old/Mobility/MobilityModels: RandomWalkwithReflection.pl

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