在 n 个皇后主要冲突搜索上表现不佳

2023-12-20

我正在实施 nqueens min-conflict 搜索,如所述

Norvig, S., & Peter, J. R. and. (2014). Artificial Intelligence A Modern Approach. In Pearson (Vol. 58, Issue 12). enter image description here

作者提到,仅此启发式就非常有效:

然而,当我实现它时,我无法在一分钟内解决超过 5000 个问题。虽然作者在 50 次迭代中实现了百万皇后的速度,但我的实现通常会超过 1000 次迭代以实现 5000 皇后。另一个问题 https://stackoverflow.com/questions/27697929/fast-heuristic-algorithm-for-n-queens-n-1000提到了类似的结果。

关于我做错了什么有什么想法吗?是算法问题还是我使用了不应该使用的循环?

update()顺便说一下,这是主要方法。





    list<unsigned> rowsInConflict(const unsigned currentState[]) {
        list<unsigned> rowsInConflict; //TODO change to map

        for (unsigned row = 0; row < boardSize; row++) {
            for (unsigned otherRow = 0; otherRow < boardSize; otherRow++) {
                if (isConflict(row, currentState[row], otherRow, currentState[otherRow])) {
                    rowsInConflict.push_front(row);
                    debug("row in conflict " + to_string(row));
                    rowsInConflict.push_front(otherRow);
                    //return rowsInConflict;
                }
            }
        }

        return rowsInConflict;
    }

    bool update(unsigned currentState[]) {
                unsigned randomRow, column;

        list<unsigned> conflictRows = rowsInConflict(currentState);
        if (conflictRows.empty()) {
            return true;
        }

        list<unsigned>::iterator it = conflictRows.begin();
        std::advance(it, rand() % conflictRows.size());
        randomRow = (unsigned) *it;

        column = getMinConflictColumn(currentState, randomRow);
        placeQueen(currentState, randomRow, column);


        return false;

    }



    void solve_nqueen(unsigned size, bool isVerbose) {

        unsigned rowSpace[size];






        while (!update(rowSpace)) {

            if (iterations >= 1000) {
                cout << "Random restart." << endl;
                intialize(rowSpace);
                iterations = 0;
            }
            iterations++;
        }
        printBoard(rowSpace);




    }

};



正如我在评论中所说,如果您想最大程度地减少交换次数,那么从良好的初始配置开始至关重要。在我的 nQueens 实现中,我有 3 种不同的方法来为每个皇后生成初始行:

  1. 对于每个皇后,选择一个随机行
  2. 创建 1..n 中与每个皇后的行号相对应的数字的排列
  3. 将每个皇后放在冲突最少的行,随机打破平局

所有这些方法都将每个皇后限制在单个列中。第三种方法重用了我在执行交换时查找新目标行所用的函数。

以下是针对每种初始配置在 5000 个皇后上运行的一些示例:

# Board initialized by random rows
Number of queens = 5000, 100 reps
Average time per board: 1.57167
Average number of swaps: 3160.87

# Board initialized by shuffle
Number of queens = 5000, 100 reps
Average time per board: 1.17037
Average number of swaps: 2445.96

# Board initialized by min-conflict
Number of queens = 5000, 100 reps
Average time per board: 1.23296
Average number of swaps: 49.97

正如您所看到的,方法 3 为我们提供了目标交换次数,而其他方法则需要更多。事实上,此方法所需的交换次数从大约 1000 个皇后开始是一致的。

