3.2.1. Phát biểu bài toán
Tại Thành phố Hải Phòng, trong năm 2015 có đƣa ra đề án xây dựng sân bay tại Huyện Thủy Nguyên nhằm phát triển hệ thống giao thông hàng không và phát triển nền kinh tế Thành Phố, đặc biệt là phát triển kinh tế của Huyện. Sau khi thống nhất quyết định thực hiện đề án và mời thầu.
Để thắng thầu thì nhà thầu phải đƣa ra một phƣơng án khoa học với giá trị gói thầu dự án thích hợp. Một trong những yếu tố quyết định tính khoa học và giá trị của gói thầu đó là chọn địa điểm xây dựng sân bay sao cho trên vùng đi ̣a hình cho sẵn của Huyê ̣n hãy tìm ra vùng diện tích lớn nhất, bằng phẳng là hình chữ nhật để tiết kiệm chi phí san lấp mặt bằng.
3.2.2. Mô tả dƣ̃ liê ̣u
Bài toán đƣợc ra trên vùng địa hình có những vùng bằng phẳng khác nhau nếu ta tìm đƣợc mô ̣ t vùng có diê ̣n tích lớn nhất và bằng phẳng nhất theo hình chƣ̃ nhâ ̣t để xây dƣ̣ng s ân bay thì bài toán đƣợc đáp ứng sẽ giảm đáng kể nhƣ̃ng chi phí cho công việc xây dựng . Đồng thời không ảnh hƣởng nhiều đến nhƣ̃ng quy hoa ̣ch vù ng lân câ ̣n , không tốn kém cho viê ̣c san lấp mă ̣t bằng.
50
Sau khi khảo sát bằng các biện pháp nghiệp vụ thực nghiệm đo đạc độ cao bài toán đƣa về có đ ầu vào là một ma trận A kích thƣớc n x m, giá trị trong ô A[i,j] (với i = 1 .. n, j = 1 .. m) là độ cao tƣơng ứng với vị trí đo đƣợc trên địa hình. Đầu ra là một ma trận con lớn nhất có độ cao bằng nhau.
- Input: Tệp SANBAY.INT gồm:
+ Dòng đầu chứa 2 số nguyên n và m
+ n dòng sau, mỗi dòng chứa m số nguyên cách nhau dấu cách.
- Output: Tệp SANBAY.OUT gồm:
+ Dòng đầu là diện tích hình chữ nhật lớn nhất bằng phẳng + Dòng 2 tọa độ đỉnh trên bên trái của hình chữ nhật.
+ Dòng 3 là tọa độ đỉnh dƣới bên phải của hình chữ nhật tìm đƣợc.
3.2.3. Thiết kế cá c bƣớc thƣ̣c hiê ̣n
Bước 1:
Khảo sát địa h ình lấy giá tri ̣ thực địa số liệu thể hiện là ma trận mà giá trị các ô trong ma trận thể hiện độ cao tƣơng ứng đo đƣợc tại vị trí đó.
Ví dụ từ một vùng địa hình khảo sát (Hình 3.4)
Hình 3.4: Vùng địa hình khảo sát xây dựng sân bay
Ta có ma trận thể hiện độ cao tƣơng ứng nhƣ sau: 1 2 2 2 2 3
1 2 2 4 3 3 1 4 4 4 3 3 2 4 4 4 3 3 2 4 4 4 2 2 2 3 2 3 2 1 1 1 2 2 2 5 1 1 2 3 2 5
Hình 3.5: Ma trận số nguyên thể hiê ̣n theo độ cao vùng đi ̣a hình
Bước 2:
Lƣu toàn bộ các giá trị khác nhau trong ma trận (các độ cao đo đƣợc tại địa hình) vào mảng một chiều (mảng B), ta đƣợc:
B 1 2 3 4 6 1 2 3 4 5
So với bài toán tìm hình chữ nhật tối đại chứa toàn số 1 trong ma trận chỉ chứa hai giá trị 0 và 1 ở chƣơng 2 thì bài toán này đầu vào là một ma trận chứa nhiều giá trị hơn. Vấn đề đặt ra là tìm cách đƣa bài toán về bài toán đầu vào là một ma trận chỉ chứa 2 loại giá trị 0 và 1 để tìm ra diện tích hình chữ nhật lớn nhất chứa toàn 1?
Bước 3:
Xét giá trị đầu tiên trong mảng chứa độ cao B là B[1] = 1 (độ cao đầu tiên = 1).
Ta thay hết các ô trên ma trận A đầu vào có giá trị bằng độ cao đang xét là 1, ngƣợc lại các ô có giá trị không bằng độ cao đang xét ta thay giá trị là 0. Lúc này đầu vào của bài toán trở về dạng ma trận chỉ chứa 2 giá trị 0 và 1.
1 0 0 0 0 0 1 0 0 0 0 0
52 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0
Gọi chƣơng trình tính diện tích hình chữ nhật tối đại chứa toàn số 1 ở chƣơng 2 để thực hiện. Ta sẽ thu đƣợc hình chữ nhật tối đại của độ cao đang xét. 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0
Lúc này quy về bài toán ban đầu ta tìm đƣợc hình chữ nhật tối đại của độ cao đang xét (độ cao = 1).
1 2 2 2 2 3 1 2 2 4 3 3 1 4 4 4 3 3 2 4 4 4 3 3 2 4 4 4 2 2 2 3 2 3 2 1 1 1 2 2 2 6 1 1 2 3 2 6
Tạm thời coi diện tích tối đại này là diện tích hình chữ nhật lớn nhất có địa hình bằng phẳng cần tìm của bài toán.
Smax = Smax(B[1]) = 4
Tọa độ đỉnh trên – trái là (1,7) và đỉnh dƣới – phải là (2,8).
Tƣơng tự, lần lƣợt xét tiếp các độ cao tiếp theo trong mảng B cho đến hết. Ta sẽ thu đƣợc hình chữ nhật tối đại của các độ cao tƣơng ứng:
Với độ cao B[2] = 2 ta đƣợc Smax(B[2]) = 5
1 2 2 2 2 3 1 2 2 4 3 3 1 4 4 4 3 3 2 4 4 4 2 3 2 4 4 4 2 2 2 3 2 3 2 1 1 1 2 2 2 6 1 1 2 3 2 6
Ta so sánh với Smax(B[2]) với Smax, nếu Smax(B[2]) > Smax thì ta thay giá trị Smax = Smax(B[2]) và lƣu lại đỉnh trên - trái mới (5,4) và đỉnh dƣới - phải (5,8), trong trƣờng hợp ngƣợc lại Smax(B[2]) <= Smax ta sẽ giữ không thay đổi gì.
Với độ cao B[3] = 3 ta đƣợc Smax(B[3]) = 4
1 2 2 2 2 3 1 2 2 4 3 3 1 4 4 4 3 3 2 4 4 4 2 3 2 4 4 4 2 2 2 3 2 3 2 1 1 1 2 2 2 6 1 1 2 3 2 6
So sánh Smax(B[3]) với Smax ta thấy Smax(B[3]) < Smax nên Smax giữ nguyên.
Với độ cao B[4] = 4 ta đƣợc Smax(B[4]) = 9:
1 2 2 2 2 3 1 2 2 4 3 3 1 4 4 4 3 3 2 4 4 4 2 3 2 4 4 4 2 2
54
1 1 2 2 2 6 1 1 2 3 2 6
Ta so sánh với Smax(B[4]) với Smax, ta thấy Smax(B[4]) > Smax vậy thay giá trị Smax = Smax(B[4]) = 9 và lƣu lại đỉnh trên - trái là (2,3) và đỉnh dƣới - phải là (4,5).
Với độ cao B[5] = 6 ta đƣợc Smax(B[5]) = 2:
1 2 2 2 2 3 1 2 2 4 3 3 1 4 4 4 3 3 2 4 4 4 2 3 2 4 4 4 2 2 2 3 2 3 2 1 1 1 2 2 2 6 1 1 2 3 2 6
So sánh Smax(B[5]) với Smax ta thấy Smax(B[5]) < Smax nên Smax giữ nguyên.
Bƣớc 5:
Ghi nhận kết quả diện tích hình chữ nhật bằng phẳng lớn nhất là Smax = 9 và đỉnh trên - trái (2,3), đỉnh dƣới - phải (4,5). Tƣ̀ kết quả tìm đƣơ ̣c ta quy đổi thành diê ̣n tích lớn nhất trên vùng đi ̣a hình ƣ́ng với tỉ lê ̣ bản đồ cụ thể.
3.3. Bài toán: Tính thể tích chứ a nƣớ c cho mô ̣t lòng hồ 3.3.1. Phát biểu bài toán
Xuất phát từ bài toán xả lũ của các nhà máy thủy điện do không tính đƣơ ̣c lƣơ ̣ng nƣớc chƣ́a của các hồ vùng ha ̣ lƣu nên đã xảy ra rất nhiều nhà máy thủy điện xả lũ gây thiệt hại cho bà con sinh sống ở vùng hạ lƣu. Vậy vấn đề đặt ra là phải xả lũ có lƣợng nƣớc thế nào để đảm bảo đúng tính chất điều tiết lƣơ ̣ng nƣớc phù hợp không gây thiệt hại cho ngƣời dân sống
ở vùng hạ lƣu, không ảnh hƣởng đến viê ̣c tƣới tiêu cây trồng và đảm bảo cung cấp nƣớc cho sinh hoa ̣t cũng nhƣ công tác thủy lợi . Để giải quyết vấn đề trên con ngƣời cầ n phải tính chính là bài toán tính đƣợc lƣợng nƣớc (tƣơng đối ) chƣ́ a của lòng hồ phía dƣới đập xả lũ . Trong bài toán này cần lƣu ý đến khả năng gây loang , các vị trí loang của nƣớc là vùng mà nƣớc chảy qua để thoát ra ngoài vùng địa hình đang xét, nếu lƣợng nƣớc quá lớn sẽ dẫn đến lũ lụt tức thời (tại một thời điểm do lƣợng nƣớc quá lớn tràn qua lối thoát hẹp thì mực nƣớc dâng lên gây lũ lụt tức thời). Từ đó đƣa phƣơng án xả nƣớc trong hồ hợp lí tránh gây thiệt hại cho ngƣời dân trong vùng.
3.2.2. Mô tả dƣ̃ liê ̣u
Bài toán đƣợc đặt ra trên một vùng diện tích nhất định nơi xây dựng đập thủy điện, trong đó gồm các dãy núi có nƣớc đổ dồn về hồ chứa nƣớc thủy điện và hồ tự nhiên trong vùng. Ta sẽ quy bài toán này về bài toán tính thể tích vùng nƣớc đo ̣ng tƣơng ƣ́ng với bài toán chƣ́a nƣớc của mô ̣t lòng hồ. Bằng các biện pháp nghiệp vụ sau khi thực nghiệm đo đạc độ cao các ngọn núi, quả đồi và những đảo nhỏ trong khu vƣ̣c hồ nƣớc . Ta sẽ biểu diễn đƣợc nó trên mô hình của bài toán tính thể tích vùng nƣớc ngập bằng cách chia thành từng lƣới ô vuông bằng nhau tƣơng ứng với một ma trận , mỗi ô trong ma trận biểu diễn một đô ̣ cao có vị trí tƣơng ứng . Chiều cao các ngọn núi, quả đồi, đảo nhỏ đƣợc biểu diễn bằng độ cao khác nhau, khi đó bài toán trở về bài toán tính thể tích vùng nƣớc đo ̣ng.
Đầu vào là một ma trận A kích thƣớc m x n tƣơng úng với ma trâ ̣n lƣới ô vuông vùng đi ̣a hình có hồ , giá trị trong ô A[i,j] (với i=1..m, j = 1..n) là độ cao tƣơng ứng với vị trí đo đƣợc trên địa hình. Đầu ra là thể tích chứa nƣớc trong lòng hồ.
56
(Phần tử thứ j trên dòng i trong số m dòng tiếp theo là chiều cao của cột đặt tại ô (i, j).
- Output: Thể tích chứa nƣớc trong lòng hồ .
3.3.3. Thiết kế cá c bƣớc thƣ̣c hiê ̣n
Bước 1:
Khảo sát địa hình lấy giá trị thực địa số liệu thể hiện là ma trận mà giá trị các ô trong ma trận thể hiện độ cao tƣơng ứng đo đƣợc trên địa hình. Chiều cao các ngọn núi , quả đồi, đảo nhỏ đƣợc biểu diễn bằng độ cao khác nhau.
Ví dụ từ một vùng địa hình khảo sát (Hình3.6):
Ta có ma trận thể hiện độ cao tƣơng ứng nhƣ sau: 35 33 32 29 28 32 33 35 25 28 12 6 0 0 26 31 20 30 0 0 0 0 22 32 12 29 0 0 0 0 12 29 28 27 0 0 18 0 6 29 35 0 0 0 22 0 12 31 35 0 6 0 6 0 15 32 37 16 12 8 0 0 17 35 36 19 11 7 15 0 19 33 37 28 5 3 11 5 31 34 38 36 35 32 33 34 35 37
Hình 3.7: Ma trận số nguyên theo độ cao vùng có hồ
Bước 2:
Tƣ̀ số liê ̣u ma trâ ̣n (các độ cao đo đƣợc tại địa hình) chuyển vào tê ̣p dƣ̃ liê ̣u vào (tê ̣p: THETICH1.INP):
+ Dòng đầu chƣ́ a 2 số nguyên dƣơng m và n.
+ Phần tử thứ j trên dòng i trong số m dòng tiếp theo là chiều cao của cột đặt tại ô (i, j).
58
Chạy thực nghiệm bằng chƣơng trình THETICH .PAS
Bước 4:
Ghi nhâ ̣n kết quả lƣu ra tê ̣p THETICH 1.OUT
Tƣ̀ kết quả trên ta tính đƣợc thể tích chứa nƣớc trong lòng hồ tƣơng ứng với tỉ lệ đƣơ ̣c quy đổi.
3.4. Cài đặt chƣơng trình
(Cài đặt chương trình cho một số bài toán bằng ngôn ngữ Turbo pascal 7.0; Free pascal:)
3.4.1. Chƣơng trình tính diện đa giác theo tọa độ đỉnh
Uses math; Const finp='dagiac.inp'; fout='dagiac.out'; var fi,fo:text; x,y:array[1..1000] of longint; n,i:integer; t1,t2:longint; s:real; procedure docdl; begin assign(fi,finp); reset(fi); read(fi,n);
for i:=1 to n do read(fi,x[i],y[i]); close(fi); end; procedure xuli; begin t1:=x[n]*y[1]; t2:=y[n]*x[1]; for i:=1 to n-1 do begin t1:=t1+x[i]*y[i+1]; t2:=t2+y[i]*x[i+1]; end; s:=abs(t1-t2)/2; end; procedure ghikq; begin assign(fo,fout); rewrite(fo); write(fo,s:8:2); close(fo); end; begin docdl; xuli; ghikq; end.
3.4.2. Chƣơng trình tìm diện tích hình chữ nhật tối đại
Uses math;
Const finp='cnmax.inp';//cnmax.inp'; fout='cnmax.out';//cnmax.out'; Var fi,fo:text;
m,n,d :longint;
l,r,h,a :array[0..1001,0..70] of longint; s,smax,yt,yd,xtr,xph:longint; Procedure docdl; var i,j:longint; begin assign(fi,finp);reset(fi); readln(fi,n,m);
60 for i:=1 to n do begin for j:=1 to m do read(fi,a[i,j]); readln(fi); end; close(fi); end; Procedure xulicanh; var i,j,k:longint; begin for i:=1 to n do for j:=1 to m do
if a[i,j]=0 then h[i,j]:=0 else h[i,j]:=h[i-1,j]+1;
for i:= 1 to n do for j:=1 to m do
if a[i,j]=0 then l[i,j]:=0 else
begin
d:=0;
for k:=1 to j do if (a[i,k]=1) and (h[i,k]>=h[i,j]) then inc(d)
else d:=0; l[i,j]:=d; end;
for i:=1 to n do
for j:=m downto 1 do
if a[i,j]=0 then l[i,j]:=0 else
begin
d:=0;
for k:=m downto j do if (a[i,k]=1) and (h[i,k]>=h[i,j]) then inc(d)
else d:=0; r[i,j]:=d; end;
procedure xuli; var i,j:longint; begin Smax:=0; for i:=1 to n do for j:=1 to m do begin S:=h[i,j]*(l[i,j]+r[i,j]-1); if s> smax then begin smax:=s; yt:=i+1-h[i,j]; xtr:=j+1-l[i,j]; yd:=i; xph:=xtr+(l[i,j]+r[i,j]-1)-1; end; end; end; procedure ghikq; begin assign(fo,fout); rewrite(fo); writeln(fo,smax); writeln(fo,xtr,' ',yt); writeln(fo,xph,' ',yd); close(fo); end; Begin docdl; xulicanh; xuli; ghikq; end.
3.4.3. Chƣơng trình tính thể tích vùng nƣớc đo ̣ng
Program MODEL; Uses math;
Const finp='thetich.inp'; fout='thetich.out';
62
Var fi,fo:text;
m,n,res,hmin,hmax,h,count :longint;
a,free :array[0..1001,0..1001] of longint;
Procedure Docdl; var i,j :longint; begin assign(fi,finp); reset(fi); read(fi,m,n); hmin:=100000000; hmax:=0; for i:=1 to m do for j:=1 to n do begin read(fi,a[i,j]); hmin:=min(hmin,a[i,j]); hmax:=max(hmax,a[i,j]); end; close(fi); end;
Procedure LOANG(x,y: longint); //Loang begin free[x,y]:=count; if (x>1)and(free[x-1,y]<count)and(a[x-1,y]<=h) then LOANG(x-1,y); if (y>1)and(free[x,y-1]<count)and(a[x,y-1]<=h) then LOANG(x,y-1); if (x<m)and(free[x+1,y]<count)and(a[x+1,y]<=h) then LOANG(x+1,y); if (y<n)and(free[x,y+1]<count)and(a[x,y+1]<=h) then LOANG(x,y+1); end; Procedure xuli; var i,j :longint; begin
res:=0;
for h:=hmin to hmax-1 do begin
// Cac o co chieu cao <h thi coi nhu duoc dong bang cao =h
for i:=1 to m do begin if (a[i,1]<=h)and(free[i,1]<count) then LOANG(i,1); if (a[i,n]<=h)and(free[i,n]<count) then LOANG(i,n); end; for j:=2 to n-1 do begin if (a[1,j]<=h)and(free[1,j]<count) then LOANG(1,j); if (a[m,j]<=h)and(free[m,j]<count) then LOANG(m,j); end; for i:=1 to m do for j:=1 to n do if (free[i,j]<count)and(a[i,j]<=h) then inc(res); end; end; procedure ghikq; begin assign(fo,fout); rewrite(fo); write(fo,res); close(fo); end; BEGIN Docdl; xuli; ghikq; END.
64
KẾT LUẬN
Trong luận văn học viên đã tập trung nghiên cứu, trình bày những kiến thức cơ bản về ba thuâ ̣t toán cơ bản và ứng dụng của các thuật toán vào việc giải một số bài toán trong thƣ̣c tế . Qua đó luận văn đã đạt đƣợc một số kết quả nhƣ sau:
Về lý thuyết:
Luâ ̣n văn đã khái quát về mô ̣t số cách tiếp câ ̣n để tính diê ̣n tích và thể tích vâ ̣t thể với các hình đă ̣c biê ̣t . Trong đó l uận văn tập trung nghiên cứu ba thuâ ̣t toán cơ bản : Thƣ́ nhất là thuâ ̣t toán tính diện tích đa giác theo tọa độ đỉnh , thƣ́ hai là thuật toán tìm hình chữ nhật tối đại trong ma trận chƣ́a các kí tƣ̣ 0 và 1và thứ ba là thuâ ̣t toán tính thể tích nƣớc đo ̣ng.
Về ứng dụng
Luận văn đã phân tích và cài đặt các bƣ ớc cho bài toán ứng dụng trong thực tế trên mô ̣t vùng đi ̣a hình . Bài toán dụng thứ nhất là tìm vùng diê ̣n tích phẳng hình chƣ̃ nhâ ̣t lớn nhất trên mô ̣t vùng đi ̣a hình (Bài toán : Dƣ̣ án xây dƣ̣ng sân bay ), bài toán ứng dụng thứ hai là tính thể tích chứa nƣớc cho mô ̣t lòng hồ .
Phạm vi và khả năng áp dụng
Luận văn là một tài liệu tham khảo tốt cho lớp các bài toán về tính diê ̣n tích và thể tích . Luâ ̣n văn cũng rất hƣ̃u ích cho lĩnh vƣ̣c xây dƣ̣ng cần xác định mô ̣t miền diê ̣n tích phẳng lớn nhất và cho lĩnh vƣ̣c thủy lợi , địa chất khi cần xác đi ̣nh thể tích khối đi ̣a hình .
Hướng nghiên cứu tiếp theo
Nghiên cƣ́u và t ối ƣu hóa các thuật toán để giảm bớt độ phức tạp tính toán cho các thuâ ̣t toán nêu trên . Đồng thời bổ sung và mở rộng kh ả năng áp dụng các bài toán thƣờng gă ̣p trong thƣ̣c tế nhƣ trong lĩnh vƣ̣c y tế .
TÀI LIỆU THAM KHẢO Tiếng Việt
[1] Đặng văn Đức (2001), Hệ thống thông tin địa lý, NXB Khoa học và kỹ thuật, Hà Nội.
[2] Nguyễn Xuân Huy (2010), Sáng tạo trong thuật toán và lập trình với C#, Pascal, NXB Khoa học tự nhiên và Công nghệ, Tập 1, 2, 3.
[3] Lê Minh Hoàng (2002), Giải thuật và lập trình, Đại ho ̣c sƣ pha ̣m Hà Nô ̣i.
[4] Đỗ Xuân Lôi (2006), Cấu trúc dữ liệu và giải thuật, NXB Đại học
quốc gia Hà Nội.
[5] Murray Bourne, Biên dịch: Võ Hoàng Trọng (2014), Đạo hàm tích phân ứng dụng được gì, Đại học Quốc gia TP. Hồ Chí Minh.
[6] https://vi.wikipedia.org/wiki
Tiếng Anh
[7] Carola Giedion-Welcker (2006), An Evolution in Volume and Space, Wittenborn.
[8] Steve S.Skiena (2008), The Algorithm Design Manual, Department
of Computer Science State University of New York.
66
PHỤ LỤC
Mô ̣t số test (kiểm thƣ̉) cho các thuật toán chƣơng 2 1.Test cho chƣơng trình tính diê ̣n tí ch đa giác theo to ̣a đô ̣ đỉnh
Test 1 – Dƣ̃ liê ̣u vào
Test 1 – Dƣ̃ liê ̣u ra
Test 2 – Dƣ̃ liê ̣u ra
68
Test 1 – Dƣ̃ liê ̣u vào
Test 1 – Dƣ̃ liê ̣u ra