Mobility/MobilityModels: RandomWalkwithReflection.pl

File RandomWalkwithReflection.pl, 6.0 kB (added by mrodoper, 6 months 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}