5
input: 
max_weight = 550 
n = 4 
x_i = [120, 175, 250, 150] 

output: 
2 
// [[250, 175, 120], [150]] 

Ấn tượng ban đầu của tôi là trông rất giống với vấn đề thay đổi đồng xu/lập trình động, tuy nhiên nó không phải là đồng xu thay đổi (mà sẽ yêu cầu số lượng trọng lượng nhỏ nhất để tạo ra số tiền chính xác), và nó không phải là ba lô (trọng số không có giá trị và nó giống như tôi có thể có nhiều hơn 1 chiếc ba lô).Với thang máy có trọng lượng tối đa và n người có trọng lượng x_i, hãy tìm số lượng chuyến đi tối thiểu cần thiết

Có một tên/giải pháp chung cho vấn đề này không?

+0

Có vẻ như đây chỉ đơn giản là đóng gói thùng –

Trả lời

2

Đây thực sự là một (1D) Bin Packing problem:

Trong vấn đề bin đóng gói, vật khối lượng khác nhau phải được đóng gói vào một số hữu hạn các thùng hoặc container mỗi khối lượng V một cách rằng giảm thiểu số lượng thùng được sử dụng. Trong lý thuyết phức tạp tính toán, nó là một vấn đề NP-hard tổ hợp.

Ở đây những người lập bản đồ trên các đối tượng trên thùng trên các chuyến đi. Giống như vấn đề đóng gói thùng rác, chúng tôi muốn giảm thiểu số lần cưỡi "được sử dụng" và mỗi người chiếm một "khối lượng" nhất định (trọng lượng của người đó).

Sự cố đóng gói thùng rác - như đã nói trong bài viết - NP-hard. Chúng ta có thể sử dụng lập trình động (nhưng nó vẫn có - trường hợp xấu nhất - thời gian mũ).

Giấy A New Algorithm for Optimal Bin Packing bởi Richard E. Korf thảo luận một thuật toán để giải quyết vấn đề này chính xác. Nó hoạt động bằng cách sử dụng phương pháp heuristic đầu tiên và tính toán giới hạn dưới, sau đó sử dụng nhánh và liên kết để lặp đi lặp lại lấy được một giải pháp tốt hơn so với phương pháp heuristic cho đến khi đạt tới giới hạn dưới, hoặc không tìm thấy giải pháp nào nữa.

0

Hãy sửa tôi nếu tôi sai (không hiệu quả nhất), nhưng tôi nghĩ bạn có thể đặt tất cả các trọng số vào max heap và sau đó sử dụng greedy algorithm để chọn các bộ.

+1

, giả sử thứ tự của các cá nhân không tạo sự khác biệt, (người đến thang máy trước), thì tôi phải đồng ý với Sritej, nó giống như một thuật toán tham lam với tôi ... và tôi tin nó là hiệu quả nhất quá – brw59

+6

Giả sử giới hạn trọng lượng là 7, và những người cân nặng [3, 3, 2, 2, 2, 2]. Sau đó, câu trả lời tối ưu là 2, nhưng thuật toán của bạn cho 3. – ruakh

+0

@ruakh Bạn hoàn toàn đúng. Thuật toán tham lam thất bại rất nhiều thời gian vì những loại trường hợp =/ –

0

Bạn đang đi đúng hướng. Vấn đề được giải quyết bằng thuật toán thay đổi tiền xu thay đổi: thay vì yêu cầu một giải pháp chính xác, bạn sẽ tìm thấy giải pháp đạt được tổng số cao nhất mà không vượt quá số tiền mục tiêu. Tất nhiên, nếu bạn tìm thấy một giải pháp mà thiếu hụt là ít hơn bất kỳ yếu tố thiết lập còn lại, bạn dừng lại và báo cáo giải pháp đó.

Khi bạn tìm thấy giải pháp, hãy xóa trọng số "đã sử dụng" và lặp lại cho đến khi bạn đã phân bổ tất cả. Số lần lặp lại là số lượng thang máy bạn cần.

Nếu bạn sắp xếp các phần tử theo thứ tự giảm dần, điều này sẽ mang lại cho bạn sự bắt đầu "tham lam" với tính năng quay lại. Tôi nghi ngờ rằng điều này là hợp lý gần với tối ưu cho nhiều trường hợp, đặc biệt là nếu bạn ghi nhớ các kết quả để bạn không lặp lại những sai lầm trong lần lặp tiếp theo.

Bạn có thể thử một số trường hợp bệnh lý, chẳng hạn như một giới hạn là 100, và trọng lượng cực đoan như

[93, 91, ..., 5, 4, 4] 

Các "tham lam" thuật toán đi cho 93 + 5 đầu tiên, nhưng sau đó giải quyết cho 91 + 4 + 4 (giải pháp gần hơn). Đây là nơi memoization có ích.

Điều đó có dẫn bạn đến một giải pháp không?

+1

Điều này có thể đưa ra câu trả lời sai trong một số trường hợp. Giả sử giới hạn trọng lượng là 14 và những người cân nặng [10, 6, 6, 6, 6, 3, 2, 2]. Sau đó, câu trả lời đúng là 3 (10 + 3, 6 + 6 + 2, 6 + 6 + 2), nhưng cách tiếp cận của bạn có thể cho 4 (10 + 2 + 2, 6 + 6, 6 + 6, 3). – ruakh

+0

Kiểm tra tốt! Điều này * sẽ * đưa ra câu trả lời sai trong trường hợp đó. Vấn đề xuất hiện giống như bạn đã xây dựng nó: khi những giá trị nhỏ này rất quan trọng để tìm kiếm các giải pháp tối đa "giá trị trung bình" hơn so với thứ tự "lớn nhất đầu tiên" sẽ nhận được. – Prune

Các vấn đề liên quan