Số lượng kết hợp / hoán vị bán ngẫu nhiên được cung cấp một tập các ràng buộc


8

Lý lịch:

Có khoảng 60 sinh viên tại trường nội trú tôi làm việc. Người tư vấn yêu cầu đồng nghiệp của tôi và tôi đưa ra một cách tốt hơn để đưa ra cách sắp xếp chỗ ngồi cho bữa tối hơn là bằng tay. Anh ấy muốn bài tập cho phần còn lại của năm học. Ông cũng yêu cầu chúng tôi cố gắng giải quyết một số vấn đề mà ông đã nghe về các sinh viên và giảng viên.

Các ràng buộc:

  • Hầu hết các sinh viên không đến từ Mỹ, vì vậy khi họ được bao quanh bởi những người có cùng quốc tịch (ví dụ, tại bàn ăn tối), họ nói ngôn ngữ mà họ thông thạo, thay vì thực hành tiếng Anh,
  • Khiếu nại được đưa ra khi học sinh đã ngồi ở một bàn nhất định "quá nhiều" lần,
  • hoặc nếu họ ngồi cùng một bàn nhiều hơn hai lần liên tiếp,
  • và một số học sinh không hợp nhau, vì vậy họ không thể ngồi cùng nhau.

Đầu vào:

Trong thời gian chạy, chương trình được cung cấp với:

  • Một tập hợp những người,
  • Một tập hợp các bảng và
  • Mỗi bàn có số lượng ghế khác nhau (cho phép lặp lại)

Kích thước của cả hai bộ và kích thước của mỗi bảng không thay đổi giữa mỗi lần gán.

Các xét nghiệm:

Tôi đang sử dụng 18 người có quốc tịch khác nhau và bao gồm 4 bảng cỡ 3 đến 6. Tôi đã chọn các số mà tôi nghĩ có ý nghĩa cho tập dữ liệu đó:

  • Không quá 3 người có cùng quốc tịch có thể ngồi cùng một lúc
  • Không ai có thể ngồi vào bàn quá 4 lần

Các kết quả:

Tôi đã chạy trình tạo khoảng 15 lần mà không thay đổi dữ liệu đầu vào. Mỗi lần, nó đi kèm với bất cứ nơi nào từ 6 đến 12 "tuần" bài tập.

Câu hỏi:

(ít nhất là quan trọng nhất)

  1. Tại sao tôi nhận được một số lượng bài tập được tạo khác nhau mỗi khi tôi chạy chương trình? Tập dữ liệu không thay đổi giữa các lần chạy.
  2. Làm thế nào để tôi tìm thấy ...
    • số lượng người tối thiểu có cùng quốc tịch có thể ngồi tại một bàn nhất định
    • số lần tối thiểu của tổng số lần họ ngồi tại một bàn nhất định
    • tối đa hóa số lượng bài tập được tạo ra?
  3. Làm thế nào để tôi đảm bảo rằng đây thực sự là những con số chính xác?

Biên tập:

Mỗi lần tôi tạo một nhiệm vụ mới, tôi gọi Collections.shuffle(List)vào danh sách những người để ngẫu nhiên hóa đơn hàng của họ. Sau đó, tôi chuyển danh sách các bảng và mọi người sang một phương thức quay lui dựa trên triển khai tám nữ hoàng của kapilid trên github để gán mọi người vào các bảng.


Thành thật mà nói bạn có thể thử math.se, đây là một số toán học khá phức tạp.
Ryathal

@MatthewD Câu hỏi của bạn rất tốt ở đây và vì bạn đã tìm thấy câu trả lời nên tôi không hiểu tại sao chúng ta nên di chuyển nó. Nếu bạn muốn có câu trả lời toán học hơn, bạn có thể đăng lại nó trên Toán học , nhưng vui lòng đảm bảo làm cho câu hỏi phù hợp với trang web (đọc Câu hỏi thường gặp của họ để biết thêm), đừng chỉ sao chép dán nó. Nói chung, chúng tôi không thích có cùng một câu hỏi (hoặc các phiên bản rất giống nhau) trên nhiều trang web, nhưng dường như câu hỏi của bạn thuộc chủ đề cho cả hai trang web. nó có thể hoạt động trên môn Toán với những thay đổi tối thiểu.
yannis

Câu trả lời:


4

Cập nhật:

