1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO CÁO THỰC TẬP-QUY HOẠCH ĐỘNG

36 206 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 36
Dung lượng 251,96 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trong phần đề tài này nhóm chúng em sẽ trình bày về phương pháp quy hoach động.Tuy nhiên nhóm chúng em không thể trình bày một cách hoàn chỉnh về quy hoạch động mà chỉ giới thiệu về phươ

Trang 1

Trong phần đề tài này nhóm chúng em sẽ trình bày về phương pháp quy hoach động.Tuy nhiên nhóm chúng em không thể trình bày một cách hoàn chỉnh về quy hoạch động mà chỉ giới thiệu về phương pháp, cách dùng quy hoạch động để thiết kế một số kĩ thuật giải cho một số bài toán và làm rõ hơn tính ưu việt của kĩ thuật Bottom-up.Và mong rằng sau bài báo cáo này, các bạn sẽ yêu thích giải thuật này hơn.

Do thuật toán quy hoạch động chúng em mới được tiếp xúc lần đầu và quy hoạch động là thuật toán còn khá mới đối với sinh viên chúng em nên chắc chắn sẽ không thể nào tránh khỏi những sai sót và có những phần chưa đạt yêu cầu Chúng em rất mong nhận được ý kiến đóng góp của cô và các bạn để có thể hoàn chỉnh nội dung cho những lần làm bài tiếp!

Trang 2

CHƯƠNG I.TỔNG QUAN VỀ QUY HOẠCH ĐỘNG

ba bước:

+Chia bài toán thành các bài toán con nhỏ hơn

+Giải các bài toán này một cách tối ưu bằng cách sử dụng đệ quy quy trình ba bước này

+Sử dụng các kết quả tối ưu đó để xây dựng một lời giải tối ưu cho bài toán ban đầu

Các bài toán con được giải bằng cách chia chúng thành các bài toán nhỏ hơn, và cứ tiếp tục như thế, cho đến khi ta đến được trường hợp đơn giản dễ tìm lời giải

hình1

Hình1: Sơ đồ bài toán con cho dãy Fibonacci, mô tả quan hệ giữa các bài toán

con gối nhau Nói rằng một bài toán có các bài toán con trùng nhau có nghĩa

Trang 3

là mỗi bài toán con đó được sử dụng để giải nhiều bài toán lớn hơn khác nhau

Ví dụ, trong dãy Fibonacci, F3 = F1 + F2 và F4 = F2 + F3, khi tính mỗi số đều phải tính F2 Vì tính F5 cần đến cả F3 và F4, một cách tính F5 có thể sẽ phải tính F2 hai lần hoặc nhiều hơn Điều này áp dụng mỗi khi có mặt các bài toán con gối nhau: Một cách tiếp cận “ngây thơ” có thể tốn thời gian tính toán lại lời giải tối ưu cho các bài toán con mà nó đã giải

Để tránh việc đó, ta lưu trữ lời giải của các bài toán con đã giải Do vậy, nếu sau này ta cần giải lại chính bài toán đó, ta có thể lấy và sử dụng kết quả

đã được tính toán Hướng tiếp cận này được gọi là lưu trữ (trong tiếng Anh được gọi là memoization, không phải memorization, dù từ này cũng hợp

nghĩa) Nếu ta chắc chắn rằng một lời giải nào đó không còn cần thiết nữa, ta

có thể xóa nó đi để tiết kiệm không gian bộ nhớ Trong một số trường hợp, ta còn có thể tính lời giải cho các bài toán con mà ta biết trước rằng sẽ cần đến

Tóm lại, quy hoạch động sử dụng:

+ Các bài toán con gối nhau

+ Cấu trúc con tối ưu

*Quy hoạch động thường dùng một trong hai cách tiếp cận:

+ Top-down (Từ trên xuống): Bài toán được chia thành các bài toán con, các bài toán con này được giải và lời giải được ghi nhớ để phòng trường hợp cần dùng lại chúng Đây là đệ quy và lưu trữ được kết hợp với nhau + Bottom-up (Từ dưới lên): Tất cả các bài toán con có thể cần đến đều được giải trước, sau đó được dùng để xây dựng lời giải cho các bài toán lớn hơn Cách tiếp cận này tốt hơn về không gian bộ nhớ dùng cho ngăn xếp và số lời gọi hàm Tuy nhiên, đôi khi việc xác định tất cả các bài toán con cần thiết cho việc giải quyết bài toán cho trước không được trực giác lắm

