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版本或以上方可运行成功)
1.输入数独矩阵:
- data indata;
- input C1-C9;
- datalines;
- . . 5 . . 7 . . 1
- . 7 . . 9 . . 3 .
- . . . 6 . . . . .
- . . 3 . . 1 . . 5
- . 9 . . 8 . . 2 .
- 1 . . 2 . . 4 . .
- . . 2 . . 6 . . 9
- . . . . 4 . . 8 .
- 8 . . 1 . . 5 . .
- ;
- run;
- %macro store_initial_values;
- /* 储存初值到宏变量C_i_j */
- data _null_;
- set indata;
- array C{9};
- do j = 1 to 9;
- i = _N_;
- call symput(compress('C_'||put(i,best.)||'_'||put(j,best.)),
- put(C[j],best.));
- end;
- run;
- %mend store_initial_values;
- %store_initial_values;
- %macro solve;
- proc clp out=outdata;
- /* VAR 语句 声明求解变量X_1_1至X_9_9 取值范围为[1,9] */
- /* alldiff语句:约束条件:行约束,每行元素互不相同,如X_1_1:X_1_9的取值互不相同*/
- %do i = 1 %to 9;
- var (X_&i._1-X_&i._9) = [1,9];
- alldiff(X_&i._1-X_&i._9);
- %end;
- /* alldiff语句:约束条件:列约束,每列元素互不相同,如X_1_1:X_9_1的取值互不相同*/
- %do j = 1 %to 9;
- alldiff(
- %do i = 1 %to 9;
- X_&i._&j
- %end;
- );
- %end;
- /* alldiff语句:约束条件:块约束,3X3矩阵元素互不相同,如X_1_1:X_3_3的取值互不相同*/
- %do s = 0 %to 2;
- %do t = 0 %to 2;
- alldiff(
- %do i = 3*&s + 1 %to 3*&s + 3;
- %do j = 3*&t + 1 %to 3*&t + 3;
- X_&i._&j
- %end;
- %end;
- );
- %end;
- %end;
- /* lincon语句:初值约束,已知变量约束如X_1_3=C_1_3=5 */
- /* 如果C_i_j非缺失,则X_i_j = C_i_j */
- %do i = 1 %to 9;
- %do j = 1 %to 9;
- %if &&C_&i._&j ne . %then %do;
- lincon X_&i._&j = &&C_&i._&j;
- %end;
- %end;
- %end;
- run;
- %put &_ORCLP_;
- %mend solve;
-
- %solve
本帖曾在论坛引起争议,自知理亏,不辩解。日后SASHELP的东西也注明出处。。



雷达卡




京公网安备 11010802022788号







