본문내용
>
#define BUS_STOP 19
#define BUS_INTERVAL 300
#define BUS_DRIVE 180
#define HUMAN_ARRIVAL 30
#define BOARDING_TIME 6
const int numOfbus = 30;
enum {BUS_LEAVE,BUS_ARRIVE,HUMAN_ARRIVE}; //event type
struct EVENT_TYPE { long time;
int event_type,data;
EVENT_TYPE* next;
};
void insertq(long,int,int);
void deleteq(void);
void output(int*);
EVENT_TYPE *getq(void);
int rnd_arrival(int);
int waiting_men[BUS_STOP];
EVENT_TYPE *queue=NULL;
void main()
{
clrscr();
randomize();
int bus[numOfbus];
int again = 0;
int end_stop = 0;
insertq(0,BUS_LEAVE,0);
for(int i=1;i
insertq(i*BUS_DRIVE+rnd_arrival(HUMAN_ARRIVAL),HUMAN_ARRIVE,i);
waiting_men[i] = 1;
}
for(;;) {
EVENT_TYPE *event = getq();
switch (event->event_type) {
case BUS_LEAVE:
if(event->data == 0) {
again++;
insertq(again*BUS_INTERVAL,BUS_LEAVE,0);
}
insertq(event->time+rnd_arrival(BUS_DRIVE),BUS_ARRIVE,++event->data);
break;
case BUS_ARRIVE:
if (event->data == BUS_STOP+1){
bus[end_stop] = event->time;
end_stop++;
if(end_stop == numOfbus) output(bus);
}
else {
insertq(event->time+waiting_men[event->data]*BOARDING_TIME
,BUS_LEAVE,event->data);
waiting_men[event->data] = 0;
}
break;
case HUMAN_ARRIVE:
waiting_men[event->data]++;
insertq(event->time+rnd_arrival(HUMAN_ARRIVAL),HUMAN_ARRIVE,event->da
ta);
break;
}
deleteq();
}
}
//delete queue..
void deleteq()
{
EVENT_TYPE* node = queue;
queue = queue->next;
free (node);
return;
}
//current event queue..
EVENT_TYPE *getq()
{
EVENT_TYPE* get;
get = queue;
return get;
}
//insert event-queue
void insertq(long time,int type,int data)
{
EVENT_TYPE* new_event;
EVENT_TYPE* x=NULL;
new_event =(EVENT_TYPE*)malloc(sizeof(EVENT_TYPE));
//Memory full check
#define FULL(queue) (!(queue))
if (FULL(new_event)) {
cout<<"full";
getch();
exit(1);
}
new_event->time = time;
new_event->event_type = type;
new_event->data = data;
new_event->next = NULL;
x = queue;
for(;;) {
if (x==NULL) {
queue = new_event;
return;
}
else if(x->next == NULL) {
x->next = new_event;
return;
}
else if(x->time <= time && x->next->time > time) {
new_event->next = x->next;
x->next = new_event;
return;
}
x = x->next;
}
}
//random time
int rnd_arrival(int t)
{
double temp;
temp = 1.0 - (double)(rand()%1000)/1000.0;
return ( -((double)t*log(temp)));
}
//output
void output(int* bus)
{
int r = 0;
cout<<"First arrival time(second) : "<
for(r=1;r
cout<<"Interval between Bus "<
<<" & Bus "<
<
<
}
cout<<"Press any key : Graphic Mode !"
<
getch();
//graphic mode..
int gd = DETECT,gm;
int color,temp;
char buffer[6];
initgraph(&gd,&gm,"");
temp = bus[0];
sprintf(buffer,"%d",bus[0]);
outtextxy(0,getmaxy()-95,buffer);
outtextxy(0,getmaxy()-50,"Interval 100 second --> ");
line(200,getmaxy()-80,200,getmaxy()-20);
line(205,getmaxy()-80,205,getmaxy()-20);
for(r=0;r
color = r%10;
if(color == 0) color = 5;
setcolor(color);
line((bus[r]-temp)/20+10,10,(bus[r]-temp)/20+10,getmaxy()-100);
}
getch();
exit(1);
}
#define BUS_STOP 19
#define BUS_INTERVAL 300
#define BUS_DRIVE 180
#define HUMAN_ARRIVAL 30
#define BOARDING_TIME 6
const int numOfbus = 30;
enum {BUS_LEAVE,BUS_ARRIVE,HUMAN_ARRIVE}; //event type
struct EVENT_TYPE { long time;
int event_type,data;
EVENT_TYPE* next;
};
void insertq(long,int,int);
void deleteq(void);
void output(int*);
EVENT_TYPE *getq(void);
int rnd_arrival(int);
int waiting_men[BUS_STOP];
EVENT_TYPE *queue=NULL;
void main()
{
clrscr();
randomize();
int bus[numOfbus];
int again = 0;
int end_stop = 0;
insertq(0,BUS_LEAVE,0);
for(int i=1;i
waiting_men[i] = 1;
}
for(;;) {
EVENT_TYPE *event = getq();
switch (event->event_type) {
case BUS_LEAVE:
if(event->data == 0) {
again++;
insertq(again*BUS_INTERVAL,BUS_LEAVE,0);
}
insertq(event->time+rnd_arrival(BUS_DRIVE),BUS_ARRIVE,++event->data);
break;
case BUS_ARRIVE:
if (event->data == BUS_STOP+1){
bus[end_stop] = event->time;
end_stop++;
if(end_stop == numOfbus) output(bus);
}
else {
insertq(event->time+waiting_men[event->data]*BOARDING_TIME
,BUS_LEAVE,event->data);
waiting_men[event->data] = 0;
}
break;
case HUMAN_ARRIVE:
waiting_men[event->data]++;
insertq(event->time+rnd_arrival(HUMAN_ARRIVAL),HUMAN_ARRIVE,event->da
ta);
break;
}
deleteq();
}
}
//delete queue..
void deleteq()
{
EVENT_TYPE* node = queue;
queue = queue->next;
free (node);
return;
}
//current event queue..
EVENT_TYPE *getq()
{
EVENT_TYPE* get;
get = queue;
return get;
}
//insert event-queue
void insertq(long time,int type,int data)
{
EVENT_TYPE* new_event;
EVENT_TYPE* x=NULL;
new_event =(EVENT_TYPE*)malloc(sizeof(EVENT_TYPE));
//Memory full check
#define FULL(queue) (!(queue))
if (FULL(new_event)) {
cout<<"full";
getch();
exit(1);
}
new_event->time = time;
new_event->event_type = type;
new_event->data = data;
new_event->next = NULL;
x = queue;
for(;;) {
if (x==NULL) {
queue = new_event;
return;
}
else if(x->next == NULL) {
x->next = new_event;
return;
}
else if(x->time <= time && x->next->time > time) {
new_event->next = x->next;
x->next = new_event;
return;
}
x = x->next;
}
}
//random time
int rnd_arrival(int t)
{
double temp;
temp = 1.0 - (double)(rand()%1000)/1000.0;
return ( -((double)t*log(temp)));
}
//output
void output(int* bus)
{
int r = 0;
cout<<"First arrival time(second) : "<
cout<<"Press any key : Graphic Mode !"
<
//graphic mode..
int gd = DETECT,gm;
int color,temp;
char buffer[6];
initgraph(&gd,&gm,"");
temp = bus[0];
sprintf(buffer,"%d",bus[0]);
outtextxy(0,getmaxy()-95,buffer);
outtextxy(0,getmaxy()-50,"Interval 100 second --> ");
line(200,getmaxy()-80,200,getmaxy()-20);
line(205,getmaxy()-80,205,getmaxy()-20);
for(r=0;r
if(color == 0) color = 5;
setcolor(color);
line((bus[r]-temp)/20+10,10,(bus[r]-temp)/20+10,getmaxy()-100);
}
getch();
exit(1);
}