Trang 4

CHƯƠNG II.MỘT SỐ KIẾN THỨC CHUNG

1 Phương pháp quy hoạch động :

Có những bài toán mà quyết định ở bước thứ i phụ thuộc vào quyết định ở các bước trước đó Nếu ta xác định được hệ thức diễn đạt mối tương quan của quyết đinh ở bước thứ i với quyết định ở bước trước đó thì ta có thể triển khai chương trình theo hệ thức đã tìm được

Khi đó việc giải các bài toán có kích thước lớn sẽ được chuyển về việc giải các bài toán cùng kiểu có kích thước nhỏ hơn.Các thuật toán này thường được thể hiện bằng các chương trình con đệ quy.Tuy nhiên, với kỹ thuật chia để trị thì nhiều bài toán con phải tính lại nhiều lần

Vậy ý tưởng cơ bản của quy hoạch động đó là: Tránh tính toán lại các bài toán con nhiều lần, mà lưu giữ kết quả đã tìm kiếm được vào một bảng làm giá trị giả thiết cho việc tìm kết quả của trường hợp sau Chúng ta sẽ lấp đầy dần các giá trị của bảng này bởi các kết quả của những trường hợp trước đã được giải Kết quả cuối cùng chính là kết quả của bài toán cần giải.Cụ thể như sau:

Phương pháp quy hoạch động cùng nguyên lý tối ưu được nhà toán học

Mỹ R.Bellman đề xuất vào những năm 50 của thế kỷ 20 Phương pháp này đã được áp dụng để giải hàng loạt bài toán thực tế trong các quá trình kỹ thuật của công nghệ, tổ chức sản xuất, kế hoạch hoá kinh tế… Tuy nhiên cần lưu ý rằng có một số bài toán giải bằng quy hoạch động tỏ ra không thích hợp

Trong thực tế, ta thường gặp một số bài toán tối ưu loại sau: Có một đại lượng g hình thành trong một quá trình gồm nhiều giai đoạn và ta chỉ quan tâm đến kết quả cuối cùng là giá trị của g phải lớn nhất hoặc nhỏ nhất, ta gọi chung là giá trị tối ưu của g Giá trị của g phụ thuộc vào những đại lượng xuất hiện trong bài toán mà mỗi bộ giá trị của chúng được gọi là một trạng thái của

Trang 5

hệ thống và cũng phụ thuộc vào cách thức đạt được giá trị g trong từng giai đoạn mà mỗi cách thức được gọi là điều khiển Đại lượng g thường được gọi

là hàm mục tiêu và quá trình đạt được giá trị tối ưu của g được gọi là quá trình điều khiển tối ưu

Bellman phát biểu nguyên lý tối ưu (cũng gọi là nguyên lý Bellman) mà

ý tưởng cơ bản là như sau: "Với mỗi quá trình điều khiển tối ưu, đối với trạng thái ban đầu A0, với mọi trạng thái A trong quá trình đó, phần quá trình kể từ trạng thái A xem như trạng thái bắt đầu cũng là tối ưu"

Chú ý rằng nguyên lý này được thừa nhận mà không chứng minh

Phương pháp tìm điều khiển tối ưu theo nguyên lý Bellman thường được

gọi là quy hoạch động Thuật ngữ này nói lên thực chất của quá trình điều

khiển là động:Có thể trong số bước đầu tiên lựa chọn điều khiển tối ưu dường như không tốt nhưng chung cả quá trình lại là tốt nhất

Ta có thể giải thích ý này qua bài toán sau: Cho một dãy số nguyên

A1,A2,….An Hãy tìm cách xóa đi một số ít nhất số hạng để dãy còn lại là dãy đơn điệu hay nói cách khác hãy chọn một số nhiều nhất các số sao cho dãy B gồm các số hạng đó theo trình tự xuất hiện trong dãy A là đơn điệu

Quá trình chọn dãy B được điều khiển qua N giai đoạn để đạt được mục tiêu là số lượng số hạng của dãy B là nhiều nhất, điều khiển ở giai đoạn i thể hiện việc chọn hay không chọn dãy Ai vào dãy B

Giả sử dãy đã cho là 1 8 10 2 4 6 7 Nếu ta chọn lần lượt 1, 8, 10 thì chỉ chọn được 3 số hạng nhưng nếu bỏ qua 8 và 10 thì ta chọn được 5 số hạng 1,

2, 4, 6, 7

