楼主: 凡星有梦
7369 4

[程序分享] [转] 用Matlab解数独游 [推广有奖]

  • 2关注
  • 20粉丝

讲师

89%

还不是VIP/贵宾

-

威望
1
论坛币
7723 个
通用积分
5271.8957
学术水平
100 点
热心指数
87 点
信用等级
88 点
经验
7331 点
帖子
149
精华
2
在线时间
183 小时
注册时间
2013-8-26
最后登录
2023-4-16

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
原文:整数规划思想求解数独游戏
最近做一些优化问题,找到了YALMIP工具包。在其帮助文件里看到如何使用该工具包求解sudoku,整个思路是将问题转化为整数规划问题。这样的思路以前也想到过,但总觉得整数规划问题的求解会更复杂。但是下面的Matlab代码,显示它可以非常简洁,思路见程序的注释(程序运行需要安装YALMIP工具包):

  1. % 初始状态,0表示没填的格子
  2. S=[ 9 0 0 0 0 0 0 0 5
  3.     0 4 0 3 0 0 0 2 0
  4.     0 0 8 0 0 0 1 0 0
  5.     0 7 0 6 0 3 0 0 0
  6.     0 0 0 0 8 0 0 0 0
  7.     0 0 0 7 0 9 0 6 0
  8.     0 0 1 0 0 0 9 0 0
  9.     0 3 0 0 0 6 0 4 0
  10.     5 0 0 0 0 0 0 0 8];

  11. % 定义0、1数组 A(i, j, k) = 1,如果方格(i, j)里的数为k;否则为0。
  12. % 求解sudoku问题即求一定假设条件下的解。
  13. p = 3;
  14. A = binvar(p^2,p^2,p^2,'full');

  15. % 以下为限制条件
  16. F = [sum(A,1) == 1]; % 限制每行每个数恰好一个
  17. F = [F, sum(A,2) == 1]; % 限制每列每个数恰好一个
  18. F = [F, sum(A,3) == 1]; % 限制每个单元格子里恰好一个数

  19. for m = 1:p
  20.     for n = 1:p
  21.         for k = 1:p^2
  22.             s = sum(sum(A((m-1)*p+(1:p),(n-1)*p+(1:p),k)));
  23.             F = [F, s == 1];  % 限制每个3×3的方框里每个数恰好出现一次
  24.         end
  25.     end
  26. end

  27. for i = 1:p^2
  28.     for j = 1:p^2
  29.         if S(i,j)
  30.             F = [F, A(i,j,S(i,j)) == 1]; % 初始给定的数要一直
  31.         end
  32.     end
  33. end

  34. % 直接求解
  35. sol = solvesdp(F);

  36. Z = 0;
  37. for i = 1:p^2
  38.       Z = Z  + i*double(A(:,:,i)); % 简单相加即可
  39. end
  40. Z % 输出结果
复制代码

或者直接下载源代码文件:
sudoku.m1.0 KiB
调用Matlab的整数规划函数求解数独,程序只有20行。
程序中的例子S是我在网上搜「最难 数独」找到的一个例子,程序在几秒钟内便能找出答案。
我以前有段时间特别喜欢玩数独,曾经把PSP上的一个数独游戏玩穿(大概有150关)。现在发现,人所谓的那点逻辑推理能力,在强大的计算能力前面不堪一击。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:MATLAB matla atlab Atl Lab 工具包 程序 格子 如何 游戏

个人主页:https://lixuan.xyz
沙发
explored 学生认证  发表于 2014-3-5 14:35:34 |只看作者 |坛友微信交流群
电脑计算能力再强大也是人去设计的。

使用道具

藤椅
世界杠杆 发表于 2014-3-7 09:37:24 |只看作者 |坛友微信交流群
想请问po主一个关于yalmip工具包设置限制条件的问题。
模型中有个限制条件为x*(y-1)==0,我使用F=F+set(x*(y-1)==0)。出现警告信息。是不是我的表示方式不对啊!有没有其他的什么表示呢?还有一个问题是如何表示“或”,例如:x==0或(y-1)==0怎么用yalmip表示?
在线等,急~~~~~~

使用道具

板凳
凡星有梦 在职认证  发表于 2014-3-7 11:01:34 |只看作者 |坛友微信交流群
世界杠杆 发表于 2014-3-7 09:37
想请问po主一个关于yalmip工具包设置限制条件的问题。
模型中有个限制条件为x*(y-1)==0,我使用F=F+set( ...
你去原文章问那个作者吧。我没用这个工具箱啊。
个人主页:https://lixuan.xyz

使用道具

报纸
Xaero 发表于 2014-3-8 10:18:21 |只看作者 |坛友微信交流群
有些问题是可以程序化的,但是还有很多是不能的——所以大脑不可能完全被电脑替代
十年一觉扬州梦。
智不足以Academy,才尚不够Industry,情无力于Life。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-15 05:46