Hệ thống kiểm kê tự động / tổ chức thông minh?


11

trong tuần qua tôi đã làm việc trên một hệ thống kiểm kê với Unity3D. Lúc đầu, tôi đã nhận được sự giúp đỡ từ những người ở Design3 nhưng không quá lâu cho đến khi chúng tôi chia tay nhau, bởi vì tôi thực sự không thích cách họ làm mã của họ, nó không có mùi OOP nào.

Tôi đã tiến thêm các bước về phía trước - các mục chiếm nhiều hơn một vị trí, hệ thống vị trí nâng cao (các mục cố gắng hết sức để tìm sự phù hợp gần nhất), hệ thống chuột cục bộ (chuột bị kẹt trong khu vực túi hoạt động), v.v.

Đây là bản demo công việc của tôi.

Những gì chúng tôi muốn có trong trò chơi của chúng tôi, là một tính năng tự động tổ chức - không phải tự động sắp xếp. Chúng tôi muốn tính năng này bởi vì kho đồ của chúng tôi sẽ ở trong 'thời gian thực' - không giống như trong Resident Evil 1,2,3, v.v ... nơi bạn sẽ tạm dừng trò chơi và làm mọi thứ trong kho của mình. Bây giờ hãy tưởng tượng bản thân của bạn trong một tình huống dính xung quanh bởi thây ma và bạn không có đạn, bạn nhìn xung quanh, bạn thấy rằng có những viên đạn gần đó trên mặt đất, vì vậy bạn đi tìm chúng và cố gắng nhặt chúng, nhưng chúng không không phù hợp bạn nhìn vào kho của bạn và phát hiện ra rằng nếu bạn sắp xếp lại một số mặt hàng, nó sẽ phù hợp! - bây giờ người chơi - trong tình huống đó không có thời gian để tổ chức lại vì anh ta bị bao vây bởi thây ma và sẽ chết nếu anh ta dừng lại và tổ chức kho đồ để tạo khoảng trống (nhớ kho trong thời gian thực, không tạm dừng) - sẽ không Nó có tốt để điều đó xảy ra tự động không? - Đúng!

(Tôi tin rằng điều này đã được thực hiện trong một số trò chơi như bao vây Dungeon hoặc một cái gì đó, vì vậy chắc chắn rằng nó có thể thực hiện được)

hãy xem bức ảnh này chẳng hạn:

Tự động sắp xếp làm gì

Có, vì vậy, nếu bạn tự động sắp xếp vấn đề, bạn sẽ nhận được không gian của mình nhưng thật tệ vì: 1- Đắt tiền: không cần thao tác toàn bộ để giải phóng các không gian đó, trong ảnh đầu tiên, chỉ cần trượt mục màu đỏ tại từ dưới cùng bên trái và bạn nhận được cùng một không gian mà bạn có được từ sắp xếp tự động. 2- Điều đó gây khó chịu cho người chơi: "Ai F đã bảo bạn đặt lại đồ của tôi?"

Tôi không hỏi "Làm thế nào để viết mã" cho việc này, tôi chỉ hỏi một số hướng dẫn, tìm ở đâu, thuật toán nào có liên quan? Đây có phải là một cái gì đó liên quan đến đồ thị và công cụ đường dẫn ngắn nhất? Tôi hy vọng không phải vì tôi đã không quản lý để tiếp tục học đại học: / Nhưng ngay cả khi đó là, chỉ cần nói với tôi và tôi sẽ học những thứ liên quan.

Lưu ý rằng có thể có nhiều hơn một giải pháp. Vì vậy, tôi đoán điều đầu tiên tôi phải làm là tìm hiểu xem tình huống này có thể giải quyết được không - nếu tôi biết cách xác định liệu một tình huống có thể giải quyết được hay không, thì tôi có thể 'giải quyết' nó. Tôi chỉ cần biết các điều kiện làm cho nó 'có thể giải quyết'. Và tôi tin rằng phải có một số cấu trúc thuật toán / dữ liệu cho việc này.

Đây là một bức ảnh cho nhiều hơn một giải pháp cố gắng để phù hợp với một mục 1x3:

nhập mô tả hình ảnh ở đây

Các mũi tên chỉ hiển thị một trong những giải pháp, nhưng nếu bạn nhìn bạn sẽ tìm thấy nhiều hơn một. Đây là những gì tôi cuối cùng không tự động sắp xếp nhưng tìm một giải pháp và áp dụng nó.

Lưu ý rằng nếu tôi dành thời gian cho nó, tôi sẽ tìm ra cách để giải quyết nó, nhưng nó sẽ không phải là cách tốt nhất, giống như, cầm một bánh xe bằng chân thay vì tay của bạn! XD Hoặc giống như cố gắng giải quyết vấn đề yêu cầu mảng, nhưng bạn chưa nhận thức được sự tồn tại của chúng! Vì vậy, cách tiếp cận đúng cho việc này là gì?

Cập nhật từ Bình luận

