Vấn đề hôn nhân ổn định


12

Lý lịch

Giả sử rằng có những 2*nngười kết hôn và giả sử rằng mỗi người bị thu hút bởi chính xác nnhững người khác dưới những ràng buộc rằng:

  1. Thu hút là đối xứng ; tức là nếu người đó Abị thu hút bởi người đó B, thì người đó Bbị thu hút bởi người đó A.
  2. Thu hút là chống độc quyền ; tức là nếu người Avà người Bmỗi người bị thu hút bởi người C, thì người Avà người Bkhông bị thu hút lẫn nhau.

Do đó, mạng lưới các điểm tham quan tạo thành biểu đồ lưỡng cực hoàn chỉnh (không bị ngăn chặn) Kn,n. Chúng tôi cũng cho rằng mỗi người đã xếp hạng những người mà họ bị thu hút. Đây có thể được biểu diễn dưới dạng trọng số cạnh trong biểu đồ.

Một cuộc hôn nhân là một cặp đôi (A,B)ở đâu ABđang thu hút lẫn nhau. Cuộc hôn nhân không ổn định nếu có một cuộc hôn nhân khác mà một người trong mỗi cuộc hôn nhân có thể ly dị bạn đời và kết hôn với nhau và cả hai kết thúc với một người mà họ xếp hạng cao hơn so với người bạn đời cũ.

Mục tiêu

Nhiệm vụ của bạn là viết một chương trình hoặc chức năng hoàn chỉnh, lấy sở thích của mỗi người làm đầu vào và đưa ra một cuộc hôn nhân cho mỗi người để mỗi cuộc hôn nhân ổn định.

Đầu vào

Đầu vào có thể ở bất kỳ định dạng thuận tiện; ví dụ: biểu đồ có trọng số, danh sách ưu tiên theo thứ tự, từ điển / giả định, v.v. Bạn có thể tùy ý lấy tổng số người làm đầu vào, nhưng không cho phép đầu vào nào khác.

Đầu ra

Đầu ra cũng có thể ở bất kỳ định dạng thuận tiện; ví dụ: danh sách các bộ dữ liệu, bìa cạnh tối thiểu , chức năng liên kết với mỗi người bạn đời của họ, v.v ... Lưu ý rằng hạn chế duy nhất là mỗi cuộc hôn nhân ổn định, không có yêu cầu tối ưu nào khác.

Ghi chú

  1. Bạn có thể tìm thêm thông tin và O(n^2)thuật toán để giải quyết vấn đề này trên Wikipedia hoặc video Numberphile này . Bạn có thể tự do sử dụng bất kỳ thuật toán, tuy nhiên.
  2. Sơ hở tiêu chuẩn bị cấm.
  3. Đây là . Câu trả lời ngắn nhất (tính bằng byte) thắng.

15
Thu hút là đối xứng Hà!
Luis Mendo

5
@LuisMendo Tôi đang tiếp tục truyền thống lưu trữ các vấn đề từ ngữ không thực tế :)
ngenisis

2
Đó là ngày lễ tình nhân (UTC + 8 tại đây)
busukxuan

Câu trả lời:


7

Toán học, 28 byte

Trên sẽ nghĩ, đây là gian lận. Tôi cho bản thân mình như thế này:

Combinatorica`StableMarriage
  • Cần phải được gọi với ma trận trọng lượng của các sở thích cho nam giới và phụ nữ.
  • Trả về các chỉ số trực tiếp cho khớp nối.

(Có Combinatoricakhông dùng nữa nhưng chi phí ít byte hơn FindIndependentEdgeSet)


Ví dụ (giống như GoT): (Công bằng mà nói - tôi đoán trọng lượng ... nhưng tôi ổn với kết quả)

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

m = {{2, 4, 3, 1}, {1, 2, 4, 3}, {3, 2, 1, 4}, {4, 2, 1, 3}};
w = {{2, 3, 4, 1}, {3, 2, 1, 4}, {3, 2, 4, 1}, {4, 1, 2, 3}};
result = Combinatorica`StableMarriage[w, m];
MapThread[
  UndirectedEdge[Show[#1, ImageSize -> 130], 
    Show[#2, ImageSize -> 130]] &, {names1, 
   names2[[result]]}] // TableForm

Blockquote


3
+1 để khai thác thư viện sử thi của Mathicala về các hàm golf vô dụng cho mọi người ngoại trừ mã.
SIGSTACKFAULT

2
Tôi cần có thói quen không cho phép tích hợp ngay cả khi tôi tự tin rằng nó không tồn tại :)
ngenisis

Đừng bao giờ đánh giá thấp các Mathicalas tích hợp; D
Julien Kluge
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.