1. Trang chủ
  2. » Công Nghệ Thông Tin

MỘT CÁCH TIẾP CẬN MỚI VỀ QUY HOẠCH ĐỘNG

37 928 0

Đ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 37
Dung lượng 2,07 MB

Nội dung

Trong chiến lược chia để trị, người ta chia bài toán cần giải thành các bài toán con. Các bài toán con lại tiếp tục được chia thành các bài toán con nhỏ hơn, cứ tiếp tục chia cho đến khi ta nhận được các bài toán con có thể giải được dễ dàng. Tuy nhiên, trong quá trình phân chia như vậy, có thể ta sẽ gặp lại rất nhiều lần cùng một bài toán con. Tư tưởng cơ bản của phương pháp quy hoạch động là sử dụng bảng để lưu trữ lời giải của các bài toán con đã được giải. Khi giải bài toán con cần đến nghiệm của các bài toán con cỡ nhỏ hơn, ta chỉ cần lấy lời giải trong bảng mà không cần phải giải lại. Chính vì thế mà các thuật toán được thiết kế bằng phương pháp quy hoạch động sẽ rất hiệu quả.

Trang 1

CHUYÊN ĐỀ MỘT CÁCH TIẾP CẬN MỚI VỀ QUY HOẠCH ĐỘNG

Trong chiến lược chia để trị, người ta chia bài toán cần giải thành các bài toán con Các bài toáncon lại tiếp tục được chia thành các bài toán con nhỏ hơn, cứ tiếp tục chia cho đến khi ta nhận được cácbài toán con có thể giải được dễ dàng Tuy nhiên, trong quá trình phân chia như vậy, có thể ta sẽ gặp lạirất nhiều lần cùng một bài toán con Tư tưởng cơ bản của phương pháp quy hoạch động là sử dụng bảng

để lưu trữ lời giải của các bài toán con đã được giải Khi giải bài toán con cần đến nghiệm của các bài toáncon cỡ nhỏ hơn, ta chỉ cần lấy lời giải trong bảng mà không cần phải giải lại Chính vì thế mà các thuậttoán được thiết kế bằng phương pháp quy hoạch động sẽ rất hiệu quả

Để giải quyết một bài toán bằng phương pháp quy hoạch động, chúng ta cần tiến hành những côngviệc sau:

1) Tìm các tham số mô tả bài toán;

2) Tìm nghiệm của các bài toán con nhỏ nhất;

3) Tìm công thức (hoặc quy tắc) xây dựng nghiệm của bài toán con thông qua nghiệm của bàitoán con cỡ nhỏ hơn;

4) Tạo bảng (dựa trên các tham số mô tả bài toán) để lưu trữ nghiệm của các bài toán con Tínhnghiệm của các bài toán con theo công thức đã tìm và lưu trữ vào bảng;

5) Từ các bài toán con đã giải để tìm nghiệm của bài toán

1 Lớp các bài toán giải được bằng phương pháp quy hoạch động

 Bài toán tối ưu

 Bottom-up (từ dưới lên)

o Khi đã xác định được thứ tự các bài toán con cần giải

o Cài đặt bằng vòng lặp

o Có thể giải thừa các bài toán con không cần thiết

 Top-down (từ trên xuống)

o Không cần thiết xác định được thứ tự các bài toán con cần giải

o Cài đặt bằng đệ quy có nhớ  có thể đặt cận

o Chỉ giải các bài toán con cần thiết

3 Độ phức tạp của thuật toán thiết kế theo phương pháp quy hoạch động

Giả sử bài toán được mô tả bằng các tham số và cần tính hàm mục tiêu Khi đó, số bài toán con (hay còn gọi là số trạng thái) cần tính là

Gọi là độ phức tạp tính nghiệm của bài toán con thông qua nghiệm của bài toán con cỡ nhỏ hơn(còn gọi là chi phí chuyển trạng thái)

Khi đó độ phức tạp của thuật toán bằng: Số trạng thái chi phí chuyển trạng thái ( )

1

Trang 2

4 Những vấn đề cần chú ý khi giải bài toán bằng phương pháp quy hoạch động

4.1 Tìm các tham số mô tả bài toán

Việc tìm các tham số mô tả bài toán được dựa trên các đặc điểm, tính chất của bài toán (công việcnày còn được gọi là đoán nhận trạng thái) Cụ thể, cần xác định có những tham số nào, ý nghĩa mỗi tham

