我使用了 Gams,它在代码中给出了一个错误
I used Gams, it gives an error in the code
我使用 gams 对该模型进行了编码,但是当我按下 运行 时,它在第 42 行给出了错误。(以 cons2(i) 开头的行)在此之前它在最后两个中给出了错误线。最后两行是“使用 lp 最小化 z 解决疫苗接种问题;”以下代码是“使用 lp 最小化对象函数解决疫苗接种问题;”所以我删除了 objfunction 并用 z 替换了它。现在的代码“使用 lp 最小化 z 解决疫苗接种问题;”但是现在又报错了,为什么报错?
更新我的代码后,没有报错,但是我输入数据试了一下,没有找到可行的结果。
下面是我的代码的更新版本。
sets
i index of districts in labc /d1,
d2/
j index of possible location sites for vaccination center / 1
2
3
4/;
variables
x(i,j)
y(j)
z ;
binary variables
x(i,j)
r(i,j);
parameters
S maximum service distances
/ 1 20
2 19
3 45
4 40 /
c(j) cost
/ 1 20000
2 30000
3 45000
4 25000 /
a (i) population
/ d1 250000
d2 350000 /
K(j) capacity
/ 1 20000
2 30000
3 45000
4 55000/;
table d(i,j) shortest travel distance between points
1 2 3 4
d1 8 10 12 6
d2 12 18 10 10;
equations
objfunction
cons1
cons2
cons3;
objfunction.. z =e= sum(j, c(j)*y(j));
cons1(i).. sum((j),(r(i,j)*x(i,j))) =g= 1;
cons2(i,j).. x(i,j) =g= y(j);
cons3(j).. sum((i),(r(i,j)*a(i)*x(i,j))) =l= K(j)*y(j);
Model new1 / all /;
solve new1 using RMINLP minimizing z;
错误消息(您在日志或 lst 文件中注意到了吗?)说:
Unknown symbol
指向等式cons2
中的Mx
。问题是,Mx
从未被声明过。您可能需要将其声明为 Variable
。或者您的意思是 x
而不是 Mx
?
我以为你的意思是 x
并试过了。更改后,您会收到错误消息,因为 j
不受 cons2
控制。现在这取决于这个方程式应该做什么。您要对 j
求和还是为每个 j
声明方程?
对已编辑问题的回复:
模型不可行的原因有很多:有问题的数据,模型公式中的缺陷,...获得帮助并不总是那么容易,但通常有助于实际描述单个方程的想法并尝试将问题缩小到一个特定的方程(或一组方程)。尤其是方程式没有任何注释或解释性文字,外部人员很难理解你的模型的思想并帮助找到问题。
解决此类问题的一种方法是使用 GAMS 中的求解器,它具有 IIS(不可约不可行集)功能,这可能有助于找到根本问题。
无论如何,在您的模型中,您的 capacity
(总共 150,000)似乎不足以满足您的 population
(总共 600,000)。如果我增加更多容量,我得到一个可行的解决方案(我没有详细查看)。
我使用 gams 对该模型进行了编码,但是当我按下 运行 时,它在第 42 行给出了错误。(以 cons2(i) 开头的行)在此之前它在最后两个中给出了错误线。最后两行是“使用 lp 最小化 z 解决疫苗接种问题;”以下代码是“使用 lp 最小化对象函数解决疫苗接种问题;”所以我删除了 objfunction 并用 z 替换了它。现在的代码“使用 lp 最小化 z 解决疫苗接种问题;”但是现在又报错了,为什么报错?
更新我的代码后,没有报错,但是我输入数据试了一下,没有找到可行的结果。
下面是我的代码的更新版本。
sets
i index of districts in labc /d1,
d2/
j index of possible location sites for vaccination center / 1
2
3
4/;
variables
x(i,j)
y(j)
z ;
binary variables
x(i,j)
r(i,j);
parameters
S maximum service distances
/ 1 20
2 19
3 45
4 40 /
c(j) cost
/ 1 20000
2 30000
3 45000
4 25000 /
a (i) population
/ d1 250000
d2 350000 /
K(j) capacity
/ 1 20000
2 30000
3 45000
4 55000/;
table d(i,j) shortest travel distance between points
1 2 3 4
d1 8 10 12 6
d2 12 18 10 10;
equations
objfunction
cons1
cons2
cons3;
objfunction.. z =e= sum(j, c(j)*y(j));
cons1(i).. sum((j),(r(i,j)*x(i,j))) =g= 1;
cons2(i,j).. x(i,j) =g= y(j);
cons3(j).. sum((i),(r(i,j)*a(i)*x(i,j))) =l= K(j)*y(j);
Model new1 / all /;
solve new1 using RMINLP minimizing z;
错误消息(您在日志或 lst 文件中注意到了吗?)说:
Unknown symbol
指向等式cons2
中的Mx
。问题是,Mx
从未被声明过。您可能需要将其声明为 Variable
。或者您的意思是 x
而不是 Mx
?
我以为你的意思是 x
并试过了。更改后,您会收到错误消息,因为 j
不受 cons2
控制。现在这取决于这个方程式应该做什么。您要对 j
求和还是为每个 j
声明方程?
对已编辑问题的回复:
模型不可行的原因有很多:有问题的数据,模型公式中的缺陷,...获得帮助并不总是那么容易,但通常有助于实际描述单个方程的想法并尝试将问题缩小到一个特定的方程(或一组方程)。尤其是方程式没有任何注释或解释性文字,外部人员很难理解你的模型的思想并帮助找到问题。
解决此类问题的一种方法是使用 GAMS 中的求解器,它具有 IIS(不可约不可行集)功能,这可能有助于找到根本问题。
无论如何,在您的模型中,您的 capacity
(总共 150,000)似乎不足以满足您的 population
(总共 600,000)。如果我增加更多容量,我得到一个可行的解决方案(我没有详细查看)。