#include #include class env_Env { public: env_Env( int users, int channels, float load ); float rate( int i, int j ) { return (currentRateMatrix[i][j]); }; float arrival( int i ) { return currentArrivalVector[i]; }; float occupancy( int i ) { return currentOccupancyVector[i]; }; void transmit( vector schedule ); void tick(); void print(); int numUsers; int numChannels; private: float avgLoad; vector< vector > currentRateMatrix; vector currentArrivalVector; vector currentOccupancyVector; int bernoulli( float avgLoad ); }; env_Env::env_Env( int users, int channels, float load ) { numUsers = users; numChannels = channels; avgLoad = load; for (int i = 0 ; i < numUsers; i++ ) { currentArrivalVector.push_back( 0.0 ); currentOccupancyVector.push_back( 0.0 ); currentRateMatrix.push_back( *( new vector ) ); for ( int j = 0 ; j < numChannels ; j++ ) { currentRateMatrix[i].push_back( 0.0 ); } } } void env_Env::tick() { for (int i = 0 ; i < numUsers; i++ ) { for ( int j = 0 ; j < numChannels ; j++ ) { currentRateMatrix[i][j] = numUsers * bernoulli( avgLoad ); } currentArrivalVector[i] = bernoulli( avgLoad ); currentOccupancyVector[i] += currentArrivalVector[i]; } } int env_Env::bernoulli( float prob ) { float foo = (float) rand(); float randmax = (float) RAND_MAX ; float bar = foo / randmax; return ( bar < prob ) ? 1 : 0; } void env_Env::transmit( vector schedule ) { for (int i = 0; i < numChannels ; i++ ) { currentOccupancyVector[schedule[i]] -= currentRateMatrix[schedule[i]][i]; if ( currentOccupancyVector[schedule[i]] < 0 ) { currentOccupancyVector[schedule[i]] = 0; } } } void env_Env::print() { cout << "Current state:" << endl; for (int i = 0; i < numUsers ; i++ ) { cout << "User " << i << " Q length " << currentOccupancyVector[i] << endl; } } int main() { int numCycles = 100; env_Env cell(2, 1, 0.49); vector schedule; schedule.push_back(0); for ( int i = 0; i < numCycles ; i++ ) { schedule[0] = 0; for ( int j = 0 ; j < cell.numUsers; j++ ) { if ( cell.occupancy( j ) > 0 && ( cell.rate( j, 0) > cell.rate( schedule[0], 0 ) ) ) { schedule[0] = j; } } cell.transmit( schedule ); cell.print(); cell.tick(); } return 0; }