楼主: zhou.wen
11612 48

[程序分享] 数独问题SAS/OR求解   [推广有奖]

已卖:4460份资源

教授

9%

还不是VIP/贵宾

-

TA的文库  其他...

SAS Technology

威望
0
论坛币
31987 个
通用积分
6.2141
学术水平
283 点
热心指数
262 点
信用等级
257 点
经验
56058 点
帖子
396
精华
4
在线时间
1328 小时
注册时间
2010-10-12
最后登录
2018-3-9

初级学术勋章 初级热心勋章 中级学术勋章 中级热心勋章

楼主
zhou.wen 发表于 2013-10-17 00:03:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
利用PROC CLP求解数独问题.
Translated From SAS HELP........
CLP过程简介:
解决CSP(约束满足问题),即由一个变量集合和一个约束集合组成。问题的一个状态是由对一些或全部变量的一个赋值定义的完全赋值:每个变量都参与的赋值。问题的解是满足所有约束的完全赋值,或更进一步,使目标函数最大化。

var 语句:声明变量的定义域:例如:variable <=[lower-bound <, upper-bound>]>
alldiff语句:互不相等条件,约束输入变量必须为互不相等的变量
如:var (X1-X3) A B;  alldiff (X1-X3) (A B); 等价于:X1 ne X2,X2 ne X3 ,X3 ne X1 and A ne B

lincon语句:线性约束,例如:
lincon 4 * x1 - 3 * x2 = 5;

有如下数独问题(以下代码需在SAS9.3版本或以上方可运行成功)

数独.png

1.输入数独矩阵:
  1. data indata;
  2.    input C1-C9;
  3.    datalines;
  4. . . 5 . . 7 . . 1
  5. . 7 . . 9 . . 3 .
  6. . . . 6 . . . . .
  7. . . 3 . . 1 . . 5
  8. . 9 . . 8 . . 2 .
  9. 1 . . 2 . . 4 . .
  10. . . 2 . . 6 . . 9
  11. . . . . 4 . . 8 .
  12. 8 . . 1 . . 5 . .
  13. ;
  14. run;     
复制代码
2.将数独矩阵赋值给宏变量C_1_1至C_9_9
  1. %macro store_initial_values;
  2.    /* 储存初值到宏变量C_i_j */
  3.    data _null_;
  4.       set indata;
  5.       array C{9};
  6.       do j = 1 to 9;
  7.          i = _N_;
  8.          call symput(compress('C_'||put(i,best.)||'_'||put(j,best.)),
  9.             put(C[j],best.));
  10.       end;
  11.    run;
  12. %mend store_initial_values;

  13. %store_initial_values;
复制代码
3.利用CLP过程求解数独问题
  1. %macro solve;
  2.    proc clp out=outdata;

  3. /* VAR 语句 声明求解变量X_1_1至X_9_9  取值范围为[1,9]    */     
  4. /* alldiff语句:约束条件:行约束,每行元素互不相同,如X_1_1:X_1_9的取值互不相同*/
  5.       %do i = 1 %to 9;
  6.          var (X_&i._1-X_&i._9) = [1,9];
  7.          alldiff(X_&i._1-X_&i._9);
  8.       %end;

  9.     /* alldiff语句:约束条件:列约束,每列元素互不相同,如X_1_1:X_9_1的取值互不相同*/
  10.       %do j = 1 %to 9;
  11.          alldiff(
  12.          %do i = 1 %to 9;
  13.             X_&i._&j
  14.          %end;
  15.          );
  16.       %end;

  17.        /* alldiff语句:约束条件:块约束,3X3矩阵元素互不相同,如X_1_1:X_3_3的取值互不相同*/
  18.       %do s = 0 %to 2;
  19.          %do t = 0 %to 2;
  20.             alldiff(
  21.             %do i = 3*&s + 1 %to 3*&s + 3;
  22.                %do j = 3*&t + 1 %to 3*&t + 3;
  23.                   X_&i._&j
  24.                %end;
  25.             %end;
  26.             );
  27.          %end;
  28.       %end;

  29.       /* lincon语句:初值约束,已知变量约束如X_1_3=C_1_3=5   */
  30.       /* 如果C_i_j非缺失,则X_i_j = C_i_j  */
  31.       %do i = 1 %to 9;
  32.          %do j = 1 %to 9;
  33.             %if &&C_&i._&j ne . %then %do;
  34.                lincon X_&i._&j = &&C_&i._&j;
  35.             %end;
  36.          %end;
  37.       %end;

  38.    run;
  39.    %put &_ORCLP_;
  40. %mend solve;
  41.    
  42. %solve
复制代码
4.输出结果work.outdata
     

本帖曾在论坛引起争议,自知理亏,不辩解。日后SASHELP的东西也注明出处。。



二维码

扫码加我 拉你入群

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

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

关键词:Translated translate compress Variable Initial 定义域

回帖推荐

wsyxh 发表于49楼  查看完整内容

数独求解结果放在数据集outdata中,只有1行,81列,不便于识读,下面程序把它变成9X9方阵是不是更好辨识呢。 proc iml; Use outdata; Read all into A; n = sqrt(nCol(A)); Sudoku = J(n,n); do i = 1 to n; do j = 1 to n; Sudoku = A[(i-1)*n+j]; end; end; print Sudoku; run; quit;
已有 9 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
ChanchanChicago + 1 + 1 + 1 精彩帖子
kuhasu + 5 + 5 + 5 观点有启发
pobel + 5 + 5 + 5 精彩帖子
Imasasor + 100 + 100 + 4 + 4 + 4 精彩帖子
chengli + 1 热心帮助其他会员
playmore + 5 + 1 + 1 精彩帖子
我是三好学生! + 1 非常认同!!!
webgu + 60 + 60 + 3 + 3 + 3 精彩帖子
愤怒的老鸟 + 1 + 1 + 1 观点有启发

总评分: 经验 + 160  论坛币 + 160  学术水平 + 25  热心指数 + 21  信用等级 + 20   查看全部评分

本帖被以下文库推荐

沙发
lorpercon 发表于 2013-10-17 00:09:54
@.@ 跪拜

藤椅
huangfanchang 发表于 2013-10-17 00:39:22
ding

板凳
愤怒的老鸟 发表于 2013-10-17 01:00:53
。记得SAS官方也提出了一个方法。。。各种数组 各种循环   似乎你这个更好 哈哈哈
梅花香自苦寒来

报纸
_i_ 发表于 2013-10-17 01:16:48

地板
_i_ 发表于 2013-10-17 01:25:21
原创?

7
邓贵大 发表于 2013-10-17 05:11:52
There was one example
http://www2.sas.com/proceedings/forum2007/011-2007.pdf

I believe Zhou Wen's code is more clear than what's in the 6-year-old paper.
However, I still couldn't understand nothing about Sudoku!
Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

8
tmdxyz 发表于 2013-10-17 05:51:40

9
_i_ 发表于 2013-10-17 09:01:39
google     proc clp sudoku  第一个

10
biyanyidao 发表于 2013-10-17 09:39:16
膜拜大神

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-8 11:51