Mobility/MobilityModels: RandomWalkwithWrap.pl

File RandomWalkwithWrap.pl, 4.8 kB (added by mrodoper, 9 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 = 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;