1. Trang chủ
  2. » Luận Văn - Báo Cáo

đồ án cuối kì môn phân tích thiết kế và giải thuật knapsack problem

42 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Nội dung

CHƯƠNG 1 – MỞ ĐẦUCụ thể, bài toán có thể được mô tả như sau:Cho một danh sách các mục, mỗi mục có một giá trị lợi nhuận và một trọng lượng.Cho trước một giới hạn về trọng lượng mà một cá

Trang 1

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2023

Trang 2

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2023

Trang 3

LỜI CẢM ƠN

Lời đầu tiên, em xin trân trọng cảm ơn giảng viên người đã trực tiếp chỉ bảo, và truyền đạt kiến thức để hoàn thành bài báo cáo này.

Trang 4

ĐỒ ÁN ĐƯỢC HOÀN THÀNHTẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG

Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi Các nội dung nghiên cứu,kết quả trong đề tài này là trung thực và chưa công bố dưới bất kỳ hình thức nào trướcđây Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giáđược chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu thamkhảo.

Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số liệucủa các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc.

Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệmvề nội dung đồ án của mình Trường đại học Tôn Đức Thắng không liên quan đến

những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có).

TP Hồ Chí Minh, ngày 05 tháng 12 năm 2023 Tác giả

(ký tên và ghi rõ họ tên)ThànhNguyễn Tấn Thành

Trang 5

PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN

Phần xác nhận của GV hướng dẫn

Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)

Phần đánh giá của GV chấm bài

Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)

Trang 6

TÓM TẮT

Bài toán Knapsack (hay còn gọi là bài toán cái ba lô) là một bài toán tối ưu hóa trong lĩnh vực quy hoạch động và tối ưu hóa kết hợp Bài toán này có nhiều biến thể, nhưng cơ bản, nó đặt ra một vấn đề quyết định

mục tiêu chính của giải quyết Knapsack Problem là tìm ra tập hợp tối ưu những đối tượng để đặt vào cặp xách sao cho giá trị của chúng là lớn nhất mà không vượt quá trọng lượng tối đa cho phép Việc này có ý nghĩa lớn trong quyết định tối ưu về tài nguyên, ví dụ như quản lý dự án, lập kế hoạch sản xuất, hoặc quản lý tài sản.Sau đây chúng ta sẽ giải quyết bài toán này.

Trang 8

CHƯƠNG 2 – CÁC LOẠI BÀI TOÁN TRONG KNAPSACK 5

2.1 0/1 Knapsack Problem: 5

2.2 Fractional Knapsack Problem: 6

2.3 Multiple Knapsack 7

CHƯƠNG 3 – CÁC PHƯƠNG PHÁP GIẢI BÀI TOÁN KNAPSACK PROBLEM 8

3.1 Giải quyết bài toán cái túi bằng thuật toán trực tiếp với KapSack 0/1 force) 10

