Tìm xem ai là người mua bánh sừng bò


9

Một nhóm đã quyết định rằng mỗi buổi sáng ai đó nên mang bánh sừng bò cho mọi người. Không nên cùng một người mỗi lần, vì vậy cần có một hệ thống để xác định lượt tiếp theo của ai. Mục đích của câu hỏi này là để xác định một thuật toán để quyết định lượt của nó sẽ mang bánh sừng bò vào ngày mai.

Những ràng buộc, giả định và mục tiêu:

  • Ai sẽ mang bánh sừng bò vào buổi chiều hôm trước.
  • Vào bất kỳ ngày nào, một số người vắng mặt. Thuật toán phải chọn ai đó sẽ có mặt vào ngày hôm đó. Giả sử rằng tất cả sự vắng mặt được biết trước một ngày, vì vậy người mua bánh sừng bò có thể được xác định vào chiều hôm trước.
  • Nhìn chung, hầu hết mọi người có mặt vào hầu hết các ngày.
  • Vì lợi ích của sự công bằng, mọi người nên mua bánh sừng bò nhiều lần như những người khác. (Về cơ bản, giả sử rằng mọi thành viên trong nhóm đều có cùng số tiền để chi cho bánh sừng bò.)
  • Sẽ thật tốt nếu có một số yếu tố ngẫu nhiên, hoặc ít nhất là cảm nhận được sự ngẫu nhiên, để làm giảm bớt sự nhàm chán của một danh sách. Đây không phải là một hạn chế cứng: nó là một đánh giá thẩm mỹ nhiều hơn. Tuy nhiên, cùng một người không nên được chọn hai lần liên tiếp.
  • Người mang bánh sừng bò nên biết trước. Vì vậy, nếu người P mang bánh sừng bò vào ngày D, thì thực tế này nên được xác định vào một ngày trước đó, nơi người P có mặt. Ví dụ, nếu người bán bánh sừng bò luôn được xác định ngày hôm trước, thì đó phải là một trong những người có mặt ngày hôm trước.
  • Số lượng thành viên trong nhóm đủ nhỏ để tài nguyên lưu trữ và tính toán có hiệu quả không giới hạn. Ví dụ, thuật toán có thể dựa vào một lịch sử đầy đủ về người đã mang bánh sừng bò khi trong quá khứ. Lên đến vài phút tính toán trên PC nhanh mỗi ngày sẽ ổn.

Đây là mô hình của một vấn đề trong thế giới thực, vì vậy bạn có thể tự do thách thức hoặc tinh chỉnh các giả định nếu bạn nghĩ rằng họ mô hình hóa kịch bản tốt hơn.

Nguồn gốc: Tìm hiểu xem ai sẽ mua bánh sừng bò của Florian Margaine . Cải cách của tôi ở đây có yêu cầu hơi khác nhau.


1
Chính xác câu hỏi là gì? Chúng ta có thể cho rằng mọi người vắng mặt ít nhiều cùng một số tiền không? Có gì sai khi lấy người thực hiện việc này ít nhất, hoặc đơn giản là một người ngẫu nhiên?
Pål GD

@ PålGD Giả sử rằng mọi người vắng mặt với cùng số tiền sẽ là một sự đơn giản hóa. Làm điều đó nếu bạn muốn, nhưng nếu thuật toán của bạn hoạt động cho bộ định thời, thì tốt hơn. Lấy người thực hiện việc này ít nhất là một giải pháp (mặc dù lưu ý yêu cầu mà họ biết trước một ngày, nhưng điều đó làm cho giải pháp không hoàn toàn tầm thường). Một người ngẫu nhiên cũng có thể làm việc, nhưng tính ngẫu nhiên đưa ra sự sai lệch so với sự công bằng mà bạn có thể muốn ràng buộc.
Gilles 'SO- ngừng trở nên xấu xa'

Gì? Không có hình ảnh chảy nước miếng? Bạn muốn chúng tôi nô lệ ở bàn làm việc toán học thay vì trượt ra tiệm bánh?
Caleb

@Gilles - FYI, đang chạy thử nghiệm trên P.SE với phiên bản câu hỏi này của bạn . Bây giờ cả hai trang web đều cũ hơn một chút, tôi tò mò muốn xem câu trả lời của mỗi cộng đồng hình thành như thế nào.

Câu trả lời:


7

