数学建模社区-数学中国

标题: 为什么编译通不过? [打印本页]

作者: bei_fang    时间: 2013-8-29 14:55
标题: 为什么编译通不过?
本帖最后由 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:05
本帖最后由 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


作者: bei_fang    时间: 2013-8-29 15:12
帮忙分析一下原因,多谢了!
作者: wujianjack2    时间: 2013-8-29 15:19
   楼主你好!冒昧回答下你的问题。
   其一:集合定义时可以全部放在一个"SETS:  ENDSETS"对里的,不必写这么多;
   其二:以“@for(month(t):waterflow(1,2,t)=sup(1,t));”为例,楼主在使用时忽视了waterflow,sup这两个属性所属的派生集合了,不是你以为只是用其中一个变量就可以只写month的,waterflow和sup根本就不在month集合中,而是month与其它集合的派生集合,直接这么使用当然会出现下标越界;
   其三:楼主的集合定义略显不够精简,可以更好地定义方便大家阅读程序。
   以上是一点拙见,仅供楼主参考。
作者: bei_fang    时间: 2013-8-29 15:29
请问,Lingo中可以定义三维成员的集合吗?
作者: bei_fang    时间: 2013-8-29 16:24
model:
sets:
row/1..2/;
line/1..12/;
number(row,line):n;
endsets
@for(line(j): n(1,j)=0);
end

这里n不是line集合的属性,为什么可以通过?
作者: wujianjack2    时间: 2013-8-29 16:41
bei_fang 发表于 2013-8-29 15:29
请问,Lingo中可以定义三维成员的集合吗?

  可以的,与二维的定义方式是一样的。
作者: wujianjack2    时间: 2013-8-29 16:48
bei_fang 发表于 2013-8-29 16:24
model:
sets:
row/1..2/;

  好吧,看来楼主并未理会我的意思。
  首先很抱歉,这段程序我也试了,确实可以,但我不是LINDO公司的开发人员,我接触LINGO的时间也有限,我对此无法给出满意的答复;
  其次,我可以肯定我按我说的写是比较规范的,LINGO是可以很好的执行的。自己也会更加清楚自己在做什么,是在对什么进行操作。
  我这么想只是想提醒下楼主软件毕竟是软件,它总有一定的限制,你在编写时需要遵循它的一定规则,按照它比较认可的方式去写,这样能够避免一些不必要的错误出现。我建议不要对这些取巧,有些我们认为理所当然的事情,程序却不一定会这么做。
   最后,我的学识确实相当有限,只能给出这样的小小建议,这也是我的一些体会,至于怎么做,全在楼主的思量,同时也谢谢你的支持!
作者: bei_fang    时间: 2013-8-30 08:19
首先非常感谢你的建议,我昨天通过多次的实验,已经把问题解决了。
目前我想用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




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5