(Brute-3.2 Giải quyết bài toán cái túi bằng thuật toán tham lam cho bài toán Fractional Knapsack Problem (Greedy) 16

3.3 Giải quyết bài toán cái túi bằng thuật toán quy hoạch động 22

Knapsack Problem 0/1 (Dynamic Programming) 22

CHƯƠNG 4 – Xây Dựng data và hiện thực thuật toán 28

CHƯƠNG 5 – Kết Luận Với Các Thuật Toán Trên 36

Trang 9

CHƯƠNG 1 – MỞ ĐẦU

Cụ thể, bài toán có thể được mô tả như sau:

Cho một danh sách các mục, mỗi mục có một giá trị (lợi nhuận) và một trọng lượng.

Cho trước một giới hạn về trọng lượng mà một cái ba lô (hoặc một không gian) có thể chứa.

Mục tiêu là chọn một tập hợp các mục sao cho tổng giá trị là lớn nhất, nhưng tổng trọng lượng không vượt quá giới hạn đã cho.

Ví dụ thực tế:

Bài toán :

Mô tả: Người du lịch muốn chuẩn bị một ba lô để một chuyến du lịch ngắn hạn Ba lô của anh ta có giới hạn trọng lượng và anh ta muốn đảm bảo rằng anh ta mang theo những vật dụng quan trọng nhất mà không vượt quá trọng lượng tối đa của ba lô.Dữ liệu vào:

Trang 10

Danh sách các mục mà anh ta có thể mang theo (quần áo, máy ảnh, sổ tay, sách, điện thoại, sạc, )

Mỗi mục có một trọng lượng và giá trị tương ứng (có thể là tiện ích hoặc giá trị cá nhân).

Trang 11

n số đồ vật, và biểu diễn quyết định của bài toán x1, x2, …, xn trong đó

xi≥ 0 , i=1 ,n

valueigiá trị củavậtthứ ixi

weig hti là trọng lượng của vậtthứ ixiHàm mục tiêu :

Hàm ràng buộc :

xi.weighti≤Capacityxi≥0 và số nguyên,i=1,…,n

CHƯƠNG 2 – CÁC LOẠI BÀI TOÁN TRONG KNAPSACK2.1 0/1 Knapsack Problem:

Trong vấn đề này, mỗi đối tượng có hai lựa chọn: chọn hoặc không chọn.

Điều này có nghĩa là bạn không thể chia nhỏ một đối tượng và đặt mộtphần nó vào túi, mà bạn phải quyết định chọn hoặc không chọn nó nguyên vẹn.

Ví dụ: Nếu bạn có một chiếc ba có khả năng chịu tải 10kg và ba đối tượng với trọng lượng lần lượt là 5kg, 3kg, và 8kg, bạn phải quyết định chọn đối tượng nào và không thể chia nhỏ chúng.

- Hạn chế mỗi đồ vật thuộc loại 0 và 1 (không chọn, hoặc chọn)

Trang 12

Được phát biểu như sau:

xi.valuei→maxSao cho:

xi.weighti≤Capacityxi=0hoặc1 và số nguyên,i=1 ,…,n

2.2 Fractional Knapsack Problem:

Trái ngược với 0/1 Knapsack, trong vấn đề này, bạn có thể chia nhỏ đối tượng để đặt một phần của nó vào túi.

Điều này tạo ra một mức linh hoạt lớn hơn trong việc chọn lựa, vì bạn có thể chọn một phần của đối tượng để tối ưu hóa giá trị tổng cộng.

Ví dụ: Nếu bạn có một túi chịu tải 10kg và một đối tượng có trọng lượng 5kg, bạn có thể đặt nửa đối tượng vào túi để tối ưu hóa giá trị nếu giá trị của đối tượng phụ thuộc vào trọng lượng.

xi.valuei→maxSao cho:

xi.weighti≤Capacity0 ≤ x≤ 1 vàsố nguyên,i=1 ,…

Trang 13

2.3 Multiple Knapsack

Bài toán Multiple Knapsack (MKP) là một phần mở rộng của Bài toán ba lô cổ điển (KP), trong đó có nhiều chiếc ba lô, mỗi chiếc có hạn chế về dung lượng riêng Trong vấn đề tối ưu hóa này, một tập hợp các vật phẩm cần được phân bổ cho các ba lô khác nhau sao cho tổng giá trị được tối đa hóa trong khi vẫn tôn trọng giới hạn dung lượng riêng của từng ba lô.

Mô tả chi tiết như sau:

Nhiều Túi: Có nhiều túi, mỗi túi có một giới hạn trọng lượng cụ thể.Nhiều Đối Tượng: Có một danh sách các đối tượng, mỗi đối tượng có trọng lượng và giá trị riêng.

Mục Tiêu: Mục tiêu vẫn là tối ưu hóa tổng giá trị của các đối tượng được đặt vào túi, nhưng với ràng buộc là không vượt quá trọng lượng cho mỗi túi.

Thuật toán cho Multiple Knapsack Problem thường kế thừa ý tưởng từ thuật toán cho 0/1 Knapsack, nhưng mở rộng để xử lý nhiều túi Các phương pháp giải quyết thường sử dụng các kỹ thuật như quy hoạch động hoặc các phương pháp tìm kiếm và tối ưu hóa.

Ví dụ, nếu bạn có nhiều túi với khả năng chịu tải là 10kg, 15kg và 20kg, và một danh sách các đối tượng với trọng lượng và giá trị tương ứng, thuậttoán sẽ cố gắng phân phối các đối tượng vào các túi để tối ưu hóa tổng giá trị và đồng thời không vượt quá trọng lượng cho mỗi túi.

Bài toán đi tìm lời giải cho

∑n xij.valuej→max

Trang 14

Sao cho

{ ∑

xij.weightij≤Capacityi,Vớii ϵ[1,m]xijϵ{0,1},where jϵ[1,n],iϵ[1 ,m]

Chú thích:

n là số lượng đồ vật m là số lượng balovaluej là giá trị vật phẩm thứ j

weightijlà trọng lượng của vật phẩm j trong balo ICapacityi là sức chứa của ba lô i

xij là biến nhị phân cho biết vật thứ j có được chọn để đặt vào balo thứ hay không

CHƯƠNG 3 – CÁC PHƯƠNG PHÁP GIẢI BÀI TOÁN KNAPSACK PROBLEM

Dữ liệu đầu vào và đầu ra của các thuật toán

Input :

- Các thuật toán sẽ nhận vào một danh các giá trị của đồ vật (values[]) và danh sách trọng lượng của đồ vật (weights[]) vào cùngmột mảng

- Nhận vào Trọng tải của balo (Capacity)

Trang 15

- Số chỉ mục của 2 mảng weights[], values[] tương ứng với thứ tự đồ vật Ví dụ: trên hình index 0 tương ứng với vật đầu tiên với: trọng lượng 70 và giá trị 135

Trang 16

Thử tất cả các 2n khả năng chọn lựa để tìm ra tập con đối tượng sao cho tổng trọng lượng không vượt quá trọng lượng tối đa cho túi và tổng giá trị là lớn nhất.

Phương pháp Brute-Force là một cách tiếp cận đơn giản nhưng không hiệu quả với bài toán Knapsack và Fractional Knapsack do nó thử tất cả các khả năng có thể của việc chọn hoặc không chọn mỗi mục, sau đó kiểm tra xem liệu nó có đáp ứng các ràng buộc haykhông Dưới đây là cách giải bài toán Fractional Knapsack bằng phương pháp Brute-Force:

o Tạo tất cả các tổ hợp có thể của việc chọn hoặc không chọn mỗi đối tượng.

Mỗi đối tượng có hai lựa chọn: chọn hoặc không chọn Do đó, số lượng tổ hợp sẽ là2n, nơi n là số lượng đối tượng.

o Trả về giải pháp tối ưu

Mặc dù phương pháp Brute-Force có thể đảm bảo tìm ra giải pháp tối ưu, nhưng độ phức tạp thời gian của nó là O(2n¿,nơi n là số lượng đối tượng

Trang 17

Đối với các bài toán có số lượng đối tượng lớn, phương pháp này trở nên không hiệu quả về mặt thời gian.

Ví dụ Bài toán KnapSack 0/1 Problem với giải thuật brute-force:

Tổ hợp đồ vật

Trang 18

o Trọng số mảng chứa trọng số của tất cả các mụco Giá trị mảng chứa giá trị của tất cả các mục

o Mảng A được khởi tạo bằng 0 được sử dụng để tạo chuỗi bit• Đầu ra trả về mảng với:

o 2 phần tử cuối của mảng lần lượt là giá trị tốt nhất và trọng lượng của nó

o Các giá trị trước đó là danh sách các đồ vật được chọn

Trang 19

- Tiếp theo sử dụng vòng for lồng nhau với vòng for đầu tiên duyệt qua 2n tổ hợp để lọc chọn tổ hợp xét giá trị

Trang 20

- Vòng while bên trong sẽ chịu trách nhiệm tạo ra tổ hợp

- Vòng for tiếp theo tính toán giá trị của tổ hợp và chọn giá trị tốt nhất

- Cuối cùng trả về kết quả

Trang 21

Độ phức tạp cho đoạn code:

- Time Complexity Analysis

j =n1

¿¿¿¿(2 n).[1+…+1]¿

¿O(2 n∗2n)¿O(n∗2n)

- Time Complexity Analysis

Thuật toán sử dụng mảng để lưu trữ quyết định tốt nhất, quyết định tạm thời và kết quả.

Độ phức tạp không gian của các mảng là O(n), trong đó n là số lượng mục.

Vì độ phức tạp của thuật toán này tăng theo cấp số nhân nên nó chỉ có thể được sử dụng cho các trường hợp nhỏ của Sự cố KnapSack Mặt khác, nó không đòi hỏi nhiều nỗ lực lập trình để triển khai Ngoài bộ nhớ được sử dụng để lưu trữ giá trị và trọng lượng của tất cả các mục, thuật toán này yêu cầu mảng hai chiều (A[] và bestChoice[]).

Trang 22

3.2 Giải quyết bài toán cái túi bằng thuật toán tham lam cho bài toán Fractional Knapsack Problem (Greedy)

Cách tiếp cận bài toán:

1 Chọn mục có giá trị lớn nhất trong số các mục còn lại; điều này làm tăng giá trị của chiếc ba lô càng nhanh càng tốt.

2 Chọn vật dụng nhẹ nhất trong số những vật dụng còn lại để sử dụng hết dung lượng càng chậm càng tốt để có thể nhét nhiều vật dụng hơn vào ba lô.3 Chọn những mặt hàng có giá trị trên mỗi trọng lượng càng cao càng tốt

- Đây là lời giải thích tại sao chiến lược thứ ba, chọn các mặt hàng có tỷ lệ giá trịtrên trọng lượng càng cao càng tốt, thường mang lại kết quả tốt:

Tối đa hóa giá trị một cách nhanh chóng:

Chiến lược này ưu tiên các mặt hàng có tỷ lệ giá trị trên trọng lượngcao Bằng cách chọn những món đồ mang lại giá trị cao nhất cho

trọng lượng của chúng, bạn sẽ nhanh chóng tăng giá trị tổng thể của chiếc ba lô.

Sử dụng hiệu quả năng lực:

Việc lựa chọn những món đồ có tỷ lệ giá trị trên trọng lượng cao cho phép sử dụng hiệu quả sức chứa của ba lô Bạn đang bao gồm các mục đóng góp đáng kể vào tổng giá trị trong khichiếm ít không gian hơn.

Tránh quá chú trọng vào cân nặng:

Việc ưu tiên tỷ lệ giá trị trên trọng lượng cao giúp tránh các tình huống trong đó một mặt hàng có thể có giá trị rất cao nhưng cũng

Trang 23

có trọng lượng rất cao Trong những trường hợp như vậy, việc chọn vật phẩm nhẹ nhất có thể không nhất thiết phải tối đa hóa giá trị tổng thể.

Cách giải bài toán:

Sắp xếp các đồ vật theo thứ tự không tăng của giá trị với trọng lượng viwi Nếu trọng lượng của đối tượng nhỏ hơn hoặc bằng trọng lượng cònlại của túi, chọn đối tượng này hoàn toàn.

Nếu không, chọn một phần của đối tượng để điền vào túi sao cho túi đầ

Trang 24

Step 2 Arrange all the items in descending order based on Pi/Wi

Đầu vào

• GreedyAlgorithm (Weights [1 … N], Values [1 … N])

Trang 25

• Input:

• Trọng số mảng chứa trọng số của tất cả các mục• Giá trị mảng chứa giá trị của tất cả các mục

• Output: Giải pháp lựa chọn của phần tử của danh sách sản phẩm trong mảng.

for all items do

if the current item on the list fits into the knapsack then• place it in the knapsack

Trang 26

- Tiến hành lặp qua tất cả các phẩn từ đã sắp xếp vào đưa nó mảng selectedQuantities và tính bestvalue

Trang 27

- Cuối kết quả được trả về trong một đối tượng Tuple bao gồm mảng chứa lượng của từng mục được chọn và tổng giá trị tối đa có thể đạtđược.

Độ phức tạp:

- Time Complexity Analysis

Sắp xếp theo bất kỳ thuật toán nâng cao nào là O(NlogN)

1=[1+…+1]N(¿)=O(N )

Từ 2 ý trên, độ phức tạp của thuật toán tham lam là O(NlogN) + O(N) = O(NlogN) Về mặt bộ nhớ, thuật toán này chỉ yêu cầu mảng một chiều để ghi lại chuỗi nghiệm.

- Space Complexity Analysis

mergeSort: thuật toán sắp xếp merge khôngyêu cầu không gian bổ sung để tạo ra mảng tạm Độ phức tạp không gian của merge sort là O(n)

Giải thuật sử dụng mảng để lưu trữ chỉ số, giá trị, trọng lượng, và lượng được chọn Độ phức tạp không gian cho những mảng này là O(n), trong đó n là số lượng mục.

Fractional Knapsack với greedy có độ phức tạp thời gian là O(nlogn) do merge sort Độ phức tạp không gian là O(n) chủ

Trang 28

yếu do yêu cầu không gian bổ sung từ merge sort và các mảng sửdụng để lưu thông tin.

3.3 Giải quyết bài toán cái túi bằng thuật toán quy hoạch động Knapsack Problem 0/1 (Dynamic Programming)

Dữ liệu:

n là số đồ vật

Capacity là khả năng chịu tải của cái túi

- Mô tả: với mỗi đồ vật từ 1 ≤ i ≤n và khả năng chịu tải 0 ≤ w ≤ Capacity tính value[i,w] là tổng giá trị lớn nhất của đồ vật được chọn trong số i đồ vật đầu tiên có tổng trọng số không vượt quá w.

- Có tất cả n(Capacity) bài toán

- Giá trị tối ưu cần tìm là value[n, Capacity]- Chú thích:

Value[i,w] là giá trị lớn nhất mà bạn có thể đạt được với i đối tượng và trọng lượng tối đa là w.

Vi là giá trị đồ I, wi là trọng lượng đồ i.wi duyệt qua tất cả các trọng lượng từ 0 đến w

- Giả sử tính được value[i,w] với mọi 1< i<n và 0 < w < Capacity khi đó đểtính được value[i,w] như sau:

Nếu w < wi thì đồ vật thứ i không thể chất vào túi, do đó cách tối ưu có thể chọn là i-1 đồ vật trước đó và giá trị value[i-1,w].

Nếu w > w cách tối ưu cần chọn có 2 cách sau:

Trang 29

Không chất đồ vật i vào túi do đó cách tối ưu có thể 1,w].

value[i-chất đồ vật i vào túi Khi đó trọng lượng còn lại sẽ được value[i-chất tối ưu từ i-1 đồ vật đầu tiên với giá trị tối ưu sẽ là: value[i-1,w- wi ] Và giá trị sẽ được cập nhật Vi+value[i−1 , w-wtừ đó công thức đệ quy:

{ value[i−1 ,w]vớiw≤ wi

max(value[i−1 ,w],|Vi+value[i−1 , w-wi]¿

Quy luật chọn lựa tối ưu :

- Nếu trọng lượng wi của đối tượng thứ i lớn hơn trọng lượng tối đa w, bạn không thể đặt đối tượng này vào túi, vì nó vượt quá trọng lượng tối đa.- Ngược lại, nếu wi ≤ w, bạn có hai lựa chọn:

Không chọn đối tượng thứ i, do đó giá trị là value[i−1 ,w]

Chọn đồ thứ i, tức là cộng thêm giá trị

Vivới giátrịlớnnhất cóthể đạt được từ {1 ,…i−1}và trọng lượng wi vào giải pháp tối ưu cho các đối tượng trước đó với trọng lượng tối đa là w – wi, do đó Vi+value[i−1 , w – w

Ví dụ:

Trang 30

WI

- Dynamic Programming (Weights [1 … N], Values [1 … N],

- Table [0 N, 0 … Capacity]) nó được sử dụng để lưu trữ kết quả từ thuật toán lập trình động.

- Input:

Trọng số mảng chứa trọng số của tất cả các mụcGiá trị mảng chứa giá trị của tất cả các mục

Trang 31

các giá trị tối ưu dựa trên việc liệu việc bao gồm mục hiện tại có dẫn đến giá trị cao hơn không.

Trang 32

- Tạo một mảng selectedQuantities để lưu trữ lựa chọn (1 là chọn, 0 là không chọn).

- Nếu giá trị tại table[i][c] khác với giá trị khi không chọn mục (table[i - 1][c]), đánh dấu mục thứ i được chọn và giảm dung lượng còn lại.

- Trả về mảng số lượng đã chọn và giá trị tối ưu

Trang 33

Độ phức tạp cho đoạn code:- Time complexity

[1+…+1]¿¿¿ ¿¿Capacity∗[1+…+1]¿

¿Capacity N∗

¿O(Capacity∗N )- Space complexity

Độ phức tạp không gian được chiếm bởi bảng 2 chiều, có kích thước (n + 1) với (capacity + 1) Do đó, độ phức tạp không gian là O(n * capacity).

Như vậy, độ phức tạp theo thời gian của thuật toán Lập trình động là O (N*Capacity) Về mặt bộ nhớ, Lập trình động yêu cầu một mảng hai chiềuvới các hàng bằng số mục và cột bằng dung lượng của ba lô Thuật toán này có lẽ là một trong những thuật toán dễ thực hiện nhất vì nó không yêu cầu sử dụng bất kỳ cấu trúc bổ sung nào.

CHƯƠNG 4 – Xây Dựng data và hiện thực thuật toán

- Bộ dữ liệu được lấy từ:

- Xây dựng các Data theo cấu trúc như hình

Ngày đăng: 08/05/2024, 16:24

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

TÀI LIỆU LIÊN QUAN

w