【发布时间】:2014-12-16 16:07:04
【问题描述】:
我对 proc optmodel 还很陌生,在整理某些语法时遇到了麻烦。
这是我的数据集。
data opt_test;
input ID GRP $ x1 MIN MAX y z;
cards;
2 F 10 9 11 1.5 100
3 F 10 9 11 1.2 50
4 F 11 9 11 .9 20
8 G 5 4 6 1.2 300
9 G 6 4 6 .9 200
1 H 21 18 22 1.2 300
7 H 20 18 22 .8 1000
;
run;
这里发生了一些事情:
GRP 中的 ID 必须具有相同的 x2,它受 MIN 和 MAX 的约束。我现在希望根据 y 的值进一步限制 x2 的增加/减少。如果 y1,我不希望 x2 超过 1.05*x1。我在网上查看并尝试了一些方法来实现这一点。这是我最近的尝试,cond_1 和 cond_2 是感兴趣的问题,因为其他一切都有效:
proc optmodel;
set<num> ID;
string GRP{ID};
set GRPS = setof{i in ID} GRP[i];
set IDperGRP{gi in GRPS} = {i in ID: GRP[i] = gi};
number x1{ID};
number MIN{ID};
number MAX{ID};
var x2{gi in GRPS} >= max{i in IDperGRP[gi]} MIN[i]
<= min{i in IDperGRP[gi]} MAX[i]
;
impvar x2byID{i in ID} = x2[GRP[i]];
number y{ID};
number z{ID};
read data opt_test into
ID=[ID]
GRP
x1
MIN
MAX
y
z
;
max maximize = sum{gi in GRPS} sum{i in IDperGRP[gi]}
(x2[gi]) * (1-(x2[gi]-x1[i])*y[i]/x1[i]) * z[i];
con cond_1 {i in ID}: x2[i] >=
if y[i]<1 then .95*x1[i] else 0;
con cond_2 {i in ID}: x2[i] <=
if y[i]>=1 then 1.05*x1[i] else 99999999;
solve;
create data results from [ID]={ID} x2=x2byID GRP x1 MIN MAX y z;
print x2 maximize;
quit;
【问题讨论】:
-
是的,您不能在约束中使用条件。 y 是否严格 >=0 ?
-
是的,y 总是大于 0。这是我在尝试形成 support.sas.com/documentation/cdl/en/ormpug/59679/HTML/default/… 语法时引用的站点之一
-
一个问题是 x2 是由 GRPS 集(字符串)定义的,而不是 ID 集(数字)。所以 '{i in ID} x2[i]' 不会解决。
-
另外,假设 X2 是在组上定义的,y 是在 id 上定义的,你想如何处理 y 在每个组的条件两侧的事实?您只是在寻找 X2 上最严格的约束条件吗?
-
我不想让任何给定的 ID 超出基于其特定 y 值的约束,从而限制整个组。
标签: optimization sas