Khi giải một số bài toán bằng cách "chia để trị", chuyển việc giải bài toán kích thước lớn về việc giải nhiều bài toán cùng kiểu có kích thước nhỏ hơn thì các thuật toán này thường được thể hiện bằng các chương trình con đệ quy Khi đó, trên thực tế, nhiều kết quả trung gian phải được tính nhiều lần Nói các khác phương pháp quy hoạch động đã thể hiện sức mạnh của nguyên lý chia để trị đến cao độ

Trong một số trường hợp, khi giải một bài toán A, trước hết ta tìm họ bài toán A(p) phụ thuộc tham số p (có thể là một véc tơ) mà A(p0)=A với p0 là

Trang 6

trạng thái ban đầu của bài toán A Sau đó tìm cách giải họ bài toán A(p) với tham số p bằng cách áp dụng nguyên lý tối ưu của Bellman Cuối cùng cho p=p0 sẽ nhận được kết quả của bài toán A ban đầu

Các thuật ngữ dùng trong quy hoạch động:

Bài toán giải theo phương pháp quy hoạch động gọi là bài toán quy hoạch động.

Công thức phối hợp nghiệm của các bài toán con để có nghiệm của bài toán

lớn gọi là công thức truy hồi của quy hoạch động.Tập các bài toán có ngay lời

giải để từ đó giải quyết các bài toán lớn hơn gọi là cơ sở quy hoạch

động.Không gian lưu trữ lời giải các bài toán con để tìm cách phối hợp chúng

gọi là bảng phương án của quy hoạch động.

2 Các bước thực hiện quy hoạch động

Để giải bài toán bằng quy hoạch động, ta cần phải tiến hành các bước sau:

Bước 1: Lập hệ thức ( tìm nghiệm của bài toán con đơn giản và tìm ra

công thức xây dựng nghiệm của bài toán con thông qua nghiệm của các bài toán con cỡ nhỏ hơn)

Dựa vào nguyên lý tối ưu tìm cách chia quá trình giải bài toán thành từng giai đoạn, sau đó tìm hệ thức biểu diễn tương quan quyết định của bước xử lý với các bước đã xử lý trước đó Hoặc tìm cách phân rã bài toán thành các "bài toán con" tương tự có kích thước nhỏ hơn, tìm hệ thức nêu quan hệ giữa kết quả bài toán kích thước đã cho với các kết quả của các "bài toán con" cùng kiểu có kích thước nhỏ hơn của nó nhằm xây dựng công phương trình truy toán (dạng hàm hoặc thủ tục đệ quy)

*Cách xây dựng công thức truy toán: Ta chia việc giải bài toán thành n giai đoạn Mỗi giai đoạn i có trạng thái ban đầu là t(i) và chịu tác động điều khiển d(i) sẽ biến thành trạng thái tiếp theo t(i+1) của giai đoạn i+1 (i=1,2,…n-1) Theo nguyên lý tối ưu của Bellman thì việc tối ưu giai đoạn cuối cùng không làm ảnh hưởng đến kết quả toàn bài toán Với trạng thái ban đầu là r(n) sau khi làm giai đoạn n tốt nhất ta có trạng thái ban đầu của giai đoạn n-1 là t(n-1)

và tác động điều khiển của giai đoạn n-1 là d(n-1), ta có thể tiếp tục xét đến

Trang 7

giai đoạn n-1 Sau khi tối ưu giai đoạn n-1 ta lại có thể tiến hành tối ưu giai đoạn n-2… cho đến khi các giai đoạn từ n giảm đến 1 được tối ưu thì coi như hoàn thành bài toán Gọi giá trị tối ưu của bài toán tính đến giai đoạn k là Gk, giá trị tối ưu của bài toán tính riêng ở giai đoạn k là Tk thì Gk = Gk-1 + Tk

Bước 2: Tổ chức dữ liệu và chương trình.

Tổ chức dữ liệu sao cho đạt được các yêu cầu sau :

a.Dữ liệu được tính toán dần theo từng bước

b.Dữ liệu được lưu trữ để giảm lượng tính toán lặp lại

c.Kích thước miền nhớ dành cho lưu trữ dữ liệu càng nhỏ càng tốt, kiểu dữ liệu được chọn phù hợp, nên chọn đơn giản dễ truy cập

Cụ thể:

+ Các giá trị của Fk thường được lưu trữ trong một bảng (mảng một chiều hoặc hai v.v chiều)

