Skip to content

Instantly share code, notes, and snippets.

@jeremywrnr
Created December 8, 2014 20:56
Show Gist options
  • Save jeremywrnr/5fb4d04234c0ddd4bf58 to your computer and use it in GitHub Desktop.
Save jeremywrnr/5fb4d04234c0ddd4bf58 to your computer and use it in GitHub Desktop.
erlang B implementation, calculating max users given acceptable GOS
#/usr/bin/env perl -w
# by jeremy warner, f14
use strict;
# determine number of channels to test
die "enter \# channels, then sectors\n" unless @ARGV == 2;
my ($chan, $sect) = @ARGV;
# program constants
my $au = 0.2; # erlangs
my $user = 1000; # max user
my $maxGos = 0.005;
my @atest=(0..$user);
# display contants
print "\nTraffic/user: \t\t$au\n";
print "Channels/sector: \t$chan\n";
print "# of Sectors: \t\t$sect\n";
print "Max GOS: \t\t$maxGos\n";
# factorial init
my %table; $table{0} = 1;
foreach my $a (@atest) {
my $traffic = $a * $au;
my $num = ( $traffic ** $chan ) / factorial($chan);
my $denom = 0;
for(my $i = 0; $i < $chan+1; $i++){
$denom += ( $traffic ** $i ) / factorial($i);
}
my $result = ($num/$denom);
if ($result > $maxGos)
{
print("\n\tresults:\n\n");
my $endResults = "supported users:\t". ($a-1) ."\n";
$endResults .= "supported traffic:\t". ($traffic-$au) . " [erlangs]\n";
$endResults .= "traffic/sector:\t\t". ($traffic-$au)*$sect . " [erlangs]\n";
die $endResults;
}
# user for debus
#print("users = ". $traffic/$au .", gos = $result\n");
}
sub factorial {
my $number = shift;
my $factorial;
if ( exists $table{$number} ) {
return $table{$number}; # Input found in the look-up table, returning stored value.
}
else {
$factorial = factorial($number - 1) * $number;
}
$table{$number} = $factorial;
return $factorial;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment