学校の課題にて、どうしてもうまくいかない問題が出ましたので、是非ともお力をお借りしたく思います。
次のプログラムはM/M/Sの待ち行列モデルのプログラムです
#include <stdio.h>
#include <stdlib.h>
struct st_cell {
int data; /* 転送要求の到着時刻 */
struct st_cell *next; /* 次のセルへのポインタ */
};
typedef struct st_cell CELL;
/* 転送処理の終了を判定する関数 */
int departure(double);
/* 転送要求の到着を判定する関数 */
int arrival(double);
/* 待ち行列に残っているすべてのセルを削除する関数 */
void clear(CELL *);
/* 待ち行列の末尾にセルを追加する関数 */
void enqueue(CELL **, CELL **, int);
/* サーバのメモリにあるセルを削除する関数 */
int dequeue(CELL **);
/* 待ち行列の先頭のセルをサーバに転送する関数 */
void transmission(CELL **head, CELL **tail, CELL **memory);
int main(int argc, char *argv[])
{
double lambda; /* 単位時間あたりの到着確率 */
double mu; /* 単位時間あたりのサービス終了確率 */
double rho; /* システム利用率 */
int S; /* サーバ数 */
int T; /* シミュレーション時間*/
int B; /* 初期バイアス期間 */
int N; /* 繰り返し回数 */
int t; /* 現在の時刻 */
int n; /* 現在のシミュレーション回数 */
int i; /* カウンタ用変数 */
double avgLength; /* 平均系内客数 */
double avgWait; /* 平均滞在時間 */
double avgThroughput; /* スループット */
double sumLength; /* 合計系内客数*/
double sumDeparture; /* 合計退去数*/
double sumWait; /* 合計滞在時間*/
int length; /* 系内客数*/
int wait; /* 滞在時間 */
CELL *head; /* 待ち行列の先頭へのポインタ */
CELL *tail; /* 待ち行列の末尾へのポインタ */
CELL **server; /* サーバでメモリを表す配列へのポインタ */
/* 引数の個数が5個ではないとき */
if (argc != 5) {
fprintf(stderr, "usage: %s <rho> <servers> <time> <repeat>\n", argv[0]);
exit(EXIT_FAILURE);
}
rho = (double)atof(argv[1]);
/* 利用率の値が不正なとき */
if (rho < 0 || rho > 1.0) {
fprintf(stderr, "rho must be set in range [0,1.0].\n");
exit(EXIT_FAILURE);
}
S = atoi(argv[2]);
/* サーバ数の値が不正なとき */
if (S <= 0) {
fprintf(stderr, "servers must be set to a positive integer. \n");
exit(EXIT_FAILURE);
}
T = atoi(argv[3]);
/* シミュレーション時間の値が不正なとき */
if (T <= 0) {
fprintf(stderr, "time must be set to a positive integer.\n");
exit(EXIT_FAILURE);
}
N = atoi(argv[4]);
/* 繰り返し回数の値が不正なとき */
if (N <= 0) {
fprintf(stderr, "repeat must be set to a positive integer.\n");
exit(EXIT_FAILURE);
}
B = T / 10; /* 初期バイアス期間はシミュレーション時間の1割 */
mu = 6.25 / 1000.0; /* 単位時間あたりのサービス終了確率を設定 */
lambda = rho * S * mu; /* 単位時間あたりの到着確率を設定 */
server =(CELL **)malloc(sizeof(CELL *) * S);
if (server == NULL) {
fprintf(stderr, "cannot allocate memories for server.\n");
exit(EXIT_FAILURE);
}
avgLength = 0.0; /* 平均系内客数の初期化 */
avgWait = 0.0; /* 平均滞在時間の初期化 */
avgThroughput = 0.0; /* 平均スループットの初期化 */
srand(time(NULL)); /* 乱数の初期化 */
/* N回だけシミュレーションを繰り返し*/
for (n = 0; n <= N - 1; n++) {
sumLength = 0; /* 合計系内客数の初期化 */
sumDeparture = 0; /* 合計退去数の初期化 */
sumWait = 0; /* 合計滞在時間の初期化 */
length = 0; /* 系内客数の初期化 */
head = NULL; /* 待ち行列の先頭の初期化 */
tail = NULL; /* 待ち行列の末尾の初期化 */
for (i = 0; i <= S - 1; i++) {
server[i] = NULL;
}
for (t = 0; t <= T - 1; t++) {
for (i = 0; i <= S - 1; i++) {
if (server[i] != NULL && departure(mu)) {
wait = t - dequeue(&server[i]);
if (t >= B) {
sumWait += wait;
sumDeparture++;
}
length--;
}
}
if (arrival(lambda)) {
enqueue(&head, &tail, t);
length++;
}
for (i = 0; i <= S - 1; i++) {
if (head != NULL && server[i] == NULL) {
transmission(&head, &tail, &server[i]);
}
}
if (t >= B) {
sumLength += length;
}
}
avgLength += (double)sumLength / (double)(T-B);
if (sumDeparture >= 1) {
avgWait += (double)sumWait / (double)sumDeparture;
}
avgThroughput += (double)sumDeparture / (double)(T-B);
clear(head);
for (i = 0; i <= S - 1; i++) {
free(server[i]);
}
}
avgLength /= (double)N;
avgWait = avgWait / (double)N / 1000.0;
avgThroughput = avgThroughput / (double)N * 1000.0;
free(server);
printf("%e,%d,%e,%e,%e\n", rho, S, avgLength, avgWait, avgThroughput);
return EXIT_SUCCESS;
}
int arrival(double lambda){
double r;
r = (double)rand() / ((double)RAND_MAX+1.0);
if (r < lambda) return 1;
else return 0;
}
int departure(double mu){
r = (double)rand() / ((double)RAND_MAX+1.0);
if (r < mu) return 1;
else return 0;
void clear(CELL *head)
{
CELL *tmp;
while (head != NULL) {
tmp = head;
head = head->next;
free(tmp);
}
}
}
どこがまずいのか、どこが間違っているのか、是非御教授いただけたらと思います。
enqueue関数は、待ち行列に新たなセルを挿入する関数。
dequeue関数は、待ち行列の先頭のセルを削除する関数。
tansmission関数は、待機している転送要求があり、かついずれかのサーバが空いている時、そのサーバにセルを送り出す関数です。
void enqueue(CELL **head, CELL **tail, int data)
{
CELL *tmp;
if((*head)==NULL){
tmp = (CELL *) malloc(sizeof(CELL));
tmp->data=data;
tmp->next=NULL;
*head = tmp;
*tail = tmp;
}
else{
tmp = (CELL *) malloc(sizeof(CELL));
tmp->data=data;
(*tail)->next = tmp;
*tail = (*tail)->next;
}
}
int dequeue(CELL **memory){
int tmp;
tmp=(*memory)->data;
free(memory);
memory == NULL;
return tmp;
}
void transmission(CELL **head, CELL **tail, CELL **memory)
{
*memory = *head;
*head = (*head)->next;
if((*head)==NULL) (*tail)==NULL;
}