+ Cần lưu ý khởi trị các giá trị ban đầu của bảng cho thích hợp, đó

là các kết quả của các bài toán con có kích cỡ nhỏ nhất của bài toán đang giải + Dựa vào công thức, phương trình truy toán và các giá trị đã có trong bảng để tìm dần đến các giá trị còn lại của bảng

+ Ngoài ra còn cần mảng lưu trữ nghiệm tương ứng với giá trị tối

ưu trong từng giai đoạn

+ Dựa vào bảng lưu trữ nghiệm và bảng giá trị tối ưu từng giai đoạn

đã xây dựng, tìm ra kết quả bài toán

Bước 3:Làm tốt

Làm tốt thuật toán bằng cách thu gọn hệ thức và giảm kích thước miền nhớ Thường dùng mảng một chiều thay cho mảng hai chiều nếu giá trị một dòng (hoặc cột) của mảng hai chiều chỉ phụ thuộc một dòng (hoặc cột) kề trước

Trong một số trường hợp có thể thay thế mảng hai chiều với các giá trị phần tử chỉ nhận giá trị 0,1 bởi mảng hai chiều mới dùng kỹ thuật quản lý bit Trong phần một số bài toán ví dụ chúng ta sẽ nghiên cứu để hiểu rõ hơn về quy hoạch động qua những bài toán cụ thể

Trang 8

CHƯƠNG III MỘT SỐ BÀI TOÁN VÍ DỤ

Giải thuật đệ quy để tính số tổ hợp chập k của n như sau:

function TH(n,k : integer) : Integer;

Trang 9

Nhận xét : Chỉ với 1 đa thức các bài toán con mà giải thuật trên có độ phức

tạp là hàm mũ Điều đó chứng tỏ rằng có những bài toán con được giải lại nhiều lần

*Để khắc phục tình trạng trên ta sử dụng kỹ thuật quy hoạch động như sau:

+Phân tích bài toán: Xây dựng hàm:

Function TH(n,k: integer): integer ; { k<=n}

+Giải pháp đệ quy: TH(n,k) = TH(n-1,k-1)+ TH(n-1,k)

+Lập bảng: xây dựng 1 bảng gồm (n+1) dòng từ 0 n và (n+1) cột từ 0 n và điền giá trị cho C(i,j) theo quy tắc tam giác pascal như sau:

C(0,0)=1

C(i,0)=1

C(i,i)=1 với 0<i<=n

C(i,j)=C(i-1,j-1)+C(i-1,j) với 0<j<i<=n)

TH(4,2)

TH(3,2)TH(3,1)

TH(2,1) TH(2,2)

TH(2,1)

TH(2,0)

Trang 10

function TH(n, k : Integer) : Integer

var C: array[0 m ax, 0 m ax] of integer;

Trang 11

n i i

n i

n i

+Tuy nhiên việc sử dụng bảng(mảng 2 chiều) như trên còn lãng phí ô

nhớ, do đó ta sẽ cải tiến thêm 1 bước bằng cách sử dụng vecto(mảng 1 chiều)

để lưu trữ kết quả trung gian

* giải thuật:

function TH(n, k : Integer) : Integer

var V: array[0 max] of integer;

Trang 12

var n,k,t,chon:integer; tl:char;

{******DUNG MANG 2 CHIEU******}

Trang 13

writeln('1.tinh theo cach dùng mảng 2 chiều ');

writeln('2 tinh theo cach dung vecto');

repeat

Trang 14

write('moi ban chon:');readln(chon);

Cho G=(V,E, W) là một đơn đồ thị có hướng có trọng số với mọi

cung(i,j), V={1,2 n} là tập các đỉnh, E là tập các các cung.Tìm đường đi ngắn nhất gữa mọi cặp đỉnh của đồ thị

b)Ý tưởng :

Nếu k nằm trên đường đi ngắn nhất từ i -> j thì đoạn từ i ->k và k ->j cũng phải ngắn nhất

Đường đi ngắn nhất giữa mọi cặp đỉnh trên đồ thị G= (V, E, W) được

biểu diễn bằng ma trận trọng số A với Aij là trọng số của cạnh (i, j)

A n xn = (a ij)nxn

Thuật toán thực hiện n bước lặp thay đổi ma trận a để cuối cùng Aij là

độ dài đường đi ngắn nhất từ v i →v j

