序
好久没有在博客发文章了,主要是文笔不好,发出来怕人耻笑,但是又因为希望能够跟别人有更多的交流,自然也希望能够在这方面写出一点自己的见解,让同行、朋友、同事了解自己,以便在未来能够有很好的切磋。正好碰到这么一个机会,认识了天善的梁总和高总,受到他们的鼓励,于是就有了水到渠成的开始。
由于本人从事数据方面的工作,因而对于数据、算法、编程有一定的了解,所以想从这方面入手来慢慢展开。
先发一个SAS系列的文章吧,近来对SAS优化问题比较感兴趣,也对这方面有一定的涉猎,所以打算从SAS/OR开始,借OPTMODEL这一过程步来逐步介绍各类优化问题吧。
正文
(1) SAS简介
SAS里面模块众多,包括了BASE、STAT、OR、ETS、IML等各类模块,如果你专攻数据清洗,那么只需要BASE模块就足以,如果要往建模方向发展,则需进一步考虑STAT和ETS模块了,这两个模块包含了各类常见模型过程步:线性回归(reg)、逻辑回归(logistic)、时间序列(arima)、聚类(cluster)等,基本上能够满足你的需求,IML也许你也会用到,假如你需要使用矩阵语言来进行计算的话,例如矩阵的数值计算。而OR模块则受众面似乎比较窄,至少我工作以来似乎没有碰到过需要用到OR模块的地方,当然跟我工作性质有关,本人主要从事数据处理、数据建模分析挖掘方面的工作,SAS/OR则主要用来探索分销网络、生产系统、资源分配和调度问题的研究,希望未来有机会在工作中用到OR吧。总之你能做的,想做的,在SAS各类模块里应有尽有,前些天参加SAS中国论坛大会,看到众多SAS公司的牛人在上面分享SAS的各类知识,收获颇多,当天讲座现场全场爆满,SAS产品应用也陈列大厅,各种大数据与SAS结合的成果展示,绝对亮瞎你的眼。所以,赶紧一起来学SAS吧,SAS资料不用担心,我会为大家奉上学习资料,保证让大家满意而归。
(2)SAS之OPTMODEL简介
前面已经介绍了OR主要涉及的领域,接下来我想借助OR模块中的OPTMODEL过程步来介绍一下SAS在运筹学方面的一些知识。
SAS中的OPTMODEL过程主要用于解决数学中的各类约束规划问题,主要包括以下几个内容:
1. Constraint logic programming(CLP)约束逻辑规划
2. Linear programming(LP)线性规划
3. Mixed integer linearprogramming(MILP)混合整数线性规划
4. Network algorithms(Network)网络算法
5. General nonlinear programming(NLP)一般非线性规划
6. Quadratic programming(QP)二次规划
接下来我将借助OPTMODEL过程对上述每一个主题做一个简单的介绍,由于篇幅所限,我会分为6篇小文来分享,由于个人学术水平有限,在对各类概念的介绍时,将会简略的介绍一下相关概念,至于更深一步的学术方面的知识,大家可以一起探讨和交流。
首先对OPTMODEL过程的语法简单介绍一下。
这一过程主要分为三个部分:Proc语句;Declaration语句;Programming语句。
Proc语句:
PROC OPTMODEL;
这部分语句主要用于调用OPTMODEL过程步,同时初始化模型参数和模型优化方式,以及控制结果的输出形式。
Declaration语句:
CONSTRAINT Declaration;
IMPVAR Declaration;
MAX and MIN ObjectiveDeclarations;
NUMBER, STRING, and SETParameter Declarations;
PROBLEM Declaration;
VAR Declaration;
主要用于定义参数,变量,约束条件以及目标函数。
Programming语句:
Assignment Statement
CALL Statement
CLOSEFILE Statement
COFOR Statement
CONTINUE Statement
CREATE DATA Statement
DO Statement
DO Statement, Iterative
…………
主要用于执行数据处理,例如读取数据集、产生随机数、对变量赋值、输出数据等。
那么接下来我将借助于OPTMODEL过程来详细的解释上述5个主题,同时解释所涉及到OPTMODEL过程中的各类选项。
1. Constraint logic programming(CLP)约束逻辑规划
约束条件:通常是指一个包含若干变量的关系表达式,用以表示这些变量必须满足的问题,表达式可以是线性、非线性、或者是逻辑表达式。
规划目标:基于一个函数主体即objectfuction在满足约束条件的前提下对object fuction求可行解,我们称object fuction为目标函数,目标函数可以是非线性的、线性的、或者其他逻辑函数等。
约束逻辑规划的一般形式如下所示:
接下来我以”send more money字谜问题”来对函数进行规划求解:
约束条件:
字母D、E、M、N、O、R、S、Y满足
S E N D + M O R E = M O N E Y 每一分位上的字母代表一个数字
S和M不等于0
每个字母都满足唯一性
目标函数:求满足条件的这8个字母所对应的数字
SAS代码如下所示:
proc optmodel;
/* 申明变量并设定为整数 */
var S integer, E integer, N integer,
D integer, M integer, O integer,
R integer, Y integer;
/* 对所有变量设定上下限区间 */
for {j in 1.._NVAR_}do;
_VAR_[j].lb = 0;
_VAR_[j].ub = 9;
end;
/* 设定约束等式 con是constraint的简写 */
con Arithmetic: 1000*S + 100*E + 10*N +D
+ 1000*M + 100*O + 10*R +E
= 10000*M + 1000*O + 100*N + 10*E +Y;
/* 设定约束条件S、M不等于0 */
con S ne 0;
con M ne 0;
/* 设定唯一性 */
con alldiff(S E N DM O R Y);
solve; /* 运行程序进行求解 */
print S E N D M O RY;
quit;
运行程序之后,我们可以得到如下结果:
运行时间在log中如下所示:
NOTE: “PROCEDURE OPTMODEL”所用时间(总处理时间):
实际时间 1.16 秒
CPU 时间 0.84 秒
对上述结果进行验证,满足题目条件,且代码简单,运行效率相对采用data步(可以自行尝试一下)来做要高效很多。
对于约束逻辑规划,这方面可做的工作还有很多,后面如果有机会我会单独详细的介绍一下SAS中有关CLP的详细资料,绝对会很有意思。