多数独人工智能方法

2023-12-10

我正在概念化一个求解器的变体sudoku called 多重数独,其中多个板重叠,如下所示:

image of a multi-sudoku

如果我正确理解游戏,那么您必须以这样的方式解决每个网格,即任何两个或多个网格之间的重叠都是每个网格解决方案的一部分。

我不确定我应该如何思考这个问题。有人有任何提示/概念线索吗?此外,如果我想到人工智能方面的任何话题,我也想听听。


约束规划(CP)

数独是一个典型的约束规划问题。你有一套变量(网格中的字段)每个字段都有一个domain(这里的数字0 to 9)和一组限制条件在这些变量上(事实上,一个数字在行、列、块中只出现一次)。

解决约束规划问题的通用方法是电弧一致性(AC): 你传播限制条件。通过(部分)填充的变量,您可以缩小剩余变量的域等。最后,如果传播不再可以使域变小,则必须制作一个choice.

通过选择,您可以为某个特定值选择一个值variable。一个好的策略是选择一个剩下少量可能值的变量。接下来你再次传播并可能做出另一个选择等等。

您的程序可能会发现某个选择是错误的:它使一个或多个变量的域为空。在这种情况下,你回溯:您撤消之前所做的选择(以及该选择之后完成的传播)并选择另一个值。

这个答案显然不是为了提供对该主题的深入概述,而是维基百科页面可以提供更好的概述并指向更多信息。

约束规划求解器喜欢ECLiPSe(不是 IDE),MiniZinc等等,可以简单地定义变量、域和约束。

使用 ECLiPSe 解决问题

在 ECLiPSe 网站上,您可以找到数独模型。如果您阅读了一些有关 ECLiPSe 的文档,您可以将此文件转换为多数独模型。我做了一些小的修改,结果如下又快又脏解决方案:

% credits to Joachim Schimpf for his model of sudoku
% http://eclipseclp.org/examples/sudoku.ecl.txt
:- lib(ic).
:- import alldifferent/1 from ic_global.

solve(ProblemName) :-
    problem(ProblemName,BA,BB),
    multi_sudoku(3,BA,BB),
    print_board(BA),
    print_board(BB).

multi_sudoku(N,BA,BB) :-
    sudoku(N,BA,VA),
    sudoku(N,BB,VB),
    N2 is N*N,
    Inc is N2-N,
    (multifor([I,J],1,N,1),param(BA,BB,Inc) do
        BA[I+Inc,J+Inc] #= BB[I,J]
    ),
    append(VA,VB,Vars),
    labeling(Vars).

sudoku(N,Board,Vars) :-
    N2 is N*N,
    dim(Board,[N2,N2]),
    Board[1..N2,1..N2] :: 1..N2,
    ( for(I,1,N2), param(Board,N2) do
        Row is Board[I,1..N2],
        alldifferent(Row),
        Col is Board[1..N2,I],
        alldifferent(Col)
    ),
    ( multifor([I,J],1,N2,N), param(Board,N) do
        ( multifor([K,L],0,N-1), param(Board,I,J), foreach(X,SubSquare) do
        X is Board[I+K,J+L]
        ),
        alldifferent(SubSquare)
    ),
    term_variables(Board, Vars).


print_board(Board) :-
    dim(Board, [N,N]),
    ( for(I,1,N), param(Board,N) do
        ( for(J,1,N), param(Board,I) do
            X is Board[I,J],
        ( var(X) -> write("  _") ; printf(" %2d", [X]) )
        ), nl
    ), nl.


%----------------------------------------------------------------------
% Sample data
%----------------------------------------------------------------------

problem(1, [](
    [](_, _, _, _, 6, _, _, _, _),
    [](_, _, _, 4, _, 9, _, _, _),
    [](_, _, 9, 7, _, 5, 1, _, _),
    [](_, 5, 2, _, 7, _, 8, 9, _),
    [](9, _, _, 5, _, 2, _, _, 4),
    [](_, 8, 3, _, 4, _, 7, 2, _),
    [](_, _, _, 2, _, 8, _, _, _),
    [](_, _, _, 6, _, 4, _, _, _),
    [](_, _, _, _, 5, _, _, _, _)
           ),
           [](
    [](_, _, _, _, 3, _, _, _, _),
    [](_, _, _, 8, _, 7, _, _, _),
    [](_, _, _, 1, _, 6, 3, _, _),
    [](_, 9, 8, _, _, _, 1, 2, _),
    [](2, _, _, _, _, _, _, _, 3),
    [](_, 4, 3, _, _, _, 6, 5, _),
    [](_, _, 7, 3, _, 5, 9, _, _),
    [](_, _, _, 4, _, 2, _, _, _),
    [](_, _, _, _, 6, _, _, _, _)
           )
    ).