số, miền giá trị của từng tham số Đây là công việc quan trọng mang ý nghĩa quyết định đến việc giảiquyết bài toán

4.2 Tối ưu thuật toán

Qua cách tính độ phức tạp thuật toán theo phương pháp quy hoạch động (độ phức tạp bằng sốtrạng thái nhân với chi phí chuyển trạng thái) ta nhận thấy, để giảm độ phức tạp thuật toán có thể giảmthiểu số trạng thái hoặc giảm chi phí chuyển trạng thái

5 Một số ví dụ minh hoạ

5.1 Bài toán cắt hình chữ nhật

Có một hình chữ nhật MxN ô, mỗi lần ta được phép cắt một hình chữ nhật thành hai hình chữ nhậtcon theo chiều ngang hoặc chiều dọc và lại tiếp tục cắt các hình chữ nhật con cho đến khi được hìnhvuông thi dừng

Yêu cầu: Tìm cách cắt hình chữ nhật MxN thành ít hình vuông nhất.

- Các bài toán con nhỏ nhất (cơ bản) có , khi đó

Trang 4

if a=b then begin

Có đống sỏi xếp thành một vòng tròn, đống thứ có viên sỏi Ta có 2 cách bốc sỏi như sau:

- Chọn hai đống liền nhau có số lượng sỏi đều là lẻ Sau đó bốc từ hai đống đó, mỗi đống một viênsỏi;

- Chọn hai đống liền nhau vẫn còn sỏi Sau đó lần lượt bốc từ hai đống đó, để sau khi bốc số sỏi cònlại của mỗi đống bằng số sỏi ban đầu của đống đó div 2

Yêu cầu: Cho số lượng sỏi ban đầu của mỗi đống , hãy tính số cách khác nhau để bốc đượchết tất cả các sỏi

Trang 5

Với Subtask 1, ta có thể sử dụng 3 tham số để mô tả bài toán và là số cách khác nhau

để bốc được hết tất cả các đống sỏi Dùng mảng F[0 30,0 30,0 30] để lưu kết quả của các bài toán con

Để thuận tiện khi viết chương trình và giải được Subtask 2, ta dùng để mô

tả bài toán (trường hợp thì bằng 0) và dùng mảng F có 5 chiều (mỗi chiều từ 0đến 30) để lưu trữ Đoạn lệnh để tính cụ thể như sau:

function qhd(var x:prob):longint;

var i,j :longint;

if (z[i]>0) and (z[j]>0) then begin

if odd(z[i]) and odd(z[j]) then begin

- nếu , ta có thể bốc 1 viên để đưa đống sỏi về còn , sau đó sẽ về còn viên;

- nếu , chỉ có cách bốc để đưa đống sỏi về còn viên

5

Trang 6

Nhận thấy các khả năng không xảy ra Như vậy, bản chất độ phức tạp thuật

vấn đề khó khăn là không thể khai báo được mảng 5 chiều, mỗi chiều kích thước 30000 để lưu trữ được

Để giải quyết vấn đề này, với từng đống sỏi ta xét các giá trị có thể xảy ra rồi đánh thứ tự các giá trị này từnhỏ đển lớn, việc lưu trữ sẽ theo số thứ tự giá trị Chương trình hoàn chỉnh dưới đây

if idx[i]<>-1 then exit(idx[i]);

if odd(i) then idx[i]:=getIndex(i-1)+1

else idx[i]:=getIndex(i div 2)+1;

function qhd(var x:prob):longint;

var i,j :longint;

y,z :prob;

tmp :longint;

Trang 7

begin

for i:=0 to 4 do y[i]:=idx[x[i]];

if f[y[0],y[1],y[2],y[3],y[4]]<>-1 then exit(f[y[0],y[1],y[2],y[3],y[4]]);

tmp:=0;

for i:=0 to n-1 do begin

j:=(i+1) mod n;

z:=x;

if (z[i]>0) and (z[j]>0) then begin

if odd(z[i]) and odd(z[j]) then begin dec(z[i]); dec(z[j]);

tmp:=(tmp + qhd(z)) mod NMOD; end;

z[i]:=x[i] div 2; z[j]:=x[j] div 2; tmp:=(tmp + qhd(z)) mod NMOD;

Trang 8

- N dòng tiếp theo, mỗi dòng một số nguyên mô tả dãy số A (0<A[i]<106)

Kết quả ra file văn bản “LSS.OUT” có dạng: gồm một dòng chứa một số thực duy nhất là đáp án của bài