Có hai loại giải pháp cho loại vấn đề này mà tôi biết: xổ số thiên vịcác chuỗi ngẫu nhiên được lọc / tạo .

Trước tiên, hãy phân phối với các giải pháp dễ dàng nhưng sai lầm mà không có trạng thái. Bất kỳ giải pháp kiểu xổ số nào không duy trì trạng thái sẽ có số lần thắng trong phân phối nhị thức, không đạt tiêu chí "nhiều lần". Bạn có thể chọn một chuỗi ngẫu nhiên chọn tất cả mọi người như nhau (chỉ cần đi xung quanh danh sách đó; hoán vị cung cấp tính ngẫu nhiên), nhưng một khi mọi người bắt đầu đi nghỉ thì trình tự của bạn bây giờ có lỗ hổng. Trừ khi bạn theo dõi, một lần nữa bạn sẽ thấy mình với các phân phối nhị thức thay vì duy trì nỗ lực như nhau.

Chúng ta cũng cam kết có sự ngẫu nhiên thực tế. Bạn có thể muốn điều này, ví dụ, một người không thể lên lịch cho kỳ nghỉ của họ trên cơ sở thuật toán xác định để họ không bao giờ có mặt khi đến lượt mua bánh sừng bò (cho đến khi họ sử dụng hết ngày nghỉ, tôi cho rằng) .

Vì vậy, về hai loại giải pháp.

  1. Để xây dựng một xổ số thiên vị, đầu tiên lưu ý rằng chúng ta có thể chọn từ bất kỳ phân phối liên tục nào (với độ lệch hữu hạn) để tạo số cho xổ số của chúng tôi. Người thua cuộc sau đó có thể là người có số thấp nhất. Sau đó, xu hướng đơn giản nhất là theo dõi xem mỗi cá nhân đã mua nhiều hơn hoặc ít hơn so với chia sẻ của họ. Bạn có thể đo độ lệch theo đơn vị croissant. Bạn có thể điều chỉnh mức độ ngẫu nhiên bằng cách thay đổi độ rộng và hình dạng của phân phối - điều này cũng sẽ xác định khoảng cách mà bất kỳ cá nhân nào có thể nhận được từ "cùng một số lần". Gaussian là dễ dàng; chúng cho phép bất ngờ hợp lý mà không có đuôi quá dài ("không công bằng"). Vì vậy, hình dạng cơ bản của giải pháp là (theo mã Scala)

    case class Employee(var bias: Double) {
      def eat         { bias -= 1 }
      def buy(n: Int) { bias += n }
      def roll        = bias + stdev * Random.nextGaussian
    }
    

    Bạn có thể theo dõi những người đã mua lần cuối và cho họ một phần thưởng thiên vị khổng lồ (ví dụ 10*stdev) để ngăn mọi người mua hai lần liên tiếp trong trường hợp cạnh trong đó cấu trúc kỳ nghỉ cho phép mọi người đã mua "lần cuối". (tức là bạn mua, sau đó đi nghỉ.) Điều tương tự cho việc không có mặt vào ngày họ được chọn. (Nếu ai đó vắng mặt mỗi ngày, cuối cùng họ sẽ xuất hiện khi họ đốt cháy phần thưởng thiên vị của họ; tôi coi đây là một tính năng chứ không phải là một lỗi.)

    Vì vậy, bạn thu thập danh sách các nhân viên hiện tại của bạn trong ngày, để tất cả họ tham gia xổ số, chọn mức thấp nhất và cập nhật. Bạn có thể chọn có tiền thưởng mua bằng số lượng nhân viên (tốt khi chi phí không đáng kể nhưng chuyến đi để nhận bánh sừng bò là gánh nặng), số lượng nhân viên có mặt (tốt nếu chuyến đi dễ dàng nhưng chi phí là gánh nặng ), hoặc một cái gì đó ở giữa (để thừa nhận cả hai gánh nặng). Có lẽ tốt hơn là chỉ có hình phạt "ăn" cho những người có mặt, nhưng bạn có thể làm theo cách đó nếu bạn cảm thấy rằng chỉ đơn giản là trong kỳ nghỉ không cung cấp cho bạn một mức độ phù hợp trong ít hơn.

  2. Để xây dựng một chuỗi ngẫu nhiên được lọc, trước tiên bạn cần tạo một chuỗi ngẫu nhiên. Xáo trộn một danh sách các nhân viên là một cách tốt như bất kỳ để bắt đầu. Chỉ cần đi qua danh sách, theo thứ tự, từ ngày này sang ngày khác. Nếu ai đó không thể mua vì họ vắng mặt hoặc không thể được nói hoặc mua trước đó, hãy bỏ qua họ. Bây giờ bạn có một vấn đề: bạn đang tích lũy những người đã bị bỏ qua. Mặc dù vậy cũng không sao. Khi bạn kết thúc chuỗi của mình, hãy thêm danh sách các nhân viên bị bỏ qua vào danh sách đầy đủ trước khi xáo trộn. Bây giờ xác suất xuất hiện tỷ lệ thuận với số lần bạn bị bỏ qua, duy trì thuộc tính "cùng số lần".

    đăng nhập2(N)NN!NNđăng nhập2[(N!NN)1/N]-1đăng nhập(2)+đăng nhập22π/NN-1,4NN= =10 1,14

