我的GAMS代码和Ruby中GAMS代码的实现存在问题。我知道GAMS不是最受欢迎的节目,但也许有人可以帮助我。 我有一个模型,我试图将孩子最佳地分配给幼儿园。这是代码的基本示例:
Sets
i Child
j Kindergarten
l Links
LI(l,i), LJ(l,j);
Parameters
a(j) accessibility
C(j) Capacity of Kindergartens
ch Capacity for handicapped children
d(i,j) distance
da(i) distance average
h(i) handicapped children
p(i,j) preferences
s(i,j) siblings;
Binary Variables
x(i,j) 1 if child i is allocated to kindergarten j;
Free Variables
ZFW Zielfunktionswert;
*----- Iclude -----
$include ...
da(i) = sum(j, d(i,j)) / card(j);
*----- Deklaration -----
Equations
ZF objective function
Zuordnung every child is assigned to one kindergarten
Kapa the capacity of the kindergarten must be maintained
Behin handicapped children are only assigned to suitable kindergartens;
ZF.. ZFW =E= sum((i,j), x(i,j) * (p(i,j)/s(i,j)) * (d(i,j)/da(i)));
Zuordnung(i).. sum(j, x(i,j)) =E= 1;
Kapa(j).. sum(i, x(i,j) * (1 - h(i))) + sum(i, x(i,j) * h(i) * ch) =L= C(j);
Behin(i,j).. x(i,j) * h(i) =L= a(j);
Model KiGaOpt /all/;
Solve KiGaOpt using MIP minimizing ZFW;
display x.l;
我还有一个包含文件,我在其中定义参数。我的问题是,我想在Ruby中实现它,我想使用链接(l)instaed of循环来实现i和j之间的关系。 我知道,我必须依赖l替换所有i和j。但每次我尝试这个,我都会收到一条错误消息。我把它写到这个表格中,每当我的参数依赖于i和j时,我用l替换。但我其余的都有问题。
Sets
i Child
j Kindergarten
l Links
LI(l,i), LJ(l,j);
Parameters
a(j) accessibility
C(j) Capacity of Kindergartens
ch Capacity for handicapped children
d(l) distance
da(i) distance average
h(i) handicapped children
p(l) preferences
s(l) siblings;
Binary Variables
x(l) 1 if child i is allocated to kindergarten j;
Free Variables
ZFW Zielfunktionswert;
*----- Iclude -----
$include ...
da(i) = sum(l$LI(l,i), d(l)) / card(j);
*----- Deklaration -----
Equations
ZF objective function
Zuordnung every child is assigned to one kindergarten
Kapa the capacity of the kindergarten must be maintained
Behin handicapped children are only assigned to suitable kindergartens;
ZF.. ZFW =E= sum(l, x(l) * (p(l)/s(l)) * (d(l)/da(i)));
Zuordnung(i).. sum(l$LI(l,i), x(l)) =E= 1;
Kapa(j).. sum(l$LJ(l,j), x(l) * (1 - h(i))) + sum(l$LJ(l,j), x(l) * h(i) * ch) =L= C(j);
Behin(i,j).. x(l) * h(i) =L= a(j);
Model KiGaOpt /all/;
Solve KiGaOpt using MIP minimizing ZFW;
display x.l;
我的包含文件如下所示:
Sets
i /i1*i5/
j /j1*j2/
l /l1*l10/;
LI(l,i) = no;
LJ(l,j) = no;
LI( 'l1', 'i1') = yes;
LJ( 'l1', 'j1') = yes;
LI( 'l2', 'i1') = yes;
LJ( 'l2', 'j2') = yes;
LI( 'l3', 'i2') = yes;
LJ( 'l3', 'j1') = yes;
LI( 'l4', 'i2') = yes;
LJ( 'l4', 'j2') = yes;
LI( 'l5', 'i3') = yes;
LJ( 'l5', 'j1') = yes;
LI( 'l6', 'i3') = yes;
LJ( 'l6', 'j2') = yes;
LI( 'l7', 'i4') = yes;
LJ( 'l7', 'j1') = yes;
LI( 'l8', 'i4') = yes;
LJ( 'l8', 'j2') = yes;
LI( 'l9', 'i5') = yes;
LJ( 'l9', 'j1') = yes;
LI( 'l10', 'i5') = yes;
LJ( 'l10', 'j2') = yes;
Parameters
a(j)
/j1 1
j2 0/
h(i)
/i1 1
i2 0
i3 0
i4 0
i5 1/
C(j)
/j1 100
j2 100/
ch /2/;
Table p(i,j)
j1 j2
i1 10 1
i2 10 1
i3 10 1
i4 10 1
i5 10 1 ;
Table d(i,j)
j1 j2
i1 1 4
i2 2 1
i3 1 1
i4 1 2
i5 2 10.2 ;
Table s(i,j)
j1 j2
i1 5 1
i2 1 1
i3 1 1
i4 1 1
i5 1 1 ;
有人可以帮我重新安排我的模型和包含数据吗?
谢谢!
答案 0 :(得分:0)
如果我运行你的模型,我得到的第一个错误是关于主模型和包含文件之间的命名/声明冲突。例如,在你的主模型中你有
Parameters
...
d(l) distance
...
p(l) preferences
s(l) siblings;
然后在包含文件中我看到了
Table p(i,j)
... ;
Table d(i,j)
... ;
Table s(i,j)
... ;
您不能使用不同的参数列表具有相同的符号名称(错误消息中也提到了这一点:“**** 184域列表已重新定义”),因此这是您需要解决的第一件事。之后可以查看如何继续。
祝你好运, 鲁兹答案 1 :(得分:0)
这是我的新包含文件。我试着将它包含在上面的模型代码中。
Sets
i /i1*i5/
j /j1*j2/
l /l1*l10/;
LI(l,i) = no;
LJ(l,j) = no;
LI( 'l1', 'i1') = yes;
LJ( 'l1', 'j1') = yes;
LI( 'l2', 'i1') = yes;
LJ( 'l2', 'j2') = yes;
LI( 'l3', 'i2') = yes;
LJ( 'l3', 'j1') = yes;
LI( 'l4', 'i2') = yes;
LJ( 'l4', 'j2') = yes;
LI( 'l5', 'i3') = yes;
LJ( 'l5', 'j1') = yes;
LI( 'l6', 'i3') = yes;
LJ( 'l6', 'j2') = yes;
LI( 'l7', 'i4') = yes;
LJ( 'l7', 'j1') = yes;
LI( 'l8', 'i4') = yes;
LJ( 'l8', 'j2') = yes;
LI( 'l9', 'i5') = yes;
LJ( 'l9', 'j1') = yes;
LI( 'l10', 'i5') = yes;
LJ( 'l10', 'j2') = yes;
Parameters
a(j)
/j1 1
j2 0/
h(i)
/i1 1
i2 0
i3 0
i4 0
i5 1/
C(j)
/j1 100
j2 100/
ch /2/
p(l) /l1 10
l2 10
l3 10
l4 10
l5 10
l6 1
l7 1
l8 1
l9 1
l10 1/
d(l) /l1 1
l2 2
l3 1
l4 1
l5 2
l6 4
l7 1
l8 1
l9 2
l10 10.2/
s(l) /l1 5
l2 1
l3 1
l4 1
l5 1
l6 1
l7 1
l8 1
l9 1
l10 1/;
答案 2 :(得分:0)
我不完全明白,为什么你选择LI / LJ方法,但实际上你应该在方程中使用这些地图来控制i和j(这些通常是不受控制的)。因此,以下列方式更改方程式可以消除所有编译错误并解决模型:
ZF.. ZFW =E= sum(LI(l,i), x(l) * (p(l)/s(l)) * (d(l)/da(i)));
Zuordnung(i).. sum(l$LI(l,i), x(l)) =E= 1;
Kapa(j).. sum(LI(l,i)$LJ(l,j), x(l) * (1 - h(i))) + sum(LI(l,i)$LJ(l,j), x(l) * h(i) * ch) =L= C(j);
Behin(l).. x(l) *sum(LI(l,i),h(i)) =L= sum(LJ(l,j),a(j));
祝你好运, 鲁兹
答案 3 :(得分:0)
这是我的模特:
Sets
i Child
j Kindergarten
l Links
LI(l,i), LJ(l,j);
Parameters
a(j) accessibility
C(j) Capacity of Kindergartens
ch Capacity for handicapped children
d(l) distance
da(i) distance average
h(i) handicapped children
p(l) preferences
s(l) siblings;
Binary Variables
x(l) 1 if child i is allocated to kindergarten j;
Free Variables
ZFW objective function value;
*----- Iclude -----
$include
da(i) = sum(l$LI(l,i), d(l)) / card(j);
*----- Deklaration -----
Equations
ZF objective function
Zuordnung every child is assigned to one kindergarten
Kapa the capacity of the kindergarten must be maintained
Behin handicapped children are only assigned to suitable kindergartens
Inklus equal distribution of handicapped children;
ZF.. ZFW =E= sum(LI(l,i), x(l) * (p(l)/s(l)) * (d(l)/da(i)));
Zuordnung(i).. sum(l$LI(l,i), x(l)) =E= 1;
Kapa(j).. sum(LI(l,i)$LJ(l,j), x(l) * (1 - h(i))) + sum(LI(l,i)$LJ(l,j), x(l) * h(i) * ch) =L= C(j);
Behin(l).. x(l) *sum(LI(l,i),h(i)) =L= sum(LJ(l,j),a(j))
Inklus(j).. sum(i, x(i,j)) =L= (card(h)/card(a) +1) * (1+TI) ;
Model KiGaOpt /all/;
Solve KiGaOpt using MIP minimizing ZFW;
display x.l;
这是我的包含文件:
*Instanzen
Sets
i /i1*i5/
j /j1*j2/
l /l1*l10/;
LI(l,i) = no;
LJ(l,j) = no;
LI( 'l1', 'i1') = yes;
LJ( 'l1', 'j1') = yes;
LI( 'l2', 'i1') = yes;
LJ( 'l2', 'j2') = yes;
LI( 'l3', 'i2') = yes;
LJ( 'l3', 'j1') = yes;
LI( 'l4', 'i2') = yes;
LJ( 'l4', 'j2') = yes;
LI( 'l5', 'i3') = yes;
LJ( 'l5', 'j1') = yes;
LI( 'l6', 'i3') = yes;
LJ( 'l6', 'j2') = yes;
LI( 'l7', 'i4') = yes;
LJ( 'l7', 'j1') = yes;
LI( 'l8', 'i4') = yes;
LJ( 'l8', 'j2') = yes;
LI( 'l9', 'i5') = yes;
LJ( 'l9', 'j1') = yes;
LI( 'l10', 'i5') = yes;
LJ( 'l10', 'j2') = yes;
Parameters
a(j)
/j1 1
j2 0/
h(i)
/i1 1
i2 0
i3 0
i4 0
i5 1/
C(j)
/j1 100
j2 100/
ch /2/
p(l) /l1 10
l2 10
l3 10
l4 10
l5 10
l6 1
l7 1
l8 1
l9 1
l10 1/
d(l) /l1 1
l2 2
l3 1
l4 1
l5 2
l6 4
l7 1
l8 1
l9 2
l10 10.2/
s(l) /l1 5
l2 1
l3 1
l4 1
l5 1
l6 1
l7 1
l8 1
l9 1
l10 1/
TI /0.5/;
非常感谢你的帮助!
祝你好运