有趣的是,每种方法所花费的总时间与交换次数的变化相差不大。 (所有时间都包括设置初始棋盘和移动皇后。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 n 个皇后主要冲突搜索上表现不佳 的相关文章

  • 格式说明符%02x

    我有一个简单的程序 include
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • Android SearchView 在启动时隐藏键盘

    我有一个小问题正在尝试解决 当我打开应用程序时 键盘会显示输入搜索视图的查询 不过 我只想在单击搜索视图时显示键盘 我该如何解决 Thanks 这对我有用 用于隐藏焦点的代码 searchView SearchView view findV
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 如何在 Symfony2 中注入特定的 Doctrine 实体管理器?

    在使用相同数据库的多个项目中 我们制作了一个 Symfony2 Bundle 来映射所有常用功能 现在的问题是我们有第二个数据库 并且我们需要与第一个数据库相同类型的服务 config yml doctrine dbal default c
  • ITelephony.aidl 未在 Eclipse 中编译

    我正在使用的代码这个答案 https stackoverflow com questions 7121508 android taking complete control of phone is it possible how 71215
  • 尝试使用 Maven 从命令行运行 Java7 Hello World 项目

    尝试使用 maven 从命令行运行 Java Hello World 项目 如果我从 eclipse 中运行代码 我的项目运行正常 但如果我尝试执行 maven package 包 则会出现以下错误 这是我的来源 public class
  • 单击新页面时分页不链接到 where 子句

    我有一个 where 子句 显示 id 上一页的输入值的所有类别 分页工作为我提供了正确的页数 而 where 子句为我提供了正确的记录 但是 当我单击页码时 页面上显示的记录不是下一组所需记录 而是所有记录 到每个页面的链接未标识 whe
  • Pyspark应用foreach

    我是 Pyspark 的菜鸟 我假装玩了一下几个函数 以更好地理解如何在更现实的场景中使用它们 有一段时间 我尝试对 RDD 中的每个数字应用特定的函数 我的问题基本上是 当我尝试打印从 RDD 中获取的内容时 结果是 None My co
  • Angular 4:“找不到名称‘require’

    我正在构建一个应用程序角4 and webpack 我的组件之一中有以下内容 ngOnInit require assets js regular expresions js 当我尝试编译时 我得到 错误于 C SRC Sandbox ea
  • Performance.now() 在 requestAnimationFrame 之前调用 - Performance.now() 具有更大的 t

    所以我有一个简单的功能 var start function lastFrame performance now requestAnimationFrame t gt interval t 还有我的间隔函数 只是为了测试目的 我堵塞了每个
  • jQuery 渐变插件?

    有没有什么好的jQuery渐变插件 我找到了一个 但它使用旧的 jQuery 当我使用最新版本时 所以它可能不适用于最新版本 我不知道你是否已经测试过这些插件 JQuery 渐变插件 http www ajaxupdates com jqu
  • 如何在 ASP.NET CORE 中为多个策略创建自定义授权属性

    我想授权一个操作控制器可以通过多个策略访问 e g Authorize Policies ManageAllCalculationPolicy Policies ManageAllPriceListPolicy public async T
  • Angular 基本 href 未显示在 URL 中

    我正在尝试将我的角度应用程序部署到生产环境 该环境在 url 中具有额外的位置步骤 例如www 生产服务器 com name of my app 附加到其后 当我通过 localhost 4200 上的 Angular cli 运行它并通过
  • python 求图交集

    有谁知道如何找到这两个图的交集 下图 energ ac price compvend and energ ac1 price compven1是一组x y values 请注意以下代码 它从数据库获取值 然后绘制两个图表 我只能手动获取路口
  • javascript中的运算符和事件

    update for i in window if i onhashchange console log i window i prints onchangechange undefined 在支持 onhashchange 事件的浏览器上
  • Eclipse GIT:当前分支未配置为拉取

    我正在和一个朋友一起开发一款基于图块的 RPG 他必须离开几个星期 我们决定是时候使用版本控制 git 了 我开始后悔了 几个小时后 我们设法让它工作到以下地步 我在 github 上创建了一个存储库 将他添加为协作者 我将eclipse中
  • ElasticSearch 0.90.2 在请求端口 9300 时出现 StreamCorruptedException

    我刚刚在 Windows XP 上解压了 elasticsearch 0 90 2 zip 并启动了 bin elasticsearch bat 我已将 JAVA HOME 设置为 C Program Files Java jre7 因为第
  • 占位符不适用于 Internet Explorer

    以下格式的文本框占位符不适用于 Internet Explorer 是否有办法在 Internet Explorer 中显示 TextBox 的占位符
  • 如何恢复 pip 升级

    我刚才执行了以下命令 pip install upgrade ipykernel 然而 我得到了 Requirement already satisfied ipykernel in anaconda3 lib python3 8 site
  • Pandas DataFrame 上的条件逻辑

    如何将条件逻辑应用于 Pandas DataFrame 请参阅下面所示的数据框 data desired output 0 1 False 1 2 False 2 3 True 3 4 True 我的原始数据显示在 数据 列中 所需的输出显
  • 如何在 Java 中执行 Windows 命令?

    我正在开发一个项目 它将为您提供 Windows 命令列表 当您选择一个时 它将执行该命令 但是 我不知道该怎么做 我打算在 Visual C 或 C 中完成它 但 C 类太复杂 我不想在 Visual C 中制作表单和垃圾 在控制台应用程
  • 在 GNU 汇编器中处理或记住 cmp 的向后参数的好方法是什么?

    以下是一些采用 Intel 语法的汇编代码 Jump to done if rsi gt rax cmp rsi rax jae done 这对我的大脑来说是有道理的 如果 rsi 高于或等于 rax 你就会跳 匹配中参数的顺序cmp操作说
  • 在 n 个皇后主要冲突搜索上表现不佳

    我正在实施 nqueens min conflict 搜索 如所述 Norvig S Peter J R and 2014 Artificial Intelligence A Modern Approach In Pearson Vol 5