@Stephen Tôi thực sự không có chuyên gia về Alogs, bạn đã đề cập đến 'knapsack' và @BlueRaja - Daniel Pflughoeft đã đề cập đến một thuật toán đóng gói thùng rác 2D. Họ bằng cách nào đó có liên quan / giống nhau? - Tôi vẫn bối rối không biết nên tiếp cận cái này như thế nào.

Và vâng, tôi đã sử dụng một "heuristic" nhưng tôi thực sự không biết rằng tôi là: D nó tìm thấy khe cắm có sẵn đầu tiên, và xem liệu vật phẩm đó có phù hợp ở đó không.

Tôi không biết nếu đặt hàng các mặt hàng dựa trên "độ lớn" của chúng (mà tôi gọi là nSlotsRequired = nRowsReq * nColsRec) sẽ hoạt động, vì ví dụ, bạn có một mặt hàng 2x2 và 1x4, chúng có cùng độ lớn, nhưng hình dạng khác nhau và sẽ có một hiệu ứng khác nhau về cách phần còn lại của các mặt hàng tiếp theo sẽ đi. VÌ THẾ... :/

Tôi đã xem video này , tôi thực sự thích ý tưởng đóng gói đầy đủ, nhưng tôi tự hỏi làm thế nào để đi về nó vì hàng tồn kho là 2D. Tôi thậm chí không chắc chắn rằng việc đóng gói bin là chìa khóa ở đây bởi vì, đúng là tôi có thể có nhiều hơn một túi, nhưng trong trò chơi của chúng tôi, nó sẽ chỉ là một túi. Vì vậy, đó là vấn đề lắp đồ trong túi 'một' và không nhiều hơn thế. Vì vậy, các ví dụ trong vid đó (đường ống và xe buýt) không thực sự phù hợp với vấn đề của tôi. Cũng đã xem một số nội dung về thứ ba lô này, tôi không thấy 'giá trị' liên quan đến vật phẩm / hàng tồn kho của tôi như thế nào, nhưng tôi đoán 'trọng lượng' cũng giống như hàng loạt, không chắc chắn.


7
Đây là 2D bin-đóng gói, là NP-Complete. Vì vậy, bất kỳ thuật toán nào sẽ cho bạn biết nếu bạn có thể phù hợp với tất cả các mục sẽ không hiệu quả (trong trường hợp xấu nhất). Bạn có thể tìm thấy một số thuật toán xấp xỉ khá tốt, mặc dù.
BlueRaja - Daniel Pflughoeft

Đây chính xác là lý do tại sao tôi quyết định mô hình khoảng không quảng cáo loại một vị trí (phổ biến hơn hiện nay) thay vì mô hình này. Tôi ước tôi có một giải pháp cho bạn, tôi đã từ bỏ vấn đề này ...
Ryno

@ BlueRaja-DannyPflughoeft Tôi tự hỏi liệu một thuật toán đơn giản / hiệu quả có sẵn nếu các mục bị giới hạn trong một số hình dạng nhất định không?
congusbongus

Hình dạng giới hạn không làm giảm độ phức tạp mà chỉ giúp bạn dễ suy nghĩ hơn nên bạn nghĩ rằng sự phức tạp đã được xử lý, afaik.
Patrick Hughes

@VeXe Xin lỗi tôi đã bỏ lỡ bản cập nhật cho câu hỏi của bạn. Thùng đóng gói và ba lô không giống nhau. Nhưng cả hai đều là vấn đề đóng gói. 'Giá trị' trong trường hợp của bạn là hình dạng và kích thước của các đối tượng kiểm kê của bạn.
Stephen

Câu trả lời:


8

Đây là một biến thể của vấn đề ba lô. Như Daniel Pflughoeft đã đề cập, đó là NP-Complete. Có nghĩa là nó không thể được giải quyết trong thời gian tuyến tính, nếu tôi nhớ chính xác.

Nhưng bạn có thể cố gắng giải quyết điều này trong vài bước. Về cơ bản, đây là một vấn đề sắp xếp.

Tôi sẽ bắt đầu bằng cách tính 'độ lớn' của từng mặt hàng: điều này có thể được tính theo nhiều cách:

  • độ lớn = max (chiều dài, chiều rộng);

  • hàng loạt = chiều dài * chiều rộng

  • hàng loạt = sqrt (chiều dài * chiều rộng)

Sau đó bắt đầu đưa các mặt hàng có điểm số cao nhất đầu tiên vào kho. Vì rất có thể chúng sẽ không vừa với không gian còn lại sau này. Những món đồ nhỏ sẽ vừa vặn luôn.

Bạn cần một heuristic (một cái tên lạ mắt để đoán có giáo dục ;-)) cho chiến lược đặt của bạn. Một cái gì đó như cố gắng để phù hợp với các mục trong khe miễn phí đầu tiên từ trên cùng bên trái hoặc một cái gì đó.

Tôi nghĩ rằng chiến lược phân loại hàng tồn kho của Diablo II có phần giống nhau. Những thứ như kiếm và giáo sẽ kết thúc ở phía trên bên trái, sau đó là quần áo và áo giáp, sau đó là xô và vân vân.

