Tải bản đầy đủ (.doc) (13 trang)

Mô phỏng cuộc chạy thi giửa 2 tàu chiến gọi là Tàu 1 và Tàu 2.

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (130.28 KB, 13 trang )

BÀI 2.

1.Đề bài:
Mô phỏng cuộc chạy thi giửa 2 tàu chiến gọi là Tàu 1 và Tàu 2.
Nội dung như sau:
Có 2 tàu chiến gọi là Tàu1 và Tàu 2 xuất phát tại cùng một căn cứ điểm
và đi đến đích trong một lộ trình dài Y (km). Trong q trình đi thì các tàu phải
dừng lại tiếp nhiên liệu dọc đường. Do có dựa vào trang thiết bị hiện đại và
được chế tạo với công nghệ cao hơn nên Tàu 1 có vận tốc lớn hơn Tàu 2 tuy
nhiên cũng vì lý do đó mà Tàu1 có hệ số sẵn sàng xuất phát bé thua hệ số sẵn
sàng xuất phát của Tàu 2. Trên đường đi cứ mỗi lần dừng lại để tiếp nhiên liệu
các tàu lại tiếp tục xuất phát với hệ số sẵn sàng lần lược là hssst1 và hssst2.
Quãng đường đi được của cả hai tàu được cộng dồn.
Hãy thiết lập một bài tốn mơ phỏng với các hệ số sẵn sàng là một số
ngẫu nhiên sao cho Tàu 2 có xác suất về đích lớn hơn Tàu 1.
2. Phân tích đề bài.
Bài tốn này thuộc loại bài tốn mơ hình hố hệ ngẫu nhiên với biến ngẫu
nhiên ở đây là hệ số sẵn sàng xuất phát của các tàu. Trong thuật giải này thì vận
tốc của các tàu có thể được thể hiện qua quãng đường mà nó di chuyển được
trong một khoảng thời gian nhất định cho trước. Như vậy khi thực hiện gieo một
số ngẫu nhiên thì ta phải so sánh với các hệ số sẵn sàng của cả hai tàu để ra
quyết định tàu nào xuất phát. Thực hiện gieo các số ngẫu nhiên để thử là nội
dung của phương pháp mô hình hố hệ ngẫu nhiên.
Nội dung của phương pháp được trình bày ở trong bài 1.
3. Các biến ngẫu nhiên
Như trên đã trình bày sự xuất phát của các tàu được đánh giá qua một số
ngẫu nhiên đó là hệ số xuất phát. Như vậy biến ngẫu nhiên ở đây chính là hệ số
xuất phát. Nếu như hệ số sẵn sang của các tàu được lấy các giá trị trong khoảng
[0,1] thì số ngẫu nhiên là một số có phân bố U(0,1).
4. Phân tích giải thuật.
Giải thuật cho bài tốn trên được xây dựng như sau:


+ Cho trước các thông số khơng đổi trong q trình chuyển động như vận
tốc của các tầu và quãng đường di chuyển sau mỗi lần tiếp nhiên liệu.
+ Gieo một số ngẫu nhiên x=U(0,1):
Nếu xNếu x<hssst2 và x>hssst1 thì Tàu 2 xuất phát
+ Thực hiện so sánh quãng đường di chuyển được của cả hai tàu so với độ
dài quãng đường ấn định trước nếu tầu nào về đích trước thì kết thúc cuộc chơi.
5. Lưu đồ thuật giải như sau:


Nhập số liệu
hssst1,hssst2
Nhập Y

Lấy x=U(0,1)

x<=hssst1

Đ

Tau1cd,
Tàu 2cd

S
S

Đ

hssst1<=x<=hssst2


xt1=xt1+x01 or
xt2=xt2+x02

S

Tàu 2cd

S
xt1=Y or
xt2=Y

xt2=xt2+x02

S

Đ

xt2=Y

Đ
END

6.iu kin đầu, điều kiện dừng mô phỏng.
Điều kiện đầu ở đây là khoảng các của hành trình và các khoảng các
chuyển động của Tàu 1 và Tàu 2.
Điều kiện dừng chuyển động là khi một trong 2 tàu về đích.
7.Chương trình mơ phỏng.
Chương trình sau được xây dựng trên ngơn ngữ C với mã nguồn được cho
dưới đây.
#include"mou.h"

#include"iostream.h"
#include"math.h"
#include"conio.h"
#include"stdio.h"
#include"graphics.h"