Ở bước lặp k thì a ij : v i →v j là độ dài đường đi ngắn nhất từ v i →v j không qua mọi đỉnh lớn hơn k và ở bước lặp này ta đặt

a ij = min { a ij , a ik + a ki }

c)Thuật toán:

Trang 15

Dữ liệu đầu vào: Đồ thị cho bởi ma trận trọng số a(i,j), với i, j = 1, 2,…, nĐầu ra: :

+Ma trận đường đi ngắn nhất giữa mọi cặp đỉnh

D=[d(i,j)], trong đó d(i,j) là độ dài đường đi ngắn nhất từ i →jvới mọi cặp(i,j)

+Ma trận ghi nhận đường đi

P=[p(i,j)], trong đó P(i,j) ghi nhận đỉnh đi trước đỉnh j trong đường đi ngắn nhất từ i đến j

Trang 16

2 4

1

Với mọi cặp (i,j), i=1 n, j=1 n ta xét nếu như đường đi từ i đến j đang có lại dài hơn đường đi từ i tới k cộng với đường đi từ k tới j thì ta hủy bỏ đường

đi hiện thời và coi đường đi từ i đến j sẽ là nối giữa hai đường i →kk →j Tức là nếu dk-1(i,j)>dk-1(i,k)+dk-1(k,j) thì

đặt dk(i,j):=dk-1(i,k)+dk-1(k,j) và pk(i,j):=pk-1(i,k)

Ngược lại đặt

dk(i,j):=dk-1(i,j) và pk(i,j):=pk-1(i,j) Quay lại bước 2 Phương pháp xác định đường đi ngắn nhất từ đỉnh i đến đỉnh j: đường đi ngắn nhất từ i đến j gồm dãy các đỉnh i , i1 , i2 , … , ik , ik+1 ,… , im , j thỏa mãn: i1 = p(i,j), i2 = p(i1,j),… , ik+1= p(kk,j), … , p(im,j) = j Mô tả thuật toán Ví Dụ: floydwar.inp Kết quả: floydwar.out 4 7 17 7 5 13 1 2 7 10 7 7 6 độ dài đường đi ngắn nhất 1 3 5 15 12 19 11 giữa mọi cặp đỉnh 2 3 7 4 1 8 7 2 4 6 2 2 3 2

3 4 11 4 4 3 4 đường đi ngắn nhất 4 1 4 4 4 4 4 giữa mọi cặp đỉnh 4 2 1 1 2 2 2

4)Mô tả

6

1

7

4

11

7 5

Trang 18

Vậy độ dài đường đi ngắn nhất từ 4 >3 là 8 và đường đi đó là: 4 >2 >3.

Trang 19

f) Độ phức tạp

-Quy tắc cộng: Nếu T1(n) và T2(n) là thời gian thực hiện của đoạn chương trình P1 và P2;và T1(n) = O(f(n)), T2(n) = O(g(n)) thì thời gian thực hiện của đoạn hai chương trình đó nối tiếp nhau là T(n) = O(max(f(n),g(n)))

-Quy tắc nhân: Nếu T1(n) và T2(n) là thời gian thực hiện của đoạn chương trình P1 và P2;và T1(n) = O(f(n)), T2(n) = O(g(n)) thì thời gian thực hiện của đoạn hai chương trình đó lồng nhau là T(n) = O(f(n)*g(n))

-Quy tắc tổng quát để phân tích một chương trình:

+Thời gian thực hiện của mổi lệnh gán, READ, WRITE là O(1)

+Thời gian thực hiện của một chuỗi tuần tự các lệnh được xác định bằng quy tắc cộng Như vậy thời gian này là thời gian thi hành một lệnh nào đó lâu nhất trong chuỗi lệnh

+Thời gian thực hiện cấu trúc IF là thời gian thực hiện lệnh sau THEN hoặc sau ELSE và thời gian kiểm tra điều kiện.Thường thời gian kiểm tra điều kiện là O(1)

+Thời gian thực hiện vòng lặp là tổng (trên tất cả các lần lặp) thời gian thực hiện thân vòng lặp Nếu thời gian thực hiện vòng lặp không đổi thì thời gian thực hiện vòng lặp là tích của số lần lặp với thời gian thực hiện thân vòng lặp

Rõ ràng ta thấy ở chương trình có ba vòng lặp for lồng nhau nên độ phức tạp là O(n3 ) còn ở câu lênh if…else có độ phức tạp là O(1), nên độ phức tạp

Ngày đăng: 23/05/2015, 17:19

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w