Tôi nhận ra tôi đã không trả lời trực tiếp câu hỏi của bạn. Tôi cho rằng nó giúp đọc tất cả các câu hỏi trước khi đưa ra câu trả lời ...

  1. Bạn không chỉ định thuật toán nào bạn đang sử dụng để tạo ra sự sắp xếp chỗ ngồi. Có lẽ có một số yếu tố của tính biến đổi / ngẫu nhiên để tạo ra các bài tập khác nhau trong suốt thời hạn của thuật ngữ. Sự ngẫu nhiên đó rất có thể là lý do tại sao bạn nhận được kết quả khác nhau trên mỗi lần chạy. Tôi đánh dấu rằng working as designedthay vì một lỗi.

  2. a. Bạn không chỉ định thuật toán, vì vậy chúng tôi không thực sự biết. Chúng tôi cũng không biết số lượng cho mỗi quốc tịch. Theo logic đơn giản, 0 hoặc 1 sẽ là mức tối thiểu tuyệt đối trong một bảng, nhưng tôi nghi ngờ điều đó không hữu ích cho bạn. Cuối cùng, nó phụ thuộc vào số lượng của mỗi quốc tịch và cách họ điền vào các bảng khác.
    b. Chạy chương trình của bạn, ném kết quả vào cơ sở dữ liệu hoặc bảng tính và tính nó cho bạn. Hoặc thay đổi chương trình để theo dõi những điều đó.
    c. Câu trả lời ở đây sẽ phụ thuộc vào số lượng của mỗi quốc tịch và các ràng buộc khác mà bạn cung cấp. Kích thước bảng cũng sẽ ảnh hưởng đến nó. Câu trả lời cho phần này thực sự chỉ là một phép nhân số lượng hoán vị tiềm năng. May mắn thay (đối với tôi) đây là một trang web về lập trình, không phải số liệu thống kê.

  3. Bạn có hai vấn đề cần giải quyết ở đây. Đầu tiên là xác nhận rằng các ràng buộc của bạn phản ánh chính xác thực tế của tình huống. Nói chuyện với nhân viên tư vấn để xác minh các ràng buộc của bạn là chính xác. Thứ hai là xác minh kết quả của bạn đáp ứng các ràng buộc của bạn. Viết một số phương pháp kiểm tra biểu đồ chỗ ngồi được trả về cho các ràng buộc bạn cung cấp. Và / hoặc kiểm tra thủ công các biểu đồ để xác minh xem chúng có ổn không.


Đây Câu hỏi SO có một câu hỏi tương tự và cho rằng đây là tương đương với vấn đề bin đóng gói hoặc các bài toán xếp ba lô

Câu hỏi SO Ghế khách này dựa trên các thông số ưu tiên dường như giải quyết chính xác những gì bạn đang tìm kiếm.

Câu hỏi SO này thảo luận về các vấn đề mà tác giả gặp phải khi giải quyết vấn đề này bằng thuật toán đóng gói. Tôi khuyên bạn nên đọc câu trả lời để hiểu rõ hơn về cách làm việc xung quanh chúng.

Và đối với tham chiếu xkcd bắt buộc, đây là một liên kết từ các diễn đàn của họ thảo luận về tối ưu hóa kế hoạch chỗ ngồi và sử dụng thuật toán di truyền đã sửa đổi để giải quyết vấn đề.

Nếu đây là một kịch bản có thật, thì tốt nhất là may mắn. Và nếu đây chỉ là bài tập về nhà thì bạn đã có quá nhiều tài liệu để đưa bạn về phía trước.


Cảm ơn bạn đã liên kết! :) (Xem bản chỉnh sửa của tôi để biết cách tôi tạo các bài tập)
Matthew D

@MatthewD - có vẻ như sự ngẫu nhiên mà bạn đang thấy / hỏi về là có chủ ý và được mong đợi. Không có những ràng buộc khác của bạn, có 60! hoán vị của danh sách học sinh bạn đang sử dụng để điền vào các bảng. Các ràng buộc khác của bạn sẽ cắt giảm số lượng hoán vị tối đa, nhưng đó là điểm khởi đầu khá lớn.

Liên kết này bạn đã đề xuất "chọn bảng có ít thành viên không mong muốn nhất". Tôi đã làm điều đó, và bây giờ nó liên tục tạo ra các giải pháp bất kể tôi bảo nó tạo ra bao nhiêu tuần. Tôi sẽ chơi với cách tôi thực hiện nó, cũng như xem xét bao nhiêu lần nó không tìm thấy một kết hợp hoàn hảo, nhưng cho đến nay, có vẻ như nó đang hoạt động. Cảm ơn rât nhiều!
Matthew D

Một trong những câu trả lời trong các câu hỏi SO nói rằng đó là một vấn đề khó NP, lịch sự vì "có thể không (hoàn toàn) có thể giải quyết được." Nếu đó là những gì bạn cuối cùng gặp phải thì bạn có thể gian lận vấn đề để nó giải quyết, hãy nói với nhân viên tư vấn về vấn đề đó và tiến về phía trước.
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.