#define Enter 13
void Write_text(int x1, int y1,double x,char*s,int color);
void write_value(int*x,int*y,char*s);
void read_value(int*x,int*y,char*s);
int Nhap_kc_tau1(void);
int Nhap_kc_tau2(void);
double Nhap_hsss_tau1(void);
double Nhap_hsss_tau2(void);
void Data_in(void);
void tau1_cd(void);
void tau2_cd(void);
void ve_tau1(void);
void ve_tau2(void);
void Win(void);
void Run(void);
void button(int x1,int y1,int x2,int y2,int color,char s[],int color_s,int size);
void button1(int x1,int y1,int x2,int y2,int color);
void _line(int x1, int y1, int x2, int y2, int color);
void _line1(int x1,int y1,int x2,int y2);
void main_h(void);
void help(void);
int xt,yt,xr,yr,nt,nr,i,j=0,k=0,t=0,kct1,kct2,a=0;
double hst1,hst2;

char*pr,*pt;
void write_value(int*x,int*y,char*s)
{
outtextxy(*x,*y,s);
*x+=textwidth(s);
}
void read_value(int*x,int*y,char*s)
{
int i=0;char ch[2];
ch[1]=0;
while(1)
{
ch[0]=getch();
if(ch[0]==Enter) break;
write_value(x,y,ch);
s[i]=ch[0];
++i;
}
s[i]=0;
}
int Nhap_kc_tau1()
{


int xt1=220,yt1=380;
char*st1;
read_value(&xt1,&yt1,st1);
return atoi(st1);
}
int Nhap_kc_tau2()