我从 Joachim Schimpf 那里“借用”了数独模型,这要归功于他。另外请注意,这个答案并不建议使用ECLiPSe超过另一个工具。在约束编程方面,我只是更熟悉 Prolog 工具链。但如果你更喜欢 C++,Gecode将以大致相同(甚至更好)的性能完成任务。

生成输出:

ECLiPSe Constraint Logic Programming System [kernel]
Kernel and basic libraries copyright Cisco Systems, Inc.
and subject to the Cisco-style Mozilla Public Licence 1.1
(see legal/cmpl.txt or http://eclipseclp.org/licence)
Source available at www.sourceforge.org/projects/eclipse-clp
GMP library copyright Free Software Foundation, see legal/lgpl.txt
For other libraries see their individual copyright notices
Version 6.1 #199 (x86_64_linux), Sun Mar 22 09:34 2015
[eclipse 1]: solve(1).
lists.eco  loaded in 0.00 seconds
WARNING: module 'ic_global' does not exist, loading library...
queues.eco loaded in 0.00 seconds
ordset.eco loaded in 0.01 seconds
heap_array.eco loaded in 0.00 seconds
graph_algorithms.eco loaded in 0.03 seconds
max_flow.eco loaded in 0.00 seconds
flow_constraints_support.eco loaded in 0.00 seconds
ic_sequence.eco loaded in 0.01 seconds
ic_global.eco loaded in 0.07 seconds
  2  1  4  8  6  3  9  5  7
  8  7  5  4  1  9  2  6  3
  6  3  9  7  2  5  1  4  8
  4  5  2  3  7  1  8  9  6
  9  6  7  5  8  2  3  1  4
  1  8  3  9  4  6  7  2  5
  5  4  1  2  3  8  6  7  9
  7  2  8  6  9  4  5  3  1
  3  9  6  1  5  7  4  8  2

  6  7  9  5  3  4  2  8  1
  5  3  1  8  2  7  4  6  9
  4  8  2  1  9  6  3  7  5
  7  9  8  6  5  3  1  2  4
  2  6  5  7  4  1  8  9  3
  1  4  3  2  8  9  6  5  7
  8  2  7  3  1  5  9  4  6
  9  1  6  4  7  2  5  3  8
  3  5  4  9  6  8  7  1  2

我的机器大约花了 0.11 秒。此外,总共有 60 个有效的解决方案。

最后两个“矩阵”显示了两个数独的解决方案。正如您所看到的(我还没有完全检查),它们共享一个块(相同的输出),并且所有数独约束都是有效的。该解决方案的更方便的表示如下所示:

+-----+-----+-----+
|2 1 4|8 6 3|9 5 7|
|8 7 5|4 1 9|2 6 3|
|6 3 9|7 2 5|1 4 8|
+-----+-----+-----+
|4 5 2|3 7 1|8 9 6|
|9 6 7|5 8 2|3 1 4|
|1 8 3|9 4 6|7 2 5|
+-----+-----+-----+-----+-----+
|5 4 1|2 3 8|6 7 9|5 3 4|2 8 1|
|7 2 8|6 9 4|5 3 1|8 2 7|4 6 9|
|3 9 6|1 5 7|4 8 2|1 9 6|3 7 5|
+-----+-----+-----+-----+-----+
            |7 9 8|6 5 3|1 2 4|
            |2 6 5|7 4 1|8 9 3|
            |1 4 3|2 8 9|6 5 7|
            +-----+-----+-----+
            |8 2 7|3 1 5|9 4 6|
            |9 1 6|4 7 2|5 3 8|
            |3 5 4|9 6 8|7 1 2|
            +-----+-----+-----+

我不知道 Python 中的约束编程库,也不知道ECLiPSe到Python。但我的经验是所有现代编程语言都有这样的工具。

The 优势使用约束编程工具,例如ECLiPSe, Gecode,...首先你只需要specify您的问题,如何解决是您不必担心的。此外,此类库对约束编程进行了 30 年的研究:它们经过极其优化,以大多数人无法想象的方式利用约束和结构,并且不太可能包含错误(与定制算法相比)。此外,如果发现新的策略、算法……,则会更新ECLiPSe将导致模型的处理速度更快。

A 坏处是一些困难问题仍然无法使用约束编程来解决:搜索空间太大,约束太复杂,域不能简化为小集合,并且没有足够的处理能力来做出足够的choices以便找到有效的解决方案。另一个缺点是指定问题并不总是那么容易:尽管程序员的目标是设计良好的约束,但总是存在没有定义易于使用的约束的复杂问题。

其他技术

显然还有其他人工智能技术可以解决问题。常用于解决硬搜索和优化问题的技术是进化计算:首先填写数独,允许某些值是错误的,然后在每个时间步骤中,他们的目标是修复一个或多个字段。有时他们会引入新的错误,以便最终找到有效的解决方案。

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

多数独人工智能方法 的相关文章

  • 事件循环和Promise之间有什么关系[重复]

    这个问题在这里已经有答案了 我很好奇Event Loop和Promise之间的关系 演示暴露了这个问题 我预计p1 fulfilled出现在中间 因为它们将任务排队到同一个任务队列中并逐个执行 var p1 new Promise func
  • 什么是直接引用?

    严格模式规则之一 Annex C http ecma international org ecma 262 5 1 sec C 状态 When a delete运算符出现在严格模式代码中 语法错误被抛出 如果它一元表达式是对变量 函数参数或
  • 在外部文件中保存Python字典?

    我正在编写的代码本质上是一个超级基本的人工智能系统 基本上是 Cleverbot 的简单 Python 版本 作为代码的一部分 我有一个起始字典 其中有几个键 其中包含列表作为值 文件运行时 字典会被修改 创建键并将项目添加到关联列表中 所
  • 简单回溯暴力算法最坏情况下有效的数独谜题是什么?

    The 简单 幼稚的回溯暴力算法 数独的 直接深度优先搜索 是众所周知并已实现的 并且似乎不存在不同的实现 当我第一次写这个问题时 我想说我们可以完全标准化它 但措辞很糟糕 我认为这个人很好地描述了算法 https stackoverflo
  • 我什么时候使用像 Paxos 这样的共识算法,什么时候使用像向量时钟这样的算法?

    我已经阅读了很多有关保证分布式系统中节点之间一致性的不同策略的文章 但我在弄清楚何时使用哪种算法时遇到了一些麻烦 我会在什么样的系统中使用矢量时钟之类的东西 哪个系统最适合使用 Paxos 之类的东西 两者是互相排斥的吗 有一个由 2 个节
  • Apple Vision – 条形码检测不适用于不同颜色的条形码

    所以 我必须扫描不同颜色的不同条形码 例如 黑底黄色条形码或白底黄色条形码 我对传统线性和 CCD 条码扫描仪识别它们没有任何问题 我尝试过使用 Apple Vision 框架 但它对它们不起作用 它们在白色背景的黑色条形码上工作得非常好
  • 自动同义词检测方法

    我目前正在研究一种基于神经网络的短文档分类方法 由于我正在使用的语料库通常在十个单词左右 因此标准统计文档分类方法的用途有限 因此 我正在尝试对训练中提供的匹配实施某种形式的自动同义词检测 更具体地说 我的问题是关于解决以下情况 假设我有
  • 学习游戏开发,有什么书推荐吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Sympy nsolve 函数和多种解决方案

    我用 python 做了这个小测试程序来看看如何solve and nsolve工作 from sympy import theta Symbol theta phi Symbol phi def F theta phi return si
  • 2D 游戏:快速(最快)找到另一个实体的 x 个最接近实体的方法 - 大量实体,高度动态

    我正在开发一款具有大量动态实体的 2D 游戏 为了好玩 我们就称他们为士兵吧 假设有 50000 人 我只是随机想到的 可能多了也可能少了 所有这些士兵都按照规则移动每一帧 想想群体 聚集 转向行为 对于每个士兵 为了更新其运动 我需要与我
  • word2vec gensim 多种语言

    这个问题完全超出了我的想象 我正在使用 gensim 训练 Word2Vec 模型 我提供了多种语言的数据 即英语和印地语 当我试图找到最接近 人 的词时 我得到的是 model wv most similar positive man O
  • “扁平比嵌套更好”——对于数据和代码? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 This https stackoverflow com questions 4372073 traversing and modifying
  • Python 中的数独检查器

    我正在尝试用 python 创建一个数独检查器 ill formed 5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7
  • 比较文本文档含义的最佳方法?

    我正在尝试找到使用人工智能和机器学习方法来比较两个文本文档的最佳方法 我使用了 TF IDF Cosine 相似度和其他相似度度量 但这会在单词 或 n gram 级别上比较文档 我正在寻找一种方法来比较meaning的文件 最好的方法是什
  • Tic-Tac-Toe AI:如何制作树?

    在制作井字游戏机器人时 我在尝试理解 树 时遇到了巨大的障碍 我理解这个概念 但我不知道如何实现它们 有人可以向我展示一个如何为这种情况生成树的示例吗 或者关于生成树的好教程 我想最困难的部分是生成部分树 我知道如何实现生成整棵树 但不知道
  • 支持向量机或人工神经网络进行文本处理? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于某些文本处理项目 我们需要在支持向量机和快速人工神经网络之间做出选择 它包括上下文拼写纠正 然后将文本标记为某些短语及其同义词 哪种方
  • 用于神经网络模型预测的数据的缺失值

    我目前有大量数据将用于训练预测神经网络 美国主要机场的千兆字节天气数据 我几乎每天都有数据 但有些机场的数据中存在缺失值 例如 机场在 1995 年之前可能不存在 因此在此之前我没有该特定位置的数据 此外 有些还缺少整年 可能跨度为 199
  • 两种 ODE 求解器之间的差异

    我想知道 两者之间有什么区别ODEINT and solve ivp用于求解微分方程 它们之间有什么优点和缺点 f1 solve ivp f 0 1 y0 y0 is the initial point f2 odeint f y0 0 1
  • 通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点?

    今年夏天我安装了两个不同的 PHP 系统 每个都使用两种不同的方法 方法 1 每个任务一个 PHP 文件 该方法需要一个PHP为每个主要任务创建文件 例如 我的上传脚本可以通过http www domain com upload php O
  • 为什么乘法比除法便宜?

    我最近编写了一个 Vector 3 类 并将我的 normalize 函数提交给朋友审阅 他说这很好 但我应该尽可能乘以倒数 因为在 CPU 时间上 乘法比除法便宜 我的问题很简单 这是为什么 从硬件可以更轻松地实现的基本运算的角度来考虑

随机推荐

  • 如何在 Odoo 控制器中获取 JSON 数据?

    我正在尝试将一些 JSON 数据发送到 Odoo 控制器 但是当我发送请求时 我总是收到 404 作为响应 这是我的控制器的代码 import openerp http as http import logging logger loggi
  • JSON.h:尝试导入 JSON 框架时找不到文件

    当我构建时 我得到了这个错误 JSON h File not found 明显的假设让我认为 JSON h 文件不在导入到我的项目中的框架文件夹中 是的 它不存在该名词 但有一个名为SBJson h 我已关注这个分步教程 around 从项
  • 如何从 Subversion 存储库中删除意外放入的大文件 (4GB)?

    好吧 这个文件被错误地放入存储库中 并被删除并添加到忽略列表中 然而 因为它once存在 我的存储库现在大小 gt 4GB 并且某些 SVN 功能需要数年时间才能完成 我将不胜感激任何帮助和提示 如果重要的话我用的是XP 如何从存储库的历史
  • DuplicateHandle(),在第一个或第二个进程中使用?

    Windows API DuplicateHandle http msdn microsoft com en us library ms724251 VS 85 aspx需要复制对象句柄以及原始进程和要在其中使用复制句柄的其他进程的句柄 我
  • 如何使用flask创建进度条? [复制]

    这个问题在这里已经有答案了 只是想在我的 html 页面中插入一个进度条 它应该从我的 app py 中的 for 加载 这就是我到目前为止所做的 app py from flask import Flask render template
  • 创建具有不同样式的大量文本 - JavaFX FXML

    在我的 JavaFx 应用程序的 fxml 类中 我想使用最少的组件添加大量文本 而不是每行添加多个标签 我还想在同一组件中创建不同样式的文本 我应该使用什么组件 例如 TextArea 以及如何在其中创建多种样式 使用 css Use a
  • 如何使用标准输入在 Swift 3.0 中运行进程

    我在使用 Swift Process 运行 MySQL 恢复转储文件时遇到问题 let command usr local bin mysql h theHost P 3306 u root pTheInlinePassword examp
  • 使用对象映射器解析嵌套的字典数组

    我正在解析一个 Web api 响应 它是一个字典数组 每个字典又都有一个嵌套的字典数组 我该如何解析它 请提供一些代码示例 我的 API 响应是 FilingStatusId 0 FormName MISC OrderId 0 Recip
  • 如何将 HTTPS 与 Microsoft.AspNet.Server.WebListener 结合使用

    在本文的最后http www asp net vnext overview aspnet vnext create a web api with mvc 6它描述了如何使用 Microsoft AspNet Server WebListen
  • 如何实现在更改时自动更新的可变 PickleTypes

    SQLAlchemy 提供PickleType和优惠突变追踪对于任何可变的类型 如字典 SQLAlchemy 文档提到这是实现可变的方法PickleType但它没有具体说明如何进行 Note 我想在中存储一个字典PickleType 你如何
  • 何时使用 HtmlControls 与 WebControls

    我喜欢 HtmlControls 因为没有 HTML 魔法 asp 源代码看起来与客户端看到的类似 我无法否认 GridView Repeater CheckBoxLists 等的实用性 因此当我需要这些功能时我会使用它们 另外 混合和匹配
  • 使用 intptr_t 而不是 void*?

    使用是一个好主意吗intptr t作为通用存储 保存指针和整数值 而不是void 如下所示 http www crystalspace3d org docs online manual Api1 005f0 64 002dBit Porta
  • 如何使用 pyinstaller 将多个 python 文件编译为单个 .exe 文件

    我已经在 python 中创建了一个 GUI 使用 Tkinter 并且使用 os system python file py 从 GUI 单击按钮即可运行 python 文件 我想使用 pyinstaller 将所有这些 python 文
  • 在 KUbuntu 22.04 上的 Visual Studio Code 中点击快速修复键盘快捷键会生成“e”

    在我的 KUbuntu 22 04 中 当我按下键盘快捷键进行快速修复时 即ctrl 在应用程序中 它产生一个小 e 而不是做任何它期望做的事情 我在网上搜索了这个问题 只找到了这个link 但是 它没有给出解决此问题的任何指导 有人遇到过
  • 安全性:tcl 中的会话标识符未更新

    我正在开发开源应用程序 项目 开放 在扫描过程中我发现了以下漏洞 Medium Session Identifier Not Updated Issue 13800882 Severity Medium URL https
  • 如何在 mysql 查询的“IN”子句中使用 PHP 中的值数组?

    get all id s of ur friend that has installed your application friend pics facebook gt api array method gt fql query quer
  • Next.js getServerSideProps 始终未定义

    我已经开始使用新的 Next 应用程序 并尽可能使用功能组件而不是基于类的组件 继文档 我设置了以下内容但没有运气 import React from react import GetServerSideProps InferGetServ
  • ui grid 将更新的单元格数据保存到数据库

    我正在研究 ui 网格编辑单元格功能 我需要使用 REST API 将编辑后的单元格值更新到数据库 另外 我如何获取控制器中选择的行列表 我的工作代码 var app angular module app ngTouch ui grid u
  • 使用JNA加载多个依赖库

    JNA中有没有办法用Java加载多个依赖库 我通常使用Native loadLibrary 加载一个 DLL 但我猜它不会以这种方式工作 因为我将此函数调用分配给实例成员 假设我有图书馆foo和图书馆bar bar依赖于foo 它也依赖于b
  • 多数独人工智能方法

    我正在概念化一个求解器的变体sudoku called 多重数独 其中多个板重叠 如下所示 如果我正确理解游戏 那么您必须以这样的方式解决每个网格 即任何两个或多个网格之间的重叠都是每个网格解决方案的一部分 我不确定我应该如何思考这个问题