Old/Mobility/MobilityModels: RandomWalkwithWrap.pl

File RandomWalkwithWrap.pl, 4.8 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 = 2; # Source X value
15$sourceYValue = 2; # Source Y value
16
17$walkDuration = 1000; # Walk duration in unit time in one direction. When this time elapses change direction
18$speed = 100; # Average speed of the VMs
19$angle = 360; # Angle randomness of the movements
20$randomnessInterval = 2; # Maximum distance that a node can jump at an iteration
21$numberOfStops = 3; # Number of destinations before script terminates
22
23#############################################################################################################
24#############################################################################################################
25#############################################################################################################
26
27$mobileNumber = 0;
28
29$previousNode = "";
30
31
32$numberOfStopsMax = $numberOfStops;
33$mobileNumberIterator = $mobileNumber;
34$intervalTime = 0;
35
36$pointX = $sourceXValue;
37$pointY = $sourceYValue;
38
39while ($numberOfStops > 0)
40{
41 $speedChosen = int(rand($speed));
42 $angleChosen = int(rand($angle));
43
44 $angleRad = deg2rad($angleChosen);
45
46 $noOfHops = $walkDuration/$speed;
47
48 while ($noOfHops > 0)
49 {
50 $pointX = $pointX + cos($angleRad);
51 $pointY = $pointY + sin($angleRad);
52
53 $fractionX = abs($pointX - int($pointX));
54 $fractionY = abs($pointY - int($pointY));
55
56 $firstQuarter = $fractionY * $fractionY + $fractionX * $fractionX;
57 $secondQuarter = $fractionY * $fractionY + (1-$fractionX) * (1-$fractionX);
58 $thirdQuarter = (1-$fractionY) * (1-$fractionY) + (1-$fractionX) * (1-$fractionX);
59 $fourthQuarter = (1-$fractionY) * (1-$fractionY) + $fractionX * $fractionX;
60
61 $floorX = int($pointX);
62 $floorY = int($pointY);
63
64
65
66 if($pointX < 0)
67 {
68 $ceilingX = $floorX - 1;
69 }
70 else
71 {
72 $ceilingX = $floorX + 1;
73 }
74
75 if($pointY < 0)
76 {
77 $ceilingY = $floorY - 1;
78 }
79 else
80 {
81 $ceilingY = $floorY + 1;
82 }
83
84 $minDistance = $firstQuarter;
85 $min = "1";
86 if ($secondQuarter < $minDistance)
87 {
88 $min = "2";
89 $minDistance = $secondQuarter;
90 }
91 if ($thirdQuarter < $minDistance)
92 {
93 $min = "3";
94 $minDistance = $thirdQuarter;
95 }
96 if ($fourthQuarter < $minDistance)
97 {
98 $min = "4";
99 }
100
101 if ($min == "1")
102 {
103 $newX = $floorX % 20;
104 $newY = $floorY % 20;
105
106 $nodeNameAndTime = "node$newX-$newY";
107 if ($previousNode ne $nodeNameAndTime)
108 {
109 $toFile = "$intervalTime $nodeNameAndTime";
110 print "$toFile\n";;
111 push @{$store{$mobileNumber}}, $toFile;
112 $previousNode = $nodeNameAndTime;
113 $runningTime--;
114 $intervalTime = $intervalTime + $speed;
115 }
116 }
117 elsif ($min == "2")
118 {
119 $newX = $ceilingX % 20;
120 $newY = $floorY % 20;
121
122 $nodeNameAndTime = "node$newX-$newY";
123 if ($previousNode ne $nodeNameAndTime)
124 {
125 $toFile = "$intervalTime $nodeNameAndTime";
126 print "$toFile\n";;
127 push @{$store{$mobileNumber}}, $toFile;
128 $previousNode = $nodeNameAndTime;
129 $runningTime--;
130 $intervalTime = $intervalTime + $speed;
131 }
132 }
133 elsif ($min == "3")
134 {
135 $newX = $ceilingX % 20;
136 $newY = $ceilingY % 20;
137
138 $nodeNameAndTime = "node$newX-$newY";
139 if ($previousNode ne $nodeNameAndTime)
140 {
141 $toFile = "$intervalTime $nodeNameAndTime";
142 print "$toFile\n";;
143 push @{$store{$mobileNumber}}, $toFile;
144 $previousNode = $nodeNameAndTime;
145 $runningTime--;
146 $intervalTime = $intervalTime + $speed;
147 }
148 }
149 elsif ($min == "4")
150 {
151 $newX = $floorX % 20;
152 $newY = $ceilingY % 20;
153
154 $nodeNameAndTime = "node$newX-$newY";
155 if ($previousNode ne $nodeNameAndTime)
156 {
157 $toFile = "$intervalTime $nodeNameAndTime";
158 print "$toFile\n";;
159 push @{$store{$mobileNumber}}, $toFile;
160 $previousNode = $nodeNameAndTime;
161 $runningTime--;
162 $intervalTime = $intervalTime + $speed;
163 }
164 }
165
166 $noOfHops--;
167 }
168
169 $numberOfStopsToPrint = $numberOfStopsMax + 1 - $numberOfStops;
170 $mobileNumberIteratorToPrint = $mobileNumberIterator +1;
171 print "Destination No : $numberOfStopsToPrint is Reached for Mobile Node Number : $mobileNumberIteratorToPrint\n";
172
173 $pointX = $newX;
174 $pointY = $newY;
175
176 $numberOfStops--;
177}
178
179$mobileNumberIterator = 0;
180$printNode = $mobileNumberIterator + 1;
181
182
183while (${$store{$mobileNumberIterator}}[$j] ne ())
184{
185 $tempWrite = ${$store{$mobileNumberIterator}}[$j];
186 #print "$tempWrite\n";
187 system("echo $tempWrite >> VM$printNode.txt");
188 $j = $j + 1;
189}
190$mobileNumberIterator--;
191$j = 0;
192