toán (đưa ra theo qui cách :0:2)

Số bài toán con là Chi phí chuyển trạng thái là , trong đó bao gồm việc tính trọng số đoạn

từ phần tử đến Như vậy, độ phức tạp theo thuật toán trên là và không đápứng được với Có thể giảm độ phức tạp thuật toán bằng cách tối ưu công thức tính trọng sốđoạn từ phần tử đến Thay vì phải tính trọng số đoạn từ phần tử đến mất thì việctính này chỉ mất , khi đó độ phức tạp thuật toán chỉ còn

Trang 9

for i:=1 to n do begin

for i:=1 to n do f[i,1]:=sum2[i]-sqr(sum[i])/i;

for i:=2 to n do begin

Trang 10

+ tổng tối ưu cách chọn 3 chỉ số trong đoạn từ phần tử đến

Số bài toán con là Chi phí chuyển trạng thái mất nhân với chi phí tính tổng tối ưu cách chọn

3 chỉ số trong đoạn từ phần tử đến Việc tính tổng tối ưu cách chọn 3 chỉ số trong đoạn từ phần

tử đến có thể chuẩn bị trước và lưu trữ vào mảng hai chiều, khi đó việc tính tổng chỉ còn

Độ phức tạp thuật toán là:

Tuy nhiên, ta có thể thay đổi cách nhìn và có được lời giải đơn giản ngắn gọn hơn Gọi là tổng

for i:=0 to n do l[i,0]:=0;

for i:=1 to n do begin

Trang 11

if m>i then mm:=i else mm:=m;

for j:=1 to mm do

for k:=i downto j do

if l[i,j]<l[k-1,j-1]+a[k]*cs[j mod 3] then

5.5 K l c đ DOMINO ỷ lục đổ DOMINO ục đổ DOMINO ổ DOMINO

Một kỷ lục thế giới về xếp domino đổ đã được

ghi nhận vào hôm 17/11/2006 Kỷ lục này

thuộc về Hà Lan khi 4.079.381 quân domino

đã lần lượt đổ xuống theo phản ứng dây

chuyền trong tiếng vỗ tay reo hò của các cổ

động viên Những người tổ chức sự kiện Ngày

Domino ở Hà Lan cho biết, 4.079.381 quân

domino đã lần lượt đổ xuống trong vòng 2 giờ

đồng hồ

Những quân domino đã di động uyển chuyển trên nền những điệu nhạc cổ điển và đương đại là nét đặcbiệt nhất của màn trình diễn domino Tác giả Robin Paul Weijers nói: “Hơn 4 triệu quân domino, điềunày chưa bao giờ xảy ra Chúng tôi còn thành công trong việc khiến cho những quân bài domino nhảymúa trong tiếng nhạc Tôi rất hạnh phúc vì đã thành công.”

Với màn trình diễn tuyệt vời này, những kỷ lục gia domino Hà Lan đã phá vỡ kỷ lục của chính họ lậpđược năm 2005 với 4.002.136 quân bài domino

Sắp tới, Bờm dự định xây dựng một công trình lớn hơn để phá kỷ lục của người Hà Lan Công trình sẽ baogồm 2 công đoạn chính:

- Công đoạn 1: Xếp quân domino vào các ô còn trống trên hình chữ nhật kích thức

, trong hình chữ nhật đó có ô đã được đặt trước vật trang trí

- Công đoạn 2: Xếp quân domino thành một dãy độ dài , mỗi hàng có đúng

quân (có thể được hiểu như xếp vào hình chữ nhật kích thước )

Điểm độc đáo trong công trình này là sự phối màu giữa các quân domino lân cận chung cạnh Các quândomino được xếp bằng hai loại domino, loại 1 có màu xanh nhạt và loại 2 có màu xanh đậm Quân

11

Trang 12

domino ở vị trí ô sẽ phải thỏa mãn điều kiện: nếu lẻ thì màu quân domino này sẽ phải có màukhông nhạt hơn các quân ở các ô chung cạnh (nếu có), nếu chẵn thì màu quân domino này sẽ phải

có màu không đậm hơn các quân ở các ô chung cạnh (nếu có)

Để có những thông tin thú vị khi giới thiệu về công trình, Bờm muốn biết số lượng cách xếp khác nhaucủa công đoạn 1 và công đoạn 2 Hai cách xếp được gọi là khác nhau nếu khi chồng khít 2 cách lên nhau(không xoay hoặc lật) có ít nhất một quân khác màu

