数学建模社区-数学中国

标题: 新手求教大家一下,谢谢大家了 [打印本页]

作者: LCYMATH    时间: 2015-7-28 13:11
标题: 新手求教大家一下,谢谢大家了
model:
sets:
row/1..5/;
col/1..5/;
links(row,col):a,x;
endsets
data:
a=3 8 2 10 3
8 7 2 9 7
6 4 2 7 5
8 4 2 3 5
9 10 6 9 10;
enddata
min=@sum(links:a*x);
@for(linksbnd(0,x,2));
@for(row(i)sum(col(j):x(i,j))=1);
@for(col(j)sum(row(i):x(i,j))=1);

谁有有时间啊?能帮忙看下程序吗?

非常感谢大家了

[color=gray !important][size=0.8em]今天 13:10LCYMATH
我的问题是,如果@for(row(i)sum(col(j):x(i,j))=1);
@for(col(j)sum(row(i):x(i,j))=1);这两个语句中i,j下标都去掉,运行结果还一样吗?




作者: LCYMATH    时间: 2015-7-28 13:13
@都变表情了,自己顶起~~~~(>_<)~~~~

作者: LCYMATH    时间: 2015-7-28 13:13
@都变表情了,自己顶起~~~~(>_<)~~~~

作者: liwenhui    时间: 2015-7-28 13:29
省略下标LINGO有时候可能会显示语法错误。只有LINGO能唯一识别的情况,才不会出错。就针对你给出的这个例子LINGO应该可以正确识别,结果应该不会变。

作者: gf2015    时间: 2015-7-28 13:31
楼上说的对,就你这个程序来说,不会变

作者: liwenhui    时间: 2015-7-28 13:54



刚才又试了一下,结果会有出入,主要是识别问题。实践当中,推荐大家还是写上指标最好,这样能避免错误。
针对你这个例子,两种方法都不会报错,但结果会有出入,因为LINGO把这两种情况识别为了不同的模型,我在下面解释。

首先是写明下标的情况,
  1. model:
  2. sets:
  3. row/1..5/;
  4. col/1..5/;
  5. links(row,col):a,x;
  6. endsets
  7. data:
  8. a=3 8 2 10 3
  9. 8 7 2 9 7
  10. 6 4 2 7 5
  11. 8 4 2 3 5
  12. 9 10 6 9 10;
  13. enddata
  14. min=@sum(links:a*x);
  15. @for(links:@bnd(0,x,2));
  16. @for(row(i):@sum(col(j):x(i,j))=1);
  17. @for(col(j):@sum(row(i):x(i,j))=1);
  18. end
复制代码
用Generate/display model把这个模型在LINGO里展开,得到的结果是:
  1. MODEL:
  2. [_1] MIN= 3 * X_1_1 + 8 * X_1_2 + 2 * X_1_3 + 10 * X_1_4 + 3 * X_1_5 + 8 * X_2_1 +
  3.   7 * X_2_2 + 2 * X_2_3 + 9 * X_2_4 + 7 * X_2_5 + 6 * X_3_1 + 4 * X_3_2 + 2 * X_3_3
  4.   + 7 * X_3_4 + 5 * X_3_5 + 8 * X_4_1 + 4 * X_4_2 + 2 * X_4_3 + 3 * X_4_4 + 5 *   
  5.   X_4_5 + 9 * X_5_1 + 10 * X_5_2 + 6 * X_5_3 + 9 * X_5_4 + 10 * X_5_5;            
  6. [_2] X_1_1 + X_1_2 + X_1_3 + X_1_4 + X_1_5 = 1;
  7. [_3] X_2_1 + X_2_2 + X_2_3 + X_2_4 + X_2_5 = 1;
  8. [_4] X_3_1 + X_3_2 + X_3_3 + X_3_4 + X_3_5 = 1;
  9. [_5] X_4_1 + X_4_2 + X_4_3 + X_4_4 + X_4_5 = 1;
  10. [_6] X_5_1 + X_5_2 + X_5_3 + X_5_4 + X_5_5 = 1;
  11. [_7] X_1_1 + X_2_1 + X_3_1 + X_4_1 + X_5_1 = 1;
  12. [_8] X_1_2 + X_2_2 + X_3_2 + X_4_2 + X_5_2 = 1;
  13. [_9] X_1_3 + X_2_3 + X_3_3 + X_4_3 + X_5_3 = 1;
  14. [_10] X_1_4 + X_2_4 + X_3_4 + X_4_4 + X_5_4 = 1;
  15. [_11] X_1_5 + X_2_5 + X_3_5 + X_4_5 + X_5_5 = 1;
  16. @BND( 0, X_1_1, 2); @BND( 0, X_1_2, 2); @BND( 0, X_1_3, 2);
  17. @BND( 0, X_1_4, 2); @BND( 0, X_1_5, 2); @BND( 0, X_2_1, 2);
  18. @BND( 0, X_2_2, 2); @BND( 0, X_2_3, 2); @BND( 0, X_2_4, 2);
  19. @BND( 0, X_2_5, 2); @BND( 0, X_3_1, 2); @BND( 0, X_3_2, 2);
  20. @BND( 0, X_3_3, 2); @BND( 0, X_3_4, 2); @BND( 0, X_3_5, 2);
  21. @BND( 0, X_4_1, 2); @BND( 0, X_4_2, 2); @BND( 0, X_4_3, 2);
  22. @BND( 0, X_4_4, 2); @BND( 0, X_4_5, 2); @BND( 0, X_5_1, 2);
  23. @BND( 0, X_5_2, 2); @BND( 0, X_5_3, 2); @BND( 0, X_5_4, 2);
  24. @BND( 0, X_5_5, 2);
  25. END