Cá nhân tôi ủng hộ giải pháp xổ số thiên vị vì sự kiểm soát ngẫu nhiên là tốt hơn. Với các chuỗi được lọc, bạn có thể đưa ra các cách phức tạp hơn để tạo các chuỗi. Ví dụ, thay vì hoán vị ngẫu nhiên, thực hiện hoán đổi cục bộ đến một khoảng cách nhất định hoặc cho phép hoán đổi hoàn toàn mọi người ra khỏi hồ bơi (nhưng họ đi vào danh sách bị bỏ qua) nhưng những điều này đòi hỏi nhiều nỗ lực thuật toán hơn. Với xổ số, bạn chỉ cần điều chỉnh độ lệch chuẩn.


4

{P1,...,Pn}vik1Pik10

tôivk= =ΣTôi= =1n(vTôik)tôi

kTôi1-(vTôik)tôivk

P1

P1

v

vTôikkvk

PTôi

PTôik+1kPjPj

PTôivTôik

Và khi điều này diễn ra mãi mãi, họ sống hạnh phúc, chia sẻ giá của bánh sừng bò.

P1tôitôitôi= =ktôi

P1P2

P1vTôik

Ps: Xin lỗi vì tiếng Anh không tốt nhưng tôi không phải là người bản ngữ và đã muộn ... xin vui lòng sửa lỗi (và có thể thêm các gia vị vào câu chuyện ...)


2

Mỗi lần lặp bạn có

  • Danh sách những người có mặt và sẵn sàng mua
  • Người mua trước

Nếu bạn chọn một người ngẫu nhiên trong số những người trong danh sách và loại trừ người mua trước đó, bạn sẽ đạt được mục tiêu của mình:

  1. Thuật toán là "tối đa" ngẫu nhiên khi chúng tôi sử dụng lượng thông tin tối thiểu từ lần lặp trước và chọn ngẫu nhiên.
  2. Trung bình mọi người trả tiền cho bánh sừng bò (N / (N-1)) mỗi khi họ tham gia vào một trích xuất làm cho thuật toán công bằng nhất có thể.
  3. Tôi sẽ đề nghị loại bỏ quy tắc không lặp lại để làm cho điều này tối đa ngẫu nhiên.

Các thuật toán khác mà tôi thấy được đề xuất là ít ngẫu nhiên hơn hoặc kém công bằng hơn:

  1. Các thuật toán "xáo trộn sàn" không thực sự ngẫu nhiên theo nghĩa xác suất phải trả là không đổi (1 / N trong lần chọn đầu tiên, 1 / (N-1) trong lần thứ hai ... 1 ở lượt chọn thứ N - - nếu chưa được chọn). Hơn nữa, nếu bạn được chọn trước, bạn hoàn toàn không có cơ hội được chọn cho N lần tiếp theo. Hệ thống dễ dàng bị phá vỡ bằng cách vào hiếm khi cho đến khi được chọn và sau đó liên tục.

  2. Các thuật toán "bù" cố gắng chủ động làm cho mọi người có cùng số lượng bánh sừng bò thay vì dựa vào các thuộc tính của các số ngẫu nhiên không phải là ngẫu nhiên hoặc công bằng (hoặc cả hai).


NmN/m1

N

@RexKerr tại sao bạn sẽ mua nhiều bánh sừng bò hơn nhân viên?
Sklivvz

Tôi bối rối. Tôi đã đề nghị một người sẽ ở đâu?
Rex Kerr
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.