Mobility/MobilityModels: RandomDistance.pl

File RandomDistance.pl, 5.2 kB (added by mrodoper, 6 months 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