- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
我正在考虑让玩家加入游戏的高效算法。由于会有大量玩家,因此算法应该是异步的(即可扩展到集群中任意数量的机器)。有细节:想象有一个无向图(每个节点都是一个玩家)。玩家之间的每条边意味着玩家可以参加同一场比赛,如果没有边则他们不能。我需要实现按照以下标准对玩家进行分组的算法:
我对实现的看法:该图将通过 NoSQL 数据库(来自集群中的不同机器)存储和访问。目前还没有特定的模式(有什么建议吗?)。此外,锁定对单个玩家的访问权限(又名悲观锁)也不是一种选择,因为它是减慢将尝试访问/收集相同玩家的其他进程的潜在瓶颈。
我的问题是:有人实现过这样的算法吗?有什么建议吗?
PS:我已经有了初步的想法,但首先想讨论/检查人们的建议。
Cảm ơn!
编辑1:回应 Thomas Jungblut:使用游戏老虎机是一个有趣的想法,但(只要我理解正确)它在某些情况下可能行不通。 Fox 示例:每场比赛应该正好有 3 名球员。新的 6 名玩家(我们称他们为 A B C D E F,参见示例 1)按以下顺序一一进入图表/队列:A、B、E、F、C、D。
结果只会创建一个游戏(A、B、C),外加 2 个空槽的游戏:(D) 和 (E, F)。但最佳应该是 2 场比赛:(A, C, D) 和 (B, E, F),对吧?
câu trả lời hay nhất
我怀疑您没有正确考虑业务需求。
像带有任意条件的“最佳匹配”这样的短语对我来说是 NP 完全的。对于其中一个具有大型数据集的问题,您不会找到有效的精确解决方案,而只能找到合理的近似值。
次优匹配的成本是多少?您最终不得不等待更长的时间才能找到有人玩。不是真正的问题。
我会实现像这样简单的东西。有一个你正在设置的游戏队列。每个进来的人都试图进入第一场比赛,失败的是第二场比赛,失败的是第三场比赛,依此类推。如果找不到,则在队列末尾创建一个新游戏。游戏在达到最大尺寸时开始,或者在达到最小尺寸后经过固定时间后开始。当游戏开始时,它会从队列的前面移除。
有了这个决定,为什么您认为会有 100 万活跃玩家?
如果是因为你是一个有着远大梦想的初创公司,我强烈建议你需要专注于尽可能高效地解决你已知的问题。万一成功(说真的,你看过统计数据了吗?),你可以稍后扩展。只有解决真正的问题才能大大提高你成功的几率,从可怕到微不足道。 (我并不是要气馁。但创业梦想确实是获得疯狂返回的几率很低。你采取的每一项行动都应该着眼于提高几率。)
如果您是一家成熟的游戏公司,有充分的理由相信您会达到这些数字,请继续阅读。
我不应该提及的一个显而易见的注意事项是,您将希望以相对快速的语言实现性能关键位。例如,如果您主要使用 Python 编写,那么这篇文章很适合使用 Java、Go 或 C++ 编写。
接下来,第一个不能缩放的是玩家信息。所以分发那个。这样做会减慢“玩家是否适合游戏”检查。所以添加每个游戏锁定,并异步分发该计算。在放弃和创建新游戏之前限制您尝试进入游戏的努力程度。
下一个瓶颈是游戏匹配计算。因此,继续将“此处的新游戏”分发到多台机器。现在一个玩家出现了,得到一个要检查的中央游戏列表,开始检查它们。为避免瓶颈,玩家应随机排序等待游戏列表。
网络瓶颈是要求该列表。该列表大部分是只读的,因此您可以只使用 Redis 的复制实例。写入(用于新游戏和标记游戏开始)可以交给 master,读取可以根据需要分布在任意多台机器上。玩家将随机打一个 Redis 副本,得到一个列表,随机排序。
如果达到这种规模,我会感到震惊。如果您超过了它,我会将后续步骤(例如对 Redis 进行分片)留给您。
随机笔记。这是一个体面的面试问题。 “设计这个简单的东西。让它扩展。让它扩展更多。让它扩展更多。”如果你真的在寻找一个了解分布式性能的人,那是一个很好的测试。 (但前提是面试官能够分辨好坏答案。)
关于algorithm - 并行/集群中图形节点分组的有效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17362227/
Tôi đang tạo một ứng dụng bằng JavaFX 8. Tôi sử dụng kéo/thả để thay đổi động nội dung của Grid Pane. Tôi muốn lặp lại nội dung GridPane trên mỗi hàng hoặc mỗi hàng/cột. JavaFX cho phép thêm các phần tử vào GridPane bằng cách chỉ định các hàng và cột
Tôi đang cố gắng kéo và thả hình ảnh vào div. Hình ảnh không được kéo vào div và đưa ra lỗi sau Uncaught TypeError: Failed to exec 'appendChild' on 'Node': pa
Tôi đang tạo điều hướng AR xây dựng nội bộ trong studio android. Tôi đang tìm cách "kết nối" một mỏ neo với các mỏ neo hoặc nút/nút neo khác. Tôi không chắc nên sử dụng cái nào. Dựa trên điều này tôi sẽ buộc sử dụng
Tôi đang chạy một số công việc trên Hive: 4 nút đầu tiên, sau đó là 2 nút. Thật ngạc nhiên, nút thứ 2 của tôi hoạt động tốt hơn nút thứ 4 của tôi. Đầu tiên tôi chạy truy vấn trên 4 nút (4 nút sự kiện) và sau đó tắt 2 nút (
Tôi có dòng điện Node* nơi tôi lưu trữ một con trỏ tới nút hiện tại ở "đầu" danh sách. Khi tôi đặt một nút mới làm nút hiện tại, tôi gặp lỗi: '=': không thể chuyển đổi từ 'CircularDo
Tôi mới sử dụng dcos Mesos và đã cài đặt dc os trên máy Ubuntu cục bộ của mình. Tôi có thể xem bảng điều khiển dcos. Nhưng tôi không thể sử dụng nút dcos ssh --master-proxy --lea
Có cái gì đó giống như setLayout(); trong JavaFX không? hoặc setBounds(); Ví dụ: tôi muốn định vị một nút ở nơi tôi muốn. Câu trả lời hay nhất Mọi thứ trên biểu đồ cảnh JavaFX đều là Nút .
Tôi đang phát triển một ứng dụng JavaFX trong đó các lớp tôi phát triển (mở rộng từ javafx.scene.Parent) được tạo động dựa trên các mục mà người dùng nhấp vào trong điều khiển ListView. Nói rõ hơn với nút này, nó không sử dụng cái gì đó như
Tôi đang cố gắng tạo sơ đồ lớp cho các mối quan hệ cạnh nút vì nó có thể được tìm thấy trong biểu đồ có hướng. Điều tôi muốn truyền tải là Nút ám chỉ Cạnh và Cạnh ám chỉ Nút. Mỗi Edge yêu cầu chính xác hai Nút (nguồn và đích).
Trong quá trình thực hiện công việc Mapreduce, một tác vụ sẽ được chạy trên một nút ngẫu nhiên, có cách nào để hạn chế các nút nơi tác vụ sẽ được chạy không? Câu trả lời hay nhất Hadoop không chọn các nút để chạy tác vụ một cách ngẫu nhiên. Hãy xem xét vị trí dữ liệu, nếu không sẽ có rất nhiều chi phí mạng. nhiệm vụ và
Sự khác biệt giữa: a) xây dựng lại nodetool b) sửa chữa nodetool [-pr] Nói cách khác, chính xác thì mỗi lệnh làm gì? Câu trả lời hay nhất là xây dựng lại nodetool: tương tự như quá trình khởi động (khi bạn thêm một nút mới vào cụm), nhưng
Tôi đã thêm mối quan hệ OneToMany đầu tiên vào dự án ngủ đông 3.6.10 của mình. Đây là một lớp: /** * */ package com.heavyweightsoftware.leal
Có thể tìm thấy phần tử đang lắng nghe sự kiện đã kích hoạt chức năng hiện tại không? Trong mã bên dưới, event.target trả về #xScrollPane và event.currentTarget và nút con thấp nhất của event.f
Tôi đang cố ghi đè một số dữ liệu trong cơ sở dữ liệu của mình. Cấu trúc rất đơn giản, đó là: công thức nấu ăn { user_1{ công thức_1{data} công thức_2{data} } user_2{
Tôi sử dụng setInterval để chạy hàm nhưng nó thực thi hàm nhiều lần... Cách thực thi hàm sau khi chèn một giá trị vào đầu vào Đầu vào đầu tiên ở một khoảng cách khác với phần còn lại của đầu vào Cách chèn một giá trị sau khi chèn it (tùy chọn tab) Di chuyển từ 1 đầu vào
Tôi không biết mã của mình có vấn đề gì nhưng tôi liên tục nhận được các thông báo lỗi này trong studio trực quan. Lỗi 18 lỗi C1903: không thể khôi phục từ e trước đó
Tôi đang cố gắng lấy đối tượng của nút điều hướng tìm kiếm SharePoint từ lớp của nó. var node = $("div.ms-qSuggest-listItem"); Tôi đang nhận đối tượng nút và bây giờ muốn nhận "_promp
D:\nodeP>node main.js module.js:327 ném lỗi; ^ Lỗi: Function.Module._resolveFilename trong Function.Module
struct node{ int key, Prior, cnt, val; node *l, *r; node(){} node(int nkey): key(nkey),
Tôi có đoạn mã sau sử dụng trình vòng lặp để chèn một mục vào danh sách liên kết đôi. Đây là cách chúng tôi được yêu cầu làm điều đó. Mã hoạt động nhưng vấn đề là tôi bị rò rỉ bộ nhớ tuyệt đối 24 byte. Chèn NodeIterator(NodeIterator & itrP
Tôi là một lập trình viên xuất sắc, rất giỏi!