- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关闭。这个问题需要更多focused .它目前不接受答案。
想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .
7年前关闭。
Improve this question
我正在用 C++ 编写一个国际象棋引擎,并试图编写尽可能干净和正确的代码,因为这是一个学习练习。
目前,我有一个移动类,它定义了一个可能的移动。然后人工智能对每一个可能的 Action 进行评分。在数据结构中将移动的分数与移动本身配对的最佳方法是什么?
每个分数必须能够有多个移动(两个移动的分数都可以为 735)。我认为这排除了 std::map?
它也应该可以快速排序,所以我可以向前看并递归地执行此操作以获得最佳移动。
任何帮助将不胜感激,包括链接。谢谢!
最佳答案
你的问题不是很清楚。一方面,你说你想要一个排序的容器,但另一方面,你谈论事物的方式是你要生成 Action ,将它们放入一个容器中,然后根据你的 AI 定义的标准对它们进行排序。
让我们分别考虑一下。首先,我们假设您想使用分数作为键,并查找与特定分数相匹配的 Action 。在这种情况下,您将生成一个移动,AI 将对该移动进行评分,然后您将存储该移动,并将其分数作为关键。由于您可以有多个具有相同分数的移动(即等效键),因此您需要用于这种情况的数据结构是 std::multimap
.
另一种可能性是您生成所有 Action ,将它们全部放入一个数据结构中,对它们进行评分,然后按评分对它们进行排序。对于这种情况,您可能希望使用 std::vector<std::pair<score_type, move>>
.在这种情况下,当您生成每个移动时,您可能会为其分配一个类似 0 的分数。然后您将遍历 vector 并让 AI 为每个移动生成一个分数。然后,您可以使用仅考虑分数的比较函数对它们进行排序。
这两个都可以。哪个更可取取决于具体情况。使用 vector 可能会最小化开销——也就是说,它将使用最少的内存和最少的 CPU 时间从原始移动到所有移动按排序顺序存储的 vector 。
强度std::multiset
是它一直保持排序。例如,如果您想在达到某个时间限制之前生成移动,它会让您非常干净地完成该操作——生成移动,对其进行评分,然后将其插入到多重集合中。无论您何时停止,到那时为止您生成的所有走法都已排序,因此(例如)如果与您的程序对战的人可以迫使 AI 立即走棋,则 AI 始终会记录最好的走法移动它找到了,所以它可以立即做出它“认为”最好的移动。
另一种可能性是使用优先队列。在国际象棋的典型案例中,您要做的一件事是生成(例如)几十个或可能的下一步 Action 。然后您将选择其中最好的,并为这些可能的反 Action 得分。然后,您将选择其中最好的并计算这些移动的计数器,依此类推,直到您得分(例如)4 或 5 个完整的移动深度。
为此,您并不真正关心将所有移动按顺序排列——您只想快速检索 N 个最佳移动。在这种情况下,优先队列工作得很好。您可以检索 N 个最佳 Action ,然后忽略其余 Action 。这意味着您只对 N 个最佳移动(您关心的移动)进行完全排序,并最大限度地减少其余移动的开销,但仅做足以验证它们的分数较低的 Action 。
我还应该提到,如果这是您真正想要的,您可以在数组情况下完成相同的操作。您可以使用 nth_element 仅查找 N 个最佳分数,而不是使用 sort 按分数对所有 Action 进行排序。 nth_element
将数组/vector 分为两组:那些将在某个选定元素之前排序的那些,然后是选定元素,然后是在该选定元素之后排序的那些。例如,给定 100 次移动,您希望保留前 5 次移动,您可以使用 nth_element
将它们排列成 95 个较小的 Action ,第 95 个元素,然后是其他 4 个元素。虽然没有尝试对每个组中的项目进行排序。
这样做的好处是它可以在 O(N) 时间内完成,而不是完成排序所需的 O(N log N)。
在这两种可能性( priority_queue
与 nth_element
)之间,我们得到了与 set::multiset
之间的权衡大致相同的权衡。和 std::vector
与 std::sort
: priority_queue
时刻保持秩序。即使您或多或少任意地混合插入和删除,它仍然非常有效。带 std::vector
和 std::nth_element
,您通常要插入所有元素,然后调用 nth_element
,然后考虑最重要的项目。如果您要混合两者(插入一些元素,然后删除一些最好的元素,再插入一些元素,再删除一些元素,等等),您必须调用 nth_element
。每次从插入过渡到删除时,这可能会很快降低效率。
关于c++ - 最佳排序 C++ 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20963421/
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!