【问题标题】:Proc Optmodel SAS Maintaining Defined Separation within GroupProc Optmodel SAS 在组内维护定义的分离
【发布时间】:2014-12-30 18:33:23
【问题描述】:

我对 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. 只有“团队负责人”有任何有意义的约束。 2.但是,团队的其他成员会做相应的调整。 XXX 的值将相对于与团队领导者的成绩差低或高 10%。因此,如果 HAL 的 NEW_XXX 为 50(保持不变),则 SAL 将比 HAL 的 55(2 比 1 大 1 个单位)高 10%。KIM 的 NEW_XXX 为 60,因为这比 HAL(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;

【问题讨论】:

  • 好问题。答案即将到来。

标签: optimization sas


【解决方案1】:

如果我理解正确,您需要在等式约束中设置非团队领导 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;

【讨论】:

  • 感谢您的快速回复。这是完美的。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多