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(links:@bnd(0,x,2));
@for(row(i):@sum(col(j):x(i,j))=1);
@for(col(j):@sum(row(i):x(i,j))=1);

谁有有时间啊?能帮忙看下程序吗?
非常感谢大家了
今天 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把这两种情况识别为了不同的模型,我在下面解释。

首先是写明下标的情况,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(links:@bnd(0,x,2));
@for(row(i):@sum(col(j):x(i,j))=1);
@for(col(j):@sum(row(i):x(i,j))=1);
end用Generate/display model把这个模型在LINGO里展开,得到的结果是: MODEL:
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 +
  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
  + 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 *   
  X_4_5 + 9 * X_5_1 + 10 * X_5_2 + 6 * X_5_3 + 9 * X_5_4 + 10 * X_5_5;            
X_1_1 + X_1_2 + X_1_3 + X_1_4 + X_1_5 = 1;
X_2_1 + X_2_2 + X_2_3 + X_2_4 + X_2_5 = 1;
X_3_1 + X_3_2 + X_3_3 + X_3_4 + X_3_5 = 1;
X_4_1 + X_4_2 + X_4_3 + X_4_4 + X_4_5 = 1;
X_5_1 + X_5_2 + X_5_3 + X_5_4 + X_5_5 = 1;
X_1_1 + X_2_1 + X_3_1 + X_4_1 + X_5_1 = 1;
X_1_2 + X_2_2 + X_3_2 + X_4_2 + X_5_2 = 1;
X_1_3 + X_2_3 + X_3_3 + X_4_3 + X_5_3 = 1;
X_1_4 + X_2_4 + X_3_4 + X_4_4 + X_5_4 = 1;
X_1_5 + X_2_5 + X_3_5 + X_4_5 + X_5_5 = 1;
@BND( 0, X_1_1, 2); @BND( 0, X_1_2, 2); @BND( 0, X_1_3, 2);
@BND( 0, X_1_4, 2); @BND( 0, X_1_5, 2); @BND( 0, X_2_1, 2);
@BND( 0, X_2_2, 2); @BND( 0, X_2_3, 2); @BND( 0, X_2_4, 2);
@BND( 0, X_2_5, 2); @BND( 0, X_3_1, 2); @BND( 0, X_3_2, 2);
@BND( 0, X_3_3, 2); @BND( 0, X_3_4, 2); @BND( 0, X_3_5, 2);
@BND( 0, X_4_1, 2); @BND( 0, X_4_2, 2); @BND( 0, X_4_3, 2);
@BND( 0, X_4_4, 2); @BND( 0, X_4_5, 2); @BND( 0, X_5_1, 2);
@BND( 0, X_5_2, 2); @BND( 0, X_5_3, 2); @BND( 0, X_5_4, 2);
@BND( 0, X_5_5, 2);
END
运行结果:
  Global optimal solution found.
  Objective value:                              21.00000
  Infeasibilities:                              0.000000
  Total solver iterations:                            11

最优解为21

接着,把i 和j 去掉,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(links:@bnd(0,x,2));
@for(row:@sum(col:x)=1);
@for(col:@sum(row:x)=1);
end同样,展开这个模型为: MODEL:
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 +
  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
  + 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 *   
  X_4_5 + 9 * X_5_1 + 10 * X_5_2 + 6 * X_5_3 + 9 * X_5_4 + 10 * X_5_5;            
X_1_1 + X_1_2 + X_1_3 + X_1_4 + X_1_5 = 1;
X_2_1 + X_2_2 + X_2_3 + X_2_4 + X_2_5 = 1;
X_3_1 + X_3_2 + X_3_3 + X_3_4 + X_3_5 = 1;
X_4_1 + X_4_2 + X_4_3 + X_4_4 + X_4_5 = 1;
X_5_1 + X_5_2 + X_5_3 + X_5_4 + X_5_5 = 1;
X_1_1 + X_1_2 + X_1_3 + X_1_4 + X_1_5 = 1;
X_2_1 + X_2_2 + X_2_3 + X_2_4 + X_2_5 = 1;
X_3_1 + X_3_2 + X_3_3 + X_3_4 + X_3_5 = 1;
X_4_1 + X_4_2 + X_4_3 + X_4_4 + X_4_5 = 1;
X_5_1 + X_5_2 + X_5_3 + X_5_4 + X_5_5 = 1;
@BND( 0, X_1_1, 2); @BND( 0, X_1_2, 2); @BND( 0, X_1_3, 2);
@BND( 0, X_1_4, 2); @BND( 0, X_1_5, 2); @BND( 0, X_2_1, 2);
@BND( 0, X_2_2, 2); @BND( 0, X_2_3, 2); @BND( 0, X_2_4, 2);
@BND( 0, X_2_5, 2); @BND( 0, X_3_1, 2); @BND( 0, X_3_2, 2);
@BND( 0, X_3_3, 2); @BND( 0, X_3_4, 2); @BND( 0, X_3_5, 2);
@BND( 0, X_4_1, 2); @BND( 0, X_4_2, 2); @BND( 0, X_4_3, 2);
@BND( 0, X_4_4, 2); @BND( 0, X_4_5, 2); @BND( 0, X_5_1, 2);
@BND( 0, X_5_2, 2); @BND( 0, X_5_3, 2); @BND( 0, X_5_4, 2);
@BND( 0, X_5_5, 2);
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 static/image/common/back.gif
楼上说的对,就你这个程序来说,不会变

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

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 求不沉啊
页: [1] 2
查看完整版本: 新手求教大家一下,谢谢大家了