Tôi nghĩ rằng bạn thực sự cần phải thử điều này và tinh chỉnh thuật toán (tính toán khối lượng khác nhau, heuristic khác nhau), cho đến khi nó hoạt động đủ hợp lý.


1
NP-Complete là một tập hợp các vấn đề có độ phức tạp cao hơn đa thức. Đối với một kho lưu trữ tương đối nhỏ (ít hơn hàng nghìn mặt hàng tôi muốn nói :)) thậm chí thuật toán theo cấp số nhân sẽ hoạt động khá nhanh, bởi vì một bước của thuật toán như vậy mất rất ít thời gian. Tuy nhiên, sử dụng ý tưởng của bạn sẽ đủ tốt và dễ dàng hơn so với thực hiện thuật toán lập trình động -> +1
MartinTeeVarga

thx cho upvote. Vâng, hàng tồn kho không nên có khả năng vô hạn nên các thuật toán theo cấp số nhân sẽ hoạt động tốt ^^
Stephen

@ sm4: Một nghìn thường là một con số khổng lồ cho các vấn đề NP-Complete. Hãy nhớ rằng, những vấn đề này là O (2 ^ n) - thậm chí chỉ 2 ^ 64 là không thể tính toán được!
BlueRaja - Daniel Pflughoeft

3

Haha, @ Mọi người đã giúp đỡ, cảm ơn. Tôi quản lý để cuối cùng giải quyết nó. Đây là những gì tôi về cơ bản đã làm:

IEnumerator AddItem_Sorted (Item item)
  1. Điều kiện không quan trọng: kiểm tra xem chúng tôi có các nRequiredSlots tối thiểu để vật phẩm phù hợp không, nếu chúng tôi có nó, hãy tiếp tục ...
  2. chúng tôi sẽ làm trống tất cả các túi - đặt các mục vào một trình giữ chỗ (danh sách hoặc một cái gì đó)
  3. thêm mục mong muốn vào vị trí RẤT cuối cùng / vị trí mà nó có thể phù hợp, đảm bảo chắc chắn rằng nó có dạng nằm ngang
  4. sử dụng thuật toán giảm phù hợp đầu tiên, chúng tôi sẽ thêm phần còn lại của các mục của chúng tôi
  5. trong quá trình thêm, chúng tôi sẽ sử dụng lập trình động (ghi nhớ) để ghi nhớ chỉ mục mà chúng tôi đang thêm vào (chỉ mục của vị trí có sẵn tiếp theo)
  6. nếu tất cả thêm vào là thành công, chúng tôi đã xoay sở để phù hợp với mặt hàng mong muốn của mình và bằng cách nào đó sắp xếp túi - từ các mặt hàng lớn đến nhỏ
  7. nếu chúng tôi không thể thêm tất cả các mặt hàng, điều này có nghĩa là, đây không phải là tình huống có thể giải quyết được, vì vậy chúng tôi phải đưa chiếc túi về trạng thái trước đó
  8. một cách để làm điều đó, (xuất phát từ bề mặt của tôi), là sao chép trạng thái của túi trước toàn bộ sự thay đổi này, và sau đó nếu nó thất bại, chúng tôi sẽ chuyển sang trạng thái trước đó, hoặc thậm chí tốt hơn, trong ' làm trống 'túi, chúng tôi ghi nhớ vị trí của từng vật phẩm, để nếu op thất bại, chúng tôi sẽ lấy lại chúng - sử dụng AddItem (vật phẩm, chỉ mục) - tại các chỉ số trước đó của chúng :)
  9. toàn bộ quá trình này có thể mất thời gian, vì vậy chúng tôi có thể phân chia tải trọng trên các khung riêng biệt, sử dụng năng suất đáng yêu của tôi :)
  10. XONG ! \ m / (@ ~ 9: 00)

CẬP NHẬT:

  1. Tôi đã tạo một mảng lưu trữ các chỉ số của tất cả các mục được thêm vào, theo cách đó tôi không phải đi và tìm các vị trí bị chiếm dụng để tôi được miễn phí - tăng mạnh.

  2. không cần thêm ở vị trí cuối cùng, thực tế đôi khi nó có thể không hoạt động theo cách đó, tôi đã thêm mục mong muốn vào phần còn lại của các mục khác và sắp xếp nó với chúng.

Như bạn có thể thấy từ video, nó cần một chút tối ưu hóa, việc sắp xếp không hoàn hảo, tôi muốn sử dụng đóng gói đầy đủ, nhưng nó đã tham lam hiệu suất. Tôi đang mở cho bất kỳ đề xuất tối ưu hóa, cảm ơn một lần nữa :)


Không có gì! :) Tôi muốn cảm ơn BlueRaja - Daniel Pflughoeft đã đề cập đến việc đóng gói bin, @Stephen cho ý tưởng hàng loạt và Richard Buckland cho bài giảng lập trình năng động của anh ấy, và tất cả các bài giảng.
vexe
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.