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

Thông tin cơ bản

Tiêu đề KnapSack Problem
Tác giả Nguyễn Tấn Thành
Người hướng dẫn GV. Nguyễn Chí Thiện
Trường học Trường Đại học Tôn Đức Thắng
Chuyên ngành Công nghệ thông tin
Thể loại Đồ án cuối kì
Năm xuất bản 2023
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 42
Dung lượng 2,34 MB

Cấu trúc

  • CHƯƠNG 1 MỞ ĐẦU (9)
  • CHƯƠNG 2 CÁC LOẠI BÀI TOÁN TRONG KNAPSACK (11)
    • 2.2 Fractional Knapsack Problem (12)
    • 2.3 Multiple Knapsack (13)
  • CHƯƠNG 3 CÁC PHƯƠNG PHÁP GIẢI BÀI TOÁN KNAPSACK PROBLEM (14)
    • 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 (Brute- force) (15)
    • 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 (22)
    • 3.3 Giải quyết bài toán cái túi bằng thuật toán quy hoạch động (28)
  • CHƯƠNG 4 Xây Dựng data và hiện thực thuật toán (33)
  • CHƯƠNG 5 Kết Luận Với Các Thuật Toán Trên (40)

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á

CÁC LOẠI BÀI TOÁN TRONG KNAPSACK

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.

Mỗi đồ vật có thể được chọn một phần của chúng 0 ≤ x i ≤1 Được phát biểu như sau:

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ật toá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

{ ∑ j=1 n x x ij ij ϵ weight { 0,1 } ,where jϵ ij ≤Capacity [ 1,n i ,Vớii ϵ[1 ] ,iϵ[1 ,m] ,m ]

Chú thích: n là số lượng đồ vật m là số lượng balo value j là giá trị vật phẩm thứ j weight ij là trọng lượng của vật phẩm j trong balo I

Capacity i là sức chứa của ba lô i x ij 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

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

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 (Brute- force)

Thử tất cả các 2 n 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 hay khô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à2 n , nơi n là số lượng đối tượng. o Kiểm tra từng tổ hợp: Đối với mỗi tổ hợp, tính tổng giá trị và tổng trọng lượng.

Kiểm tra xem tổng trọng lượng có vượt quá dung lượng của túi không.

Nếu không, so sánh giá trị với giá trị tối ưu tới thời điểm đó và cập nhật nếu cần. 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(2 n ¿,nơi n là số lượng đối tượng Đố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ổng trọng lượng (w) Tổng giá trị (max) ỉ 0 $0

Vậy dễ dàng thấy: giá trị lớn balô có thể chứa là $65 với đồ vật 3 và đồ vật

Số tổ hợp của n đồ vật là 2 n , độ phức tạp thời gian của nó là O(2 n ¿.

Thuật toán BruteForce (Trọng số [1 … N], Giá trị [1 … N]

Tìm sự kết hợp vật phẩm tốt nhất có thể cho KP

• Đầu vào: o Trọng số mảng chứa trọng số của tất cả các mục o 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

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

- 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ả Độ phức tạp cho đoạn code:

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[]).

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

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ượng cao 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 khi chiế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 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ể.

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 vi wi Nếu trọng lượng của đối tượng nhỏ hơn hoặc bằng trọng lượng còn lạ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 đầ

Step 1 Calculate Pi/Wi for all the items

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

Step 3 lấy đồ vật Không vượt quá sức chứa của ba lô, hãy nhét đồ vào ba lô để đạt được lợi nhuận tối đa VẬY KnapSack ={3} vậy balo còn trống 10-4 = 6 Step 4 Tuy nhiên, chiếc ba lô vẫn có thể chứa được trọng lượng 6 kg nhưng vật dụng tiếp theo có trọng lượng 7 kg(item1) sẽ vượt quá sức chứa Vì vậy, trong ba lô chỉ có 6 kg trọng lượng của 7 kg

• 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.

• Tính tỷ số giá trị trên trọng lượng ri = vi / wi, i = 1,…, N, với các hạng mục đã cho

• Sắp xếp các mục theo thứ tự không tăng theo tỷ lệ giá trị trên trọng lượng

PersudoCode for all items do if the current item on the list fits into the knapsack then

• place it in the knapsack else

- Tạo một mảng indices để biểu diễn thứ tự ban đầu của các mục.

- Tiến hành sắp xếp với thuật toán merge sort

- sắp xếp mảng indices để đảm bảo chúng được xử lý theo thứ tự từ cao đến thấp của tỉ lệ này.

- 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

- 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:

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

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ủ 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.

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

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]

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.

V i là giá trị đồ I, w i là trọng lượng đồ i. w i 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 w i cách tối ưu cần chọn có 2 cách sau:

Không chất đồ vật i vào túi do đó cách tối ưu có thể value[i- 1,w]. chất đồ vật i vào túi Khi đó trọng lượng còn lại sẽ được 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- w i ] Và giá trị sẽ được cập nhật V i +value[i−1 , w- w từ đó công thức đệ quy: value[i,w]

{ max ( value value [ i−1 ,w [ i−1 ,w ] , | V i +value[i−1 , w- ] vớiw≤ w i w i ]¿

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

- Nếu trọng lượng w i 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 w i ≤ 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ị

V i với giátrịlớnnhất cóthể đạt được từ {1 ,…i−1}và trọng lượng w i 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 – w i , do đó V i +value[i−1 , w – w

- 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.

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

Giá trị cuối cùng của Table mảng Table (Table [N, Capacity]) chứa giá trị tối ưu

- Tạo một mảng 2 chiều table để lưu trữ các kết quả tạm thời của các bài toán con Kích thước của mảng là (n + 1) x (capacity + 1) để đảm bảo dự trữ cho trường hợp không chọn mục nào hoặc có thể chọn tất cả.

- Lặp qua từng mục và từng dung lượng có thể, cập nhật một bảng 2D với 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.

- 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 Độ phức tạp cho đoạn code:

- 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ều vớ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.

Xây Dựng data và hiện thực thuật toán

- Bộ dữ liệu được lấy từ: https://people.sc.fsu.edu/~jburkardt/datasets/knapsack_01/ knapsack_01.html

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

- Hàm measureRunningTime để tính toán thời gian chạy của thuật toán

- Hiện thực và chạy thuật toán

- Tổng Hợp Kết Quả Chạy với các thuật toán và data trên

Best Value Best weight Time (ns)

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