⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 merge-scen

📁 CBRP协议(移动adhoc中基于分簇的路由协议)ns2下的源码
💻
字号:
#!/usr/bin/perl -w################################################################### Merge scenario files together to form a larger scenario.# Output is written to stdout## Assumptions:#     1. Scenario files are sorted by ascending order of time #        stamps of events.#        This is only neccesary when ad-hockey is used.#     2. Optimal routes are not needed in the merged scenario,#        even it may be produced by setdest or other tools.# Note:#     1. ad-hockey needs some comment lines in order to behave #        properly.#        some of these comment lines are already taken care of,#        but some of them may still need to be modified manually #        after merging.############################################################################################ Global Variables#########################my $MaxX=0;         # Max Xmy $MaxY=0;         # Max Ymy $MaxSpeed=0;     # Max Speedmy $MaxTime=0;      # Max simulation timemy $PAUSE=0.0;      # Pause Timemy $NN=0;           # Number of nodes read so farmy $MaxNodeID=0;    # Max of all IDs of nodes read so farmy @InitPos;        # Initial position of nodesmy @MoveSrc;        # first Node movementsmy @MoveDes;        # second Node movements#my @MergedMove;     # Merged movementsmy @Comments;       # Comment lines needed by ad-hockey################################################################### Read the Scenario file #     $_[0] -- reference to the hash to put the lines#     $_[1] -- name of scenario file##################################################################sub readScen{    my ($move) = $_[0];    my ($SCEN) = $_[1];    my ($time, $nodeID, $toX, $toY, $speed, $nn, $maxX, $maxY);    my ($maxTime) = 0;    if (!open(SCEN,"<$SCEN")) {        print "Can't read scenario file $SCEN\n";        return -1;    }        while(<SCEN>) {    my $line = $_;    if (/at (\d+\.\d+|\d+) .*node_\((\d+)\) setdest (\d+.\d+) (\d+.\d+) (\d+.\d+)/) {        # movement set lines like        # $ns_ at 825.29 "$node_(4) setdest 318.756 257.1639283 1.00000000"        $time = $1;        $nodeID = $2;        $toX = $3;        $toY = $4;        $speed = $5;        ($time > $maxTime) && ($maxTime = $time);        # update node ID        $nodeID += $NN;        $line =~ s/node_\(\d+\)/node_\($nodeID\)/;        #print "$line";        # store the line        push @$move,$line;        #$$move[++$#{$move}] = $line;        # update max node ID to calculate the number of nodes so far        $MaxNodeID = ($nodeID > $MaxNodeID) ? $nodeID : $MaxNodeID;    } elsif (/^.node_\((\d+)\) set ([XY]). (\d+\.\d+|\d+)/) {        # $node_(7) set X_ 0.0000000            $nodeID = $1;         # update node ID        $nodeID += $NN;        $line =~ s/node_\(\d+\)/node_\($nodeID\)/;        #print "$line";        # store the line        unshift @InitPos,$line;     } elsif (/nodes: (\d+), max time: (\d+.\d+), max x: (\d+.\d+), max y: (\d+.\d+)/) {        # new style lines	            # # nodes: 50, max time: 900.00, max x: 1500.00, max y: 300.00            $nn = $1;        ($2 > $maxTime) && ($maxTime = $2);        $maxX = $3;        $maxY = $4;        } elsif (/nodes: (\d+),.*max x = (\d+.\d+), max y: (\d+.\d+)/) {        # old style lines        # # nodes: 50, pause: 30.00, max speed: 1.00  max x = 1500.00, max y: 300.00	    	    $nn = $1;        $maxX = $2;        $maxY = $3; 	} elsif (/nominal range: (\d+.\d+) link bw: (\d+.\d+)/) {    ## nominal range: 250.0 link bw: 2000000.00        push @Comments,$line;    } elsif (/comm pattern: ([---\w_\#\.]+)/) {    ## comm pattern: comm-123        push @Comments,$line;    } elsif (/background bitmap: ([---\w_\#\.]+) (\d+) (\d+)/) {    ## background bitmap: site.xbm 430 540        push @Comments,$line;    }     } # end of while    close(SCEN);    # Update global variables    $NN = $MaxNodeID;    ($maxX > $MaxX) && ($MaxX = $maxX);    ($maxY > $MaxY) && ($MaxY = $maxY);    ($maxTime > $MaxTime) && ($MaxTime = $maxTime);    return 1;}############################################################## merge#     Merges all the movements together.#     Assume that all scenario files are sorted by ascending#     order of the event time.#############################################################sub merge{    my ($i, $j, $k);   # indices    my ($time1, $time2);    $i = 0; $j = 0;    while ($i <= $#MoveSrc and $j <= $#MoveDes) {#print "Entering wile loop: $i, $j\n";     $MoveSrc[$i] =~ /at (\d+\.\d+|\d+) .*node_\((\d+)\) setdest (\d+.\d+) (\d+.\d+) (\d+.\d+)/;    $time1 = $1;     $MoveDes[$j] =~ /at (\d+\.\d+|\d+) .*node_\((\d+)\) setdest (\d+.\d+) (\d+.\d+) (\d+.\d+)/;    $time2 = $1;    if ($time1 <= $time2) {        print $MoveSrc[$i];        $i++;    } else {        print $MoveDes[$j];        $j++;    }    } # end of while    if ($i <= $#MoveSrc) {        for ($k = $i; $k <= $#MoveSrc; $k++) {            print $MoveSrc[$k];        }    } else {        for ($k = $j; $k <= $#MoveDes; $k++) {            print $MoveDes[$k];        }    }      }################################################### generateComments#    generates comment lines of node info #    as needed by ad-hockey##################################################sub generateComments{    # use the "new style"    push @Comments,"# nodes: $NN, max time: $MaxTime, max x: $MaxX, max y: $MaxY\n";}###################### printUsage#####################sub printUsage {    print STDERR "Usage: $0 <senario file 1> <senario file 2>\n";}######################### Main ########################if ($#ARGV == -1) {    printUsage();    exit(0);}     readScen(\@MoveSrc, $ARGV[0]);readScen(\@MoveDes, $ARGV[1]);generateComments();print @Comments;        # entries here may need to be manually justifiedprint reverse @InitPos;merge();#print "Number of element in MoveSrc: $#MoveSrc\n";#print "Number of element in MoveDes: $#MoveDes\n";#print "Number of element in InitPos: $#InitPos\n";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -