Du lịch với con đường hiệu quả nhất


7

Một người bạn của tôi thực sự đã hỏi tôi một câu hỏi liên quan đến khoa học máy tính rất thú vị và tôi đã bị mắc kẹt trong một thời gian dài.

Vấn đề là: bạn phải đi km. Trạm xăng duy nhất là ở điểm bắt đầu. Dung tích bình xăng tối đa của bạn chỉ đủ cho km di chuyển, bạn được phép "chôn" nhiên liệu giữa hành trình và để dành nó sau này.100050

Ví dụ, bạn có thể di chuyển km trước và chôn nhiên liệu trị giá km ở đó, sau đó quay lại tiếp nhiên liệu, vì vậy lần sau bạn có thể lấy lại km nhiên liệu bạn còn lại và tiếp cận với nó.201010

Bạn cần tìm cách hiệu quả nhất để đến đích.

Những gì tôi nghĩ là sử dụng lập trình động, tuy nhiên bạn phải giả sử quãng đường bạn đi trước mỗi lần bạn tiếp nhiên liệu là một số nguyên tính theo km, khác với bạn, thật khó để làm điều đó với DP, tôi chưa thử lập trình tuyến tính , nhưng tôi nghĩ rằng nó có thể.

Bạn có bất cứ ý tưởng làm thế nào để làm điều đó? Hoặc bất kỳ gợi ý?

Quan trọng nhất là loại vấn đề cs là gì? NP có khó không? Là nó có thể giải quyết bằng máy hoặc nó là một vấn đề toán học nhiều hơn?

Một số suy nghĩ khác:

  • Vì nó là một con đường liên tục, hỏi liệu nó có phải là NP hơi ngớ ngẩn không, nhưng tôi vẫn rất tò mò.
  • 1000 và có thể được chọn có chủ ý để tránh tính toán phức tạp.50
  • Có một giải pháp tham lam? Tôi chưa thể nghĩ ra cái nào cả.
  • Bây giờ tôi nghĩ nó nhiều hơn về một vấn đề tìm mẫu mô hình toán học, mặc dù bạn tôi tuyên bố đó là vấn đề cs, vì vậy tôi quyết định giữ bài đăng này.

Và nếu bạn có bất kỳ bài báo khoa học hoặc sách giáo khoa nào liên quan đến vấn đề này, xin vui lòng cho tôi biết, tôi không biết bắt đầu từ đâu ngay từ đầu.


3
Suy nghĩ đầu tiên của tôi là tìm kiếm A * có thể sẽ làm khá tốt vấn đề này.
Bút danh

Câu trả lời:


5

Ý tưởng cơ bản là thực hiện chuyến đi, trở lại bắt đầu và tiếp nhiên liệu cho tất cả trừ chuyến đi cuối cùng. Trong mỗi chuyến đi nhưng lần cuối cùng, bạn sẽ để lại một ít nhiên liệu tại một bãi chứa mới. Bạn muốn biết bạn có thể đi bao xa trong chuyến đi cuối cùng. Để thực hiện các phép tính dễ dàng, chúng tôi sẽ nói rằng một bình chứa đầy 1 (đơn vị) nhiên liệu và lượng đó sẽ đưa bạn khoảng cách 1 (đơn vị khác) khoảng cách.n

Ví dụ 1 ( chuyến). Trivial: lái xe cho đến khi bạn hết nhiên liệu. Khoảng cách bao phủ .n=1D(1)=1

Ví dụ 2 ( ). Trong chuyến đi đầu tiên, hãy di chuyển khoảng cách, vì vậy bạn sẽ còn lại nhiên liệu. Để lại nhiên liệu vừa đủ ở bãi 1 để cho phép bạn quay lại điểm bắt đầu. Để lại ở bãi 1 sẽ thực hiện thủ thuật. Trong chuyến đi thứ hai, bắt đầu với một bình xăng đầy, đi đến bãi chứa thứ nhất (sử dụng nhiên liệu của bạn), đổ hết bình xăng của bạn (lấy từ bãi rác, để lại ) và lái xe cho đến khi bạn hết nhiên liệu. Để tối đa hóa khoảng cách, chúng ta sẽ cần bãi chứa trống để , vì vậy . Tổng khoảng cách bạn sẽ đi sẽ là .n=2x1x12xxx13x13x=0x=1/3D(2)=1+1/3

Các trường hợp chung . Với chuyến đi, bạn sẽ đạt được kết quả 1 lần, đổ 2 lần, đổ 3 lần, v.v. Để dọn sạch các bãi rác trong chuyến đi vừa qua, chúng tôi sẽ đặt bãi rác 1 ở khoảng cách , đổ 2 ở khoảng cách xa hơn , v.v. Sau đó, chuyến đi cuối cùng sẽ bao gồm Nếu chúng ta xác định - thứ số hòa , thì ai cũng biết rằng và chúng ta có thể viết khoảng cách của mình n2n12n32n51/(2n1)1/(2n3)

D(n)=1+13+15++12n1
m
Hm=1+12+13+14+15++1m
Hmlnm
D(n)=1+13+15++12n1=(1+12+13++12n1)(12+14++12n2)=H2n112Hn1
Việc này sẽ mất một lượng chuyến đi (và nhiên liệu) theo cấp số nhân trong khoảng cách mong muốn. Ví dụ: để đi được quãng đường , sẽ mất chuyến và để đi được quãng đường sẽ mất chuyến.2n=853093

Điều này (và một biến thể) được gọi là vấn đề xe jeep và được đề cập chi tiết hơn ở đây .


1
Tôi đã thực hiện một chương trình java đơn giản để chạy cái này, để đi được quãng đường 5, nó cần 3093 chuyến đi, sự thật tuyệt vời :). Và để hoàn thành hành trình 1000 km đó, phải mất hơn chuyến đi. 1048
HenryHey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.