AMPL支持第二类特殊有序集,不过也需要求解器的支持,比如cplex和gurobi就可以。贴段代码吧。
param N:=5;
param c{1..N};
var lambda{1..N} >=0 <=1;
suffix sosno integer IN;
suffix ref integer IN;
for{i in 1..N}
{
let lambda[i].ref :=i;
let lambda[i].sosno :=-1;
}
var x;
C1: x=sum{i in 1..N} i*lambda[i];
C2: sum{i in 1..N} lambda[i]=1;
maximize obj: sum{i in 1..N} c[i]*lambda[i]-(x-2.2)^2;
data;
param c :=1 1 2 2 3 2 4 2 5 2;
option solver gurobi;
solve;
display x,lambda;