为什么编译通不过?
本帖最后由 wujianjack2 于 2013-8-29 15:09 编辑model:
sets:
node /supply,res_1,res_2,simple_1,simple_2,simple_3,simple_4,simple_5,outlet/;
nl (node)/res_1,res_2/;
endsets
sets:
month /Jan, Feb, Mar,Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec/;
water_supply(nl,month):sup;
endsets
sets: net_flow(node,node)
/supply,res_1
supply,res_2
res_1,simple_1
res_2,simple_1
simple_1,simple_2
simple_2,simple_3
simple_3,simple_4
simple_4,simple_5
simple_5,outlet
outlet,supply/:flow;
endsets
sets:
net_time(net_flow,month):waterflow;
endsets
data:
sup=128 125 234 290 350 400 500 440 240 210 181 128
39 39 52 121 168 144 105 78 49 44 45 39;
enddata
@for(month(t):waterflow(1,2,t)=sup(1,t)); !提示出现属性越界
@for(month(t):waterflow(1,3,t)=sup(2,t));
@for(month(t):@for(node(i):@sum(net_time(j,i,t):waterflow(j,i,t))=@sum(net_time(i,j,t):waterflow(i,j,t))));
end
提示出现属于越界,这是为什么?
本帖最后由 bei_fang 于 2013-8-29 15:09 编辑
model:
sets:
node /supply,res_1,res_2,simple_1,simple_2,simple_3,simple_4,simple_5,outlet/;
nl (node)/res_1,res_2/;
endsets
sets:
month /Jan, Feb, Mar,Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec/;
water_supply(nl,month):sup;
endsets
sets: net_flow(node,node)
/supply,res_1
supply,res_2
res_1,simple_1
res_2,simple_1
simple_1,simple_2
simple_2,simple_3
simple_3,simple_4
simple_4,simple_5
simple_5,outlet
outlet,supply/:flow;
endsets
sets:
net_time(net_flow,month):waterflow;
endsets
data:
sup=128 125 234 290 350 400 500 440 240 210 181 128
39 39 52 121 168 144 105 78 49 44 45 39;
enddata
@for(month(t):waterflow(1,2,t)=sup(1,t)); !提示出现属性越界;
@for(month(t):waterflow(1,3,t)=sup(2,t));
@for(month(t):@for(node(i):@sum(net_time(j,i,t):waterflow(j,i,t))=@sum(net_time(i,j,t):waterflow(i,j,t))));
end
帮忙分析一下原因,多谢了! 楼主你好!冒昧回答下你的问题。
其一:集合定义时可以全部放在一个"SETS: ENDSETS"对里的,不必写这么多;
其二:以“@for(month(t):waterflow(1,2,t)=sup(1,t));”为例,楼主在使用时忽视了waterflow,sup这两个属性所属的派生集合了,不是你以为只是用其中一个变量就可以只写month的,waterflow和sup根本就不在month集合中,而是month与其它集合的派生集合,直接这么使用当然会出现下标越界;
其三:楼主的集合定义略显不够精简,可以更好地定义方便大家阅读程序。
以上是一点拙见,仅供楼主参考。 请问,Lingo中可以定义三维成员的集合吗? model:
sets:
row/1..2/;
line/1..12/;
number(row,line):n;
endsets
@for(line(j): n(1,j)=0);
end
这里n不是line集合的属性,为什么可以通过? bei_fang 发表于 2013-8-29 15:29 static/image/common/back.gif
请问,Lingo中可以定义三维成员的集合吗?
可以的,与二维的定义方式是一样的。 bei_fang 发表于 2013-8-29 16:24 static/image/common/back.gif
model:
sets:
row/1..2/;
好吧,看来楼主并未理会我的意思。
首先很抱歉,这段程序我也试了,确实可以,但我不是LINDO公司的开发人员,我接触LINGO的时间也有限,我对此无法给出满意的答复;
其次,我可以肯定我按我说的写是比较规范的,LINGO是可以很好的执行的。自己也会更加清楚自己在做什么,是在对什么进行操作。
我这么想只是想提醒下楼主软件毕竟是软件,它总有一定的限制,你在编写时需要遵循它的一定规则,按照它比较认可的方式去写,这样能够避免一些不必要的错误出现。我建议不要对这些取巧,有些我们认为理所当然的事情,程序却不一定会这么做。
最后,我的学识确实相当有限,只能给出这样的小小建议,这也是我的一些体会,至于怎么做,全在楼主的思量,同时也谢谢你的支持! 首先非常感谢你的建议,我昨天通过多次的实验,已经把问题解决了。
目前我想用Lingo做一个水资源系统的优化,自我感觉Lingo与其他语言有很大差别,对于流程的控制感觉比较难。下边是我昨天实验通过的程序,我也想与大家交流,共同学习Lingo,共同进步。
model:
sets:
node /supply,res_1,res_2,simple_1,simple_2,simple_3,simple_4,simple_5,outlet/;
nl (node)/res_1,res_2/;
month /Jan, Feb, Mar,Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec/:sup1,sup2;
endsets
sets: net_flow(node,node)
/supply,res_1
supply,res_2
res_1,simple_1
res_2,simple_1
simple_1,simple_2
simple_2,simple_3
simple_3,simple_4
simple_4,simple_5
simple_5,outlet
outlet,supply/;
endsets
sets:
net_time(net_flow,month):waterflow;
endsets
data:
sup1=128 125 234 290 350 400 500 440 240 210 181 128;
sup2=39 39 52 121 168 144 105 78 49 44 45 39;
enddata
data:
@text('result.txt')=waterflow;
enddata
@for(net_time(i,j,t)|i#eq#1 #and# j#eq#2:waterflow(i,j,t)=sup1(t));
@for(net_time(i,j,t)|i#eq#1 #and# j#eq#3:waterflow(i,j,t)=sup2(t));
@for(month(t):@for(node(i):@sum(net_time(j,i,t):waterflow(j,i,t))=@sum(net_time(i,j,t):waterflow(i,j,t)))); !入流量等于出流量;
end
页:
[1]