Dữ liệu vào trong file “DOMINO.INP” có dạng:

- Dòng 1: gồm 1 số nguyên dương , các kết quả tìm được sẽ mod cho ;

kích thước hình chữ nhật trong công đoạn 1, là số lượng ô trong hình chữ nhật đã đặt vật trangtrí, tiếp theo là cặp số, cặp số là tọa độ ô đã đặt vật trang trí;

- Dòng 3: gồm 2 số nguyên dương là kích thước hình của công đoạn 2

Kết quả ra file “DOMINO.OUT” có dạng:

- Dòng 1: số cách xếp công đoạn 1 khác nhau mod ;

- Dòng 2: số cách xếp công đoạn 2 khác nhau mod

Phân tích

Cách giải cho phần 1: QHĐ với trạng thái có nghĩa là xếp đến ô (xếp lần lượt từ trên xuốngdưới, từ trái qua phải) với là dãy gồm bit 0, 1 mô tả trạng thái ô đầu ở dòng và

ô cuối ở dòng Để thuận tiện lưu trữ, sẽ được mã hoá là một số nguyên

mà trong biểu diễn nhị phân của là dãy

Cách giải cho phần 2: QHĐ với trạng thái có nghĩa là xếp đến hàng có trạng thái hàng trước là với là dãy bit 0, 1 thỏa mãn tích chất màu trên một dòng (với =8 thì <=55) Dùng nhân ma trận

Trang 13

type dsType =array[1 MAXN]of longint;

matrixType =array[1 MAXSL,1 MAXSL]of longint;

var m,n,nMod,SL:longint;

ds :array[1 2,1 1 shl MAXN]of dsType;

count :array[1 2]of longint;

for i:=2 to n do begin

if ((i+t) mod 2 = 1)and(x[i]<x[i-1]) then exit(false);

if ((i+t) mod 2 = 0)and(x[i]>x[i-1]) then exit(false); end;

Trang 14

end;

exit(true);

end;

function mulMatrix(X, Y: matrixType):matrixType;

var i,j,k :longint;

Trang 15

if (i+j) mod 2 = 1 then begin

if (j>1)and(c=0)and(t and mu2[j-1]>0)and(w[i,j-1]=0) then exit(false);

if (i>1)and(c=0)and(t and mu2[j]>0)and(w[i-1,j]=0) thenexit(false);

if dp[i,j,t]>=0 then exit(dp[i,j,t]);

if i>m then begin

dp[i,j,t]:=1;

exit(1);

15

Trang 17

Sau nhiều ngày phân tích, nhà đầu tư rút ra được các dự báo sau:

1 Số lượng cổ phiếu của công ty i (1 ≤ i ≤ n) trên thị trường là Qi;

2 Giá một cổ phiếu của công ty i trong ngày t là Pt,i (0 < Pt,i ≤ 106);

3 Phí giao dịch mua bán một cổ phiếu là 1 đồng

Luật đầu tư như sau: Tại một ngày t (1 ≤ t ≤ D) nhà đầu tư có thể tiến hành hai bước:

Bước 1 – Bán cổ phiếu: Nếu có mi cổ phiếu của công ty i trong tài khoản, nhà đầu tư có

thể tiến hành bán si (0 ≤ si ≤ mi) cổ phiếu Số tiền bán cổ phiếu trừ đi phí giao dịch (si × Pt,i − si) sẽ được chuyển vào tài khoản của nhà đầu tư ngay lập tức Số lượng cổ phiếu của công ty i trong tài khoản của nhà đầu tư còn lại là (mi – s i) Với mỗi loại cổ phiếu, nhà đầu tư có thể bán hoặc không

bán cổ phiếu

Bước 2 – Mua cổ phiếu (thực hiện sau khi tiến hành xong Bước 1): Nếu muốn mua si cổ

phiếu của công ty i, nhà đầu tư phải trả ngay lập tức tiền mua cổ phiếu và phí giao dịch (vì thế

muốn thực hiện giao dịch này, số tiền trong tài khoản phải lớn hơn hoặc bằng số tiền phải trả) Số

tiền trong tài khoản của nhà đầu tư ngay lập tức sẽ bị trừ đi một lượng là (si × Pt,i + si) đồng Số

lượng cổ phiếu mua ngay lập tức sẽ được chuyển vào tài khoản của nhà đầu tư Chú ý: tổng số cổ

phiếu của công ty i trong tài khoản của nhà đầu tư không thể lớn hơn Qi Với mỗi loại cổ phiếu,