{
int xt2=220,yt2=435;
char*st2;
read_value(&xt2,&yt2,st2);
return atoi(st2);
}
double Nhap_hsss_tau1()
{
int xst1=470,yst1=380;
char*sst1;
read_value(&xst1,&yst1,sst1);
return atof(sst1);
}
double Nhap_hsss_tau2()
{
int xst2=470,yst2=435;
char*sst2;
read_value(&xst2,&yst2,sst2);
return atof(sst2);
}
void Data_in(void)
{
char ch;
setcolor(1);
kct1=Nhap_kc_tau1();
kct2=Nhap_kc_tau2();
hst1=Nhap_hsss_tau1();
hst2=Nhap_hsss_tau2();
//ch=getch();
//

if(ch==Enter) Run();
//
Run();
}
void ve_tau1(void)
{
setcolor(RED);
ellipse(100,50,0,360,20,8);
ellipse(100,46,190,357,20,6);
line(107,44,110,38);
circle(110,38,2);
line(93,44,90,38);
circle(90,38,2);
setfillstyle(SOLID_FILL,BLUE);
floodfill(101,54,RED);


setfillstyle(SOLID_FILL,MAGENTA);
floodfill(94,45,RED);
}
void ve_tau2(void)
{
setcolor(7);
ellipse(100,50,0,360,20,8);
ellipse(100,46,190,357,20,6);
line(107,44,110,38);
circle(110,38,2);
line(93,44,90,38);
circle(90,38,2);
setfillstyle(SOLID_FILL,GREEN);

floodfill(101,54,7);
setfillstyle(SOLID_FILL,13);
floodfill(94,45,7);
}
void tau2_cd(void)
{
if(j<1)
putimage(50,170,pr,XOR_PUT);
j=j+1;
if(j>1)
putimage(xr,yr,pr,XOR_PUT);
xr=50+kct2*(j-1);yr=170;
while(xr{
putimage(xr,yr,pr,XOR_PUT);
delay(500);
putimage(xr,yr,pr,XOR_PUT);
xr=xr+7;
if(xr>=540)
{
setcolor(15);
outtextxy(250,250,"Tau 2 chien thang");
putimage(xr,yr,pr,XOR_PUT);
Win();
putimage(xr,yr,pr,XOR_PUT);
}
if(xr>=kct2*j+50)
putimage(xr,yr,pr,XOR_PUT);
}
}

void tau1_cd()
{
if(k<1)
putimage(50,250,pt,XOR_PUT);
k=k+1;
if(k>1)
putimage(xt,yt,pt,XOR_PUT);


xt=50+kct1*(k-1);yt=250;
while(xt{
putimage(xt,yt,pt,XOR_PUT);
delay(200);
putimage(xt,yt,pt,XOR_PUT);
xt=xt+10;
if(xt>=540)
{
setcolor(15);
outtextxy(250,250,"Tau 1 chien thang");
putimage(xt,yt,pt,XOR_PUT);
Win();
putimage(xt,yt,pt,XOR_PUT);
}
if(xt>=kct1*k+50)
putimage(xt,yt,pt,XOR_PUT);
}
}
/*void rua_tho_cd();
{

if(j<1)
putimage(50,200,pr,XOR_PUT);
j=j+1;
if(j>1)
putimage(xr,yr,pr,XOR_PUT);
if(k<1)
putimage(50,300,pt,XOR_PUT);
k=k+1;
if(k>1)
putimage(xt,yt,pt,XOR_PUT);
xr=50+70*(j-1);yr=200;
xt=50+98*(k-1);yt=300;
while((xr<70*j+50)&(xt<98*k+50))
{
putimage(xr,yr,pr,XOR_PUT);
delay(500);
putimage(xr,yr,pr,XOR_PUT);
xr=xr+7;
putimage(xt,yt,pt,XOR_PUT);
delay(200);
putimage(xt,yt,pt,XOR_PUT);
xt=xt+10;
if(xr==540)
{
setcolor(15);
outtextxy(250,250,"Rua chien thang");
putimage(xr,yr,pr,XOR_PUT);
Win();
putimage(xr,yr,pr,XOR_PUT);
}

if(xt==540)
{
setcolor(15);
outtextxy(250,250,"Tho chien thang");


putimage(xt,yt,pt,XOR_PUT);
Win();
putimage(xt,yt,pt,XOR_PUT);
}
if(xr>=70*j+50)
putimage(xr,yr,pr,XOR_PUT);
if(xt>=98*k+50)
putimage(xt,yt,pt,XOR_PUT);
}
} */
void Write_text(int x1, int y1,double x,char*s,int color)
{
gcvt(x,5,s);
setcolor(color);
outtextxy(x1,y1,s);
}
void button(int x1,int y1,int x2,int y2,int color,char s[],int color_s,int size)
{
setfillstyle(1,color);
bar(x1,y1,x2,y2);
setcolor(15);
setlinestyle(0,0,1);
line(x1,y1,x2,y1);
line(x1,y1,x1,y2);

setcolor(0);
line(x2,y2,x2,y1);
line(x2,y2,x1,y2);
settextjustify(1,1);
settextstyle(0,0,size);
setcolor(color_s);
outtextxy((x1+x2)/2,(y1+y2)/2,s);
}
void button1(int x1,int y1,int x2,int y2,int color)
{
setfillstyle(1,color);
bar(x1,y1,x2,y2);
setcolor(0);
setlinestyle(0,0,1);
line(x1,y1,x2,y1);
line(x1,y1,x1,y2);
setcolor(15);
line(x2,y2,x2,y1);
line(x2,y2,x1,y2);
}
void _line(int x1, int y1, int x2, int y2, int color)
{


setcolor(color);
line(x1,y1,x2,y1);
line(x2,y1,x2,y2);
line(x2,y2,x1,y2);
line(x1,y2,x1,y1);
}

void _line1(int x1, int y1, int x2, int y2)
{
setfillstyle(1,9);
bar(x1+1,y1+1,x2-1,y2-1);
setcolor(0);
line(x1,y1,x2,y1);
line(x1,y1,x1,y2);
line(x1+1,y2-1,x2-1,y2-1);
line(x2-1,y2-1,x2-1,y1+1);
setcolor(15);
line(x1+1,y1+1,x2-1,y1+1);
line(x1+1,y1+1,x1+1,y2-1);
line(x1,y2,x2,y2);
line(x2,y2,x2,y1);
}
void help()
{
int mh,mode;
mh=DETECT;mode=1;
initgraph(&mh,&mode,"..\\bgi");
setbkcolor(1);
cleardevice();
Reset_mouse();
Show_mouse();
_line(2,2,637,478,15);
_line(5,5,634,475,2);
_line(7,8,630,472,15);
_line(137,127,523,333,15);
_line(135,125,525,335,2);
settextstyle(7,0,1);

setcolor(5);
Hide_mouse();
button1(140,130,520,330,11);
setcolor(8);
settextjustify(0,0);
settextstyle(0,0,1);
outtextxy(146,150,"Phan mem mo phong va mo hinh hoa bai 2");
outtextxy(240,170,"Nhom sinh vien thiet ke:");
outtextxy(280,190,"Nguyen Le Hoa");
outtextxy(280,210,"Doan Phi Hung");
outtextxy(280,230,"Hoang Vu Hung");
outtextxy(280,250,"Lai Thien Hung");
outtextxy(165,270,"Phan mem duoc hoan thanh voi su giup do cua");
outtextxy(240,290,"PGS.TS Nguyen Cong Hien");
setcolor(12);


outtextxy(265,310,"-------***-------");
Show_mouse();
button(180,380,240,410,2,"Return",1,1);
button(420,380,480,410,2,"Exit",1,1);
while(1)
{
Click_mouse();
if(Win_mouse(180,380,240,410)==1&&Click_mouse()==1)
{
main_h();
}
if(Win_mouse(420,380,480,410)==1&&Click_mouse()==1)
{

exit(1);
}
}
}
void Run()
{
double n1;
int n,i=0,k=1;
//
a=a+50;
char*s;
//randomize();
while(xt<540 & xr<540&k)
{
k=0;
i=i+1;
n=rand() % 10;
n1=n*0.1;
Write_text(100+40*i,130,n1,s,1);
if((n1>hst1)&(n1<=hst2))
{
tau2_cd();
delay(1000);
}
// else
if(n1<=hst1)
{
tau1_cd();
tau2_cd();
delay(1000);

}
k=1;
}
}
void Win()
{
int x[1001],y[1001],k;
int i,n;
char*p[1001];
for(i=1;i<=1000;++i)
{
x[i]=random(getmaxx())-10;


y[i]=random(getmaxy())-10;
if(x[i]<0) x[i]=0;
if(y[i]<0) y[i]=0;
n=imagesize(x[i],y[i],x[i]+10,y[i]+10);
p[i]=(char*)malloc(n);
getimage(x[i],y[i],x[i]+10,y[i]+10,p[i]);
//

}
while(t<5)
do
{
for(i=1;i<=100;++i)
{
setfillstyle(SOLID_FILL,i%15+1);
pieslice(x[i]+5,y[i]+5,0,360,5);

}
delay(500);
for(i=100;i>=1;--i)
putimage(x[i],y[i],p[i],COPY_PUT);
delay(500);
t=t+1;
}

}
void main_h(void)
{
long *p;
int mh=0,mode=0;
int xmax ,ymax;
initgraph(&mh,&mode,"..\\bgi ");
Hide_mouse();
ve_tau2();
Show_mouse();
nt=imagesize(79,36,121,59);
pt=(char*)malloc(nt);
getimage(79,36,121,59,pt);
Hide_mouse();
ve_tau1();
Show_mouse();
randomize();
nr=imagesize(79,36,121,59);
pr=(char*)malloc(nr);
getimage(79,36,121,59,pr);
cleardevice();
Reset_mouse();

setfillstyle(1,3);
xmax=getmaxx();
ymax=getmaxy();
bar(0,0,xmax,ymax);
Show_mouse();


_line(2,2,637,478,15);
_line(5,5,634,475,13);
_line(7,8,630,472,15);
setcolor(RED);
_line(50,150,53,300,15);
//outtextxy(50,40,"Gia tri ngau nhien nhan duoc:");
//outtextxy(50,20,"Click Run button to create a random number");
_line(580,150,583,300,RED);
setcolor(RED);
outtextxy(30,130,"START");
outtextxy(560,130,"FINISH");
outtextxy(180,110,"Gia tri ngau nhien nhan duoc");
setcolor(15);
outtextxy(60,150,"Tau2");
outtextxy(60,230,"Tau1");
/*--Vung chuc nang---*/
Show_mouse();
_line1(15,350,619,465);
_line1(15,17,619,100);
button(50,45,100,75,2,"Help",1,1);
button(170,45,220,75,2,"Run",1,1);
button(290,45,340,75,2,"Reset",1,1);
button(410,45,460,75,2,"Data",1,1);

button(530,45,580,75,2,"Exit",1,1);
/*--Vung vao du lieu--*/
setcolor(15);
outtextxy(150,380,"KC_tau 1:");
outtextxy(150,435,"KC_tau 2:");
outtextxy(400,380,"Hsss_tau 1:");
outtextxy(400,435,"Hsss_tau 2:");
button1(200,370,250,390,15);
button1(200,425,250,445,15);
button1(450,370,500,390,15);
button1(450,425,500,445,15);
button1(100,120,540,140,15);
putimage(50,250,pt,XOR_PUT);
putimage(50,170,pr,XOR_PUT);
while(1)
{
Click_mouse();
if( Win_mouse(50,45,100,75)==1&&Click_mouse()==1)
{
help();
}
if( Win_mouse(170,45,220,75)==1&&Click_mouse()==1)
{
Run();
}


if( Win_mouse(290,45,340,75)==1&&Click_mouse()==1)
{
main_h();

}
if( Win_mouse(410,45,460,75)==1&&Click_mouse()==1)
{
Data_in();
}
if( Win_mouse(530,45,580,75)==1&&Click_mouse()==1)
{
exit(1);
}
}
}
void main()
{
main_h();
}

8. Kết quả mô phỏng


9. Nhận xét và bình luật kết quả.
Ta nhận thấy với một khoảng cách chuyển động cho trước thì quá trình
gieo số ngẫu nhiên thì tuỳ thuộc vào độ sẵn sàng của từng tầu mà xác định được
số lần chuyển động của mỗi tàu. Ta có thê thay đổi các thông số đầu vào để xác
suất Tàu 2 thắng nhiều hơn tàu 1.
10. Tài liệu tham khảo.
1. Giáo trình Mơ hình hố hệ thống và mơ phỏng-PGS.TS Nguyễn Cơng Hiền
2. Ngơn ngữ lập trình C- Phạm Văn ất.




×