Proc Optmodel SAS维护组内的定义分离

时间:2014-12-30 18:33:24

标签: optimization sas

我对proc optmodel相对较新,并且一直在努力学习语法/结构。我曾经能够获得一次帮助,而且再次陷入困境。

这是我的数据集:

data have;
input NAME $ TEAM $ LEAD GRADE XXX MIN MAX YYY RATE;
cards;
HAL A 1 1 50 45 55 100 1.1
SAL A 0 2 55 0 9999 200 1
KIM A 0 3 70 0 9999 50 1.4
JIM B 1 2 100 90 110 300 .95
GIO B 0 3 120 0 9999 50 1
CAL B 0 4 130 0 9999 20 .9
TOM C 1 1 2 1 5 20 .7
SUE C 0 3 5 0 9999 10 .5
VAL D 1 7 20 15 25 100 .6
WHO D 0 4 10 0 9999 10 .9
;
run;

以下是具体内容: 1.只有“团队领导”才有任何有意义的限制。 但是,团队的其他成员将相应调整。相对于团队领导的等级差异,XXX的值将低10%或更高。因此,如果HAL的NEW_XXX为50(保持相同),那么SAL将比HAL高出10%(2比1大1),即55. KIM的NEW_XXX是60,因为这比HAL高20%(3是2个单位大于1.很明显,WHO的NEW_XXX将比VAL的低30%。

这有意义吗?

以下是我到目前为止的情况,这是类似项目的骨架。

    proc optmodel;

*set variables and inputs;
set<string>NAME;
string TEAM{NAME};
number LEAD{NAME};
number GRADE{NAME}; 
number XXX{NAME};
number MIN{NAME};
number MAX{NAME}; 
number YYY{NAME}; 
number RATE{NAME}; 

set TEAMS = setof{i in NAME} TEAM[i];
set NAMEperTEAM{gi in TEAMS} = {i in NAME: TEAM[i] = gi};

var NEW_XXX{i in NAME}>=MIN[i]<=MAX[i];

*read data into procedure;
read data have into
    NAME=[NAME] 
    TEAM
    LEAD
    GRADE
    XXX
    MIN
    MAX
    YYY
    RATE;

*state function to optimize;
max  metric=sum{gi in TEAMS}
        sum{i in NAMEperTEAM[gi]}
        (NEW_XXX[i])*(1-(NEW_XXX[i]-XXX[i])*RATE[i]/XXX[i])*YYY[i];

expand;
solve;

*write output dataset;
create data results 
    from [NAME]={NAME} 
            TEAM 
            LEAD
            GRADE
            XXX
            NEW_XXX
            MIN 
            MAX 
            RATE 
            YYY;

*write results to window;
print NEW_XXX metric;
quit;

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您需要在等式约束中设置非团队负责人NEW_XXX变量。只留下团队领导的NEW_XXX变量可用于优化。

让我知道这是你想要完成的事情。

以下是我的表现:

proc optmodel;

*set variables and inputs;
set<string> NAME;
string TEAM{NAME};
number LEAD{NAME};
number GRADE{NAME}; 
number XXX{NAME};
number MIN{NAME};
number MAX{NAME}; 
number YYY{NAME}; 
number RATE{NAME}; 


*read data into procedure;
read data have into
    NAME=[NAME] 
    TEAM
    LEAD
    GRADE
    XXX
    MIN
    MAX
    YYY
    RATE;

set TEAMS = setof{i in NAME} TEAM[i];
set NAMEperTEAM{gi in TEAMS} = {i in NAME: TEAM[i] = gi};

/*Helper array that gives me the team leader for each team*/
str LEADS{TEAMS};
for {i in NAME: LEAD[i] = 1} do;
    LEADS[TEAM[i]] = i;
end;

var NEW_XXX{i in NAME} init XXX[i] >=MIN[i]<=MAX[i];


*state function to optimize;
max  metric=sum{gi in TEAMS}(
        sum{i in NAMEperTEAM[gi]} (
            (NEW_XXX[i])*(1-(NEW_XXX[i]-XXX[i])*RATE[i]/XXX[i])*YYY[i]
        ) 
    );

/*Constrain the non-lead members*/
con NonLeads{i in NAME: LEAD[i] = 0}: NEW_XXX[i] = (1 + (GRADE[i] - GRADE[LEADS[TEAM[i]]]) * 0.1) * NEW_XXX[LEADS[TEAM[i]]] ;

expand;
solve;

*write output dataset;
create data results 
    from [NAME]={NAME} 
            TEAM 
            LEAD
            GRADE
            XXX
            NEW_XXX
            MIN 
            MAX 
            RATE 
            YYY;

*write results to window;
print new_xxx metric;

quit;