数独是一种常见的智力游戏,它的规则是:在一个9×9的网格内填入81个1至9的数字,要求每一行的数字不能出现重复,每一列的数字不能出现重新,同时在9×9的大网格内又划分为9个3×3的小网格要求每个小网格内的数字也不能出现重复。游戏开始时在大网格内已填入若干个数字,要求游戏的参与者填充剩余的数字如下图所示:

今天我们用google or-tools的建模语言cp_model来破解 手机app上的数独游戏enjoy sudoku上难度级别最高的maelstorm级的数独难题:


在建模之前,我们首先要明确数独游戏的规则,我们只需把游戏规则告诉cp_model,至于如何破解则不需要我们操心,cp_model会帮你搞定一切.再次确认游戏规则:

1.在9×9的大网格内:每行、每列元素都不能重复。  
2.在3×3的小网格内:所有元素都不能重复。

初始化变量

明确了游戏规则后,我们首先要在代码中定义大网格和小网格的尺寸,以及一个待破解的数独网格,其中未填数字的元素我们会用0来代替:

from ortools.sat.python import cp_model
model = cp_model.CpModel()#小网格尺寸
cell_size = 3
#大网格每行,每列尺寸
line_size = cell_size**2line = list(range(0, line_size))
cell = list(range(0, cell_size))#待破解的数独网格
initial_grid = [[2, 8, 1, 0, 0, 0, 0, 0, 0],[7, 9, 6, 1, 0, 4, 0, 3, 5],[5, 3, 4, 6, 0, 0, 0, 0, 0], [3, 4, 0, 8, 0, 0, 6, 9, 7],[8, 1, 0, 7, 0, 6, 0, 5, 0], [6, 7, 0, 0, 0, 0, 0, 8, 1],[0, 0, 7, 0, 0, 8, 0, 2, 0], [1, 2, 8, 3, 0, 7, 5, 4, 0],[0, 0, 3, 2, 0, 0, 7, 0, 8]]

定义网格变量

接下来我们要定义一个9×9的大网格变量,它用来存储破解完成以后网格内的所有数字,然后对网格变量赋初始值:

#定义存储破解结果的网格变量
grid = {}
for i in line:for j in line:grid[(i, j)] = model.NewIntVar(1, line_size, 'grid %i %i' % (i, j))  #初始化网格变量
for i in line:for j in line:if initial_grid[i][j]:model.Add(grid[(i, j)] == initial_grid[i][j])  

添加游戏规则

接下来我们要将游戏规则告诉cp_model,并往网格变量中添加游戏规则的约束:

1.行约束: 每行的元素都不一样。
2.列约束: 每列的元素都不一样。
3.cell(小网格)约束: 每个cell内的元素都不一样。

#行约束: 每行的元素都不一样
for i in line:model.AddAllDifferent([grid[(i, j)] for j in line])  #列约束: 每列的元素都不一样
for j in line:model.AddAllDifferent([grid[(i, j)] for i in line])  #cell约束: 每个cell内的元素都不一样
for i in cell:for j in cell:one_cell = []for di in cell:for dj in cell:one_cell.append(grid[(i * cell_size + di,j * cell_size + dj)])model.AddAllDifferent(one_cell) 

求解

设定好游戏规则以后,我们就可以舒舒服服的让or-tools来替我们完成剩下的求解过程,就这么简单!最后我们的程序仅耗时3毫秒就破解了这个数独游戏。

%%time
# 求解
solver = cp_model.CpSolver()
status = solver.Solve(model)
if status == cp_model.OPTIMAL:for i in line:print([int(solver.Value(grid[(i, j)])) for j in line])

参考资料:

以上代码来自于:https://github.com/google/or-tools/blob/master/examples/python/sudoku_sat.py