复制代码
运行结果:
  Global optimal solution found.
  Objective value:                              21.00000
  Infeasibilities:                              0.000000
  Total solver iterations:                            11

最优解为21

接着,把i 和j 去掉,
  1. model:
  2. sets:
  3. row/1..5/;
  4. col/1..5/;
  5. links(row,col):a,x;
  6. endsets
  7. data:
  8. a=3 8 2 10 3
  9. 8 7 2 9 7
  10. 6 4 2 7 5
  11. 8 4 2 3 5
  12. 9 10 6 9 10;
  13. enddata
  14. min=@sum(links:a*x);
  15. @for(links:@bnd(0,x,2));
  16. @for(row:@sum(col:x)=1);
  17. @for(col:@sum(row:x)=1);
  18. end
复制代码
同样,展开这个模型为:
  1. MODEL:
  2. [_1] MIN= 3 * X_1_1 + 8 * X_1_2 + 2 * X_1_3 + 10 * X_1_4 + 3 * X_1_5 + 8 * X_2_1 +
  3.   7 * X_2_2 + 2 * X_2_3 + 9 * X_2_4 + 7 * X_2_5 + 6 * X_3_1 + 4 * X_3_2 + 2 * X_3_3
  4.   + 7 * X_3_4 + 5 * X_3_5 + 8 * X_4_1 + 4 * X_4_2 + 2 * X_4_3 + 3 * X_4_4 + 5 *   
  5.   X_4_5 + 9 * X_5_1 + 10 * X_5_2 + 6 * X_5_3 + 9 * X_5_4 + 10 * X_5_5;            
  6. [_2] X_1_1 + X_1_2 + X_1_3 + X_1_4 + X_1_5 = 1;
  7. [_3] X_2_1 + X_2_2 + X_2_3 + X_2_4 + X_2_5 = 1;
  8. [_4] X_3_1 + X_3_2 + X_3_3 + X_3_4 + X_3_5 = 1;
  9. [_5] X_4_1 + X_4_2 + X_4_3 + X_4_4 + X_4_5 = 1;
  10. [_6] X_5_1 + X_5_2 + X_5_3 + X_5_4 + X_5_5 = 1;
  11. [_7] X_1_1 + X_1_2 + X_1_3 + X_1_4 + X_1_5 = 1;
  12. [_8] X_2_1 + X_2_2 + X_2_3 + X_2_4 + X_2_5 = 1;
  13. [_9] X_3_1 + X_3_2 + X_3_3 + X_3_4 + X_3_5 = 1;
  14. [_10] X_4_1 + X_4_2 + X_4_3 + X_4_4 + X_4_5 = 1;
  15. [_11] X_5_1 + X_5_2 + X_5_3 + X_5_4 + X_5_5 = 1;
  16. @BND( 0, X_1_1, 2); @BND( 0, X_1_2, 2); @BND( 0, X_1_3, 2);
  17. @BND( 0, X_1_4, 2); @BND( 0, X_1_5, 2); @BND( 0, X_2_1, 2);
  18. @BND( 0, X_2_2, 2); @BND( 0, X_2_3, 2); @BND( 0, X_2_4, 2);
  19. @BND( 0, X_2_5, 2); @BND( 0, X_3_1, 2); @BND( 0, X_3_2, 2);
  20. @BND( 0, X_3_3, 2); @BND( 0, X_3_4, 2); @BND( 0, X_3_5, 2);
  21. @BND( 0, X_4_1, 2); @BND( 0, X_4_2, 2); @BND( 0, X_4_3, 2);
  22. @BND( 0, X_4_4, 2); @BND( 0, X_4_5, 2); @BND( 0, X_5_1, 2);
  23. @BND( 0, X_5_2, 2); @BND( 0, X_5_3, 2); @BND( 0, X_5_4, 2);
  24. @BND( 0, X_5_5, 2);
  25. END
复制代码
运行得到的结果为:
  Global optimal solution found.
  Objective value:                              14.00000
  Infeasibilities:                              0.000000
  Total solver iterations:                             0


最优解为14.

为什么会有差异?

仔细观察展开后的两个模型会发现,LING把这两种情况识别为了不同的模型。原因是在省略i j的情况下,LINGO把模型按照“先行后列"的形式进行识别。

所以最好不要省略下标。


作者: liwenhui    时间: 2015-7-28 13:56
gf2015 发表于 2015-7-28 13:31
楼上说的对,就你这个程序来说,不会变

呵呵。大胆猜测,小心求证。自己动手,丰衣足食。不要迷信。

作者: LCYMATH    时间: 2015-7-28 14:16
liwenhui 发表于 2015-7-28 13:54
刚才又试了一下,结果会有出入,主要是识别问题。实践当中,推荐大家还是写上指标最好,这样能避免错误 ...

认真看了你的回答之后,感觉好详细,太感动啦!谢谢,谢谢

作者: xxaxiuxluo    时间: 2015-7-29 17:31
把i,j下标去掉的话,那你还怎么约束每一行,每一列的x和为1?

作者: xxaxiuxluo    时间: 2015-7-29 17:59
@liwenhui 求不沉啊

作者: liwenhui    时间: 2015-7-29 18:22
xxaxiuxluo 发表于 2015-7-29 17:59
@liwenhui 求不沉啊

他是指在LINGO语句中省略下标的写法可能会造成差异,不是把那行删除。

作者: wujianjack2    时间: 2015-7-29 19:29
   这两种表述方式LINGO解析后的结果是不一样的。
   本质上是由于LINGO对隐式集合索引的处理方式,导致col在前的约束展开时从栈中弹出的索引值反转,为避免parsing的歧义,推荐显示索引方式。





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