nhà đầu tư có thể mua hoặc không mua cổ phiếu

Yêu cầu: Tại thời điểm đầu tiên, nhà đầu tư có k đồng trong tài khoản, và không có cổ phiếu của bất cứ

công ty nào Dựa vào dự báo nêu trên, hãy giúp nhà đầu tư tìm cách mua bán cổ phiếu từ ngày thứ nhất

cho đến hết ngày thứ D, để tổng lượng tiền thu được là lớn nhất.

Dữ liệu: Vào từ file văn bản STOCK.INP:

Dòng đầu chứa 3 số nguyên dương n, k, D (n ≤ 3, k ≤ 109, D ≤ 30);

Dòng thứ hai chứa n số nguyên dương Q1, Q2,…, Qn cho biết số lượng cổ phiếu của các công ty niêm yết trên thị trường (Qi ≤ 100, i = 1, 2,…, n);

Dòng thứ t trong D dòng tiếp theo chứa n số nguyên dương cho biết giá cổ phiếu của n công ty tại ngày t.

Các số trên cùng một dòng được ghi cách nhau bởi ít nhất một dấu cách

Kết quả: Ghi ra file văn bản STOCK.OUT một số nguyên dương duy nhất là tổng lượng tiền nhà đầu tư

có được sau D ngày theo cách mua bán cổ phiếu tìm được.

Trang 18

for i1:=q[1] downto 0 do

for i2:=q[2] downto 0 do

for i3:=q[3] downto 0 do begin

money:=l[i1,i2,i3];

if money > -1 then

begin

Trang 19

if (i1>0) and (l[i1-1,i2,i3] < money+cost[k,1]-1)then

if (i1<q[1]) and (money > cost[k,1]) and

(l[i1+1,i2,i3] < money-cost[k,1]-1) then

l[i1+1,i2,i3] := money-cost[k,1]-1;

if (i2<q[2]) and (money > cost[k,2]) and

(l[i1,i2+1,i3] < money-cost[k,2]-1) then

l[i1,i2+1,i3] := money-cost[k,2]-1;

if (i3<q[3]) and (money > cost[k,3]) and

(l[i1,i2,i3+1] < money-cost[k,3]-1) then

Trang 20

5.7 VACCINE (ACMVN2010)

Amino acid là thành phần cơ bản của sự sống Amino acid gồm 20 loại khác nhau {A,C,D, E, F, G, H, I,

K, L, M, N, P, Q, R, S, T, V, W, Y} Protein là một chuỗi amino acid và được biểu bởi một xâu kí tự P,

trong đó P(t) là amino acid ở vị trí thứ t trong P Các chuỗi amino acid khác nhau sẽ tạo ra các protein

khác nhau M-vaccine là một loại protein có độ dài không quá 500 amino acid được dùng để tiêu diệt cácloại vi rút

Các nhà khoa học đang tập trung nghiên cứu protein của vi rút POKTE nhằm sản xuất ra các loại vaccine để tiêu diệt loại vi rút này

M-Ta nói, M-vaccine V có thể tiêu diệt được k amino acid trong protein P của vi rút POKTE nếu tồn hai dãy

chỉ số (X1 < X2 <…<Xk) và (Y1 < Y2 <…<Yk) sao cho V(Xi) = P(Yi) với i =1…k Mức độ tiêu diệt vi rút POKTE của M-vaccine V được xác định bằng giá trị k lớn nhất.

Cho protein P của vi rút POKTE và N loại M-vaccine, nhiệm vụ của bạn là tìm loại M-vaccine trong Nloại M-vaccine có mức độ tiêu diệt vi rút POKTE lớn nhất

Dữ liệu vào (VACCINE.INP)

Dữ liệu vào gồm nhiều bộ dữ liệu tương ứng với nhiều test Dòng đầu tiên chứa một số nguyên dươngkhông lớn hơn 20 là số lượng các bộ dữ liệu Các dòng tiếp theo chứa các bộ dữ liệu

Với mỗi bộ dữ liệu, dòng đầu tiên chứa số nguyên N (1 ≤ N ≤ 200) là số lượng loại M-vaccine Dòng thứ

hai chứa một xâu độ dài không vượt quá 10000 là biểu diễn protein P của vi rút POKTE N dòng tiếp theo,mỗi dòng chứa một xâu biểu diễn cho một loại M-vaccine

Ngày đăng: 13/10/2016, 20:13

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w