利用google or-tools 求解数独难题相关推荐

  1. 求解数独难题, Sudoku问题(回溯)

    Introduction : 标准的数独游戏是在一个 9 X 9 的棋盘上填写 1 – 9 这 9 个数字,规则是这样的: 棋盘分成上图所示的 9 个区域(不同颜色做背景标出,每个区域是 3 X 3 ...

  2. 利用Matlab优化工具箱求解旅行商最短路径问题

    前面介绍了利用Matlab二元整数规划求解数独问题,对于另一个问题-旅行商问题也可以用它来求解. 旅行商问题就是找到经过所有站点的最短闭合路径,如下图为在美国地图框架内产生的200个旅行站点,而旅行商 ...

  3. 利用google or-tools 求解逻辑难题:斑马问题

    今天我们利用google or-tools的cp_model建模语言来求解一个著名的逻辑问题:斑马问题. 斑马问题 1. 一条街上有五座不同颜色的房子,每座房子住着不同国籍的人,每个人抽不同的烟,喝不 ...

  4. 利用python,求解数独

    import numpy as np import time time1 = time.time() '''整体灵感就是1 求出每个数字为0的位置可以填的数,并将其位置和能填的数分别以key和valu ...

  5. 数独小项目开篇:DFS解决数独难题

    数独小项目开篇:DFS解决数独难题 前言 DFS解决数独问题思路 代码实现细节 样例测试 总结 Reference 前言   这周小刀是挺忙的,周末加班,哎,谁不是996呢?(打工魂燃烧吧~   这次 ...

  6. 使用.Net Core与Google Optimization Tools实现员工排班计划Scheduling

    上一篇说完<Google Optimization Tools介绍>,让大家初步了解了Google Optimization Tools是一款约束求解(CP)的高效套件.那么我们用.Net ...

  7. 利用Matlab优化工具箱解数独问题

    前一阵使用Matlab的优化工具箱,发现可以求解数独问题,有意思!实际上,Matlab优化工具箱有两个:Optimization Toolbox和Global Optimization Toolbox ...

  8. 使用.NET Core与Google Optimization Tools实现加工车间任务规划

    前一篇文章<使用.NET Core与Google Optimization Tools实现员工排班计划Scheduling>算是一种针对内容的规划,而针对时间顺序任务规划,加工车间的工活儿 ...

  9. Google Optimization Tools介绍

    Google Optimization Tools(OR-Tools)是一款专门快速而便携地解决组合优化问题的套件.它包含了: 约束编程求解器. 简单而统一的接口,用于多种线性规划和混合整数规划求解, ...

最新文章

  1. sql help cs
  2. fpga该驱动器调试dev_dbg 无输出
  3. Java 类不可被继承的几种方法
  4. Highmaps网页图表教程之数据标签与标签文本
  5. datastore_使用Spring Session和JDBC DataStore进行会话管理
  6. Javascript预解析、作用域、作用域链
  7. Spring Boot 学习系列(08)—自定义servlet、filter及listener
  8. SocketJs报错failed: Error during WebSocket handshake: Unexpected response code: 400
  9. RegeX版本更新至2.0.0.4 加入英文语言包
  10. Python模块的使用
  11. 无机金属专业里有计算机课吗,无机非金属材料工程专业课程有不少
  12. Win10取消开机密码
  13. 【开发心得】微信网页应用授权登录
  14. 计算机时间无法保存更改,怎样更改电脑右下角时间设置 不能修改怎么办
  15. 2018icpc ecfinal 西安游记
  16. 【 MATLAB 】 LLS algorithm Simulation of TOA - Based Positioning
  17. 协程问题:Can only use Waiter.switch method from the Hub greenlet
  18. python打开autocad
  19. 酚酸靶向助力组合消毒剂在新鲜农产品中的应用研究
  20. Spark SQL:基本介绍(特点)

热门文章

  1. kbe的UE4的demo大体解读
  2. Vega数据可视化工具——教你轻松玩转大数据可视化 | 附代码
  3. STM32实战项目-触摸按键
  4. HTML+CSS 五种布局方式
  5. 整个过程复制粘贴,在家做情感、励志短视频每月收益有7000多
  6. 闲人闲谈PS之十六——新准则下工程项目收入确认
  7. 设计模式篇-观察者模式
  8. html中form表单
  9. javascript 定义 数组
  10. TKL配列新品键盘:Keychron V3