数学建模社区-数学中国

标题: 如何用lingo或matlab求最小值 [打印本页]

作者: 梦溪517    时间: 2012-7-27 15:11
标题: 如何用lingo或matlab求最小值
已知数据:

time=26,24,22,21,21,20,19,18,18,17,17,17,17,16,16,16,16,16,15,15,15,14,14,14,14,13,13,13,13,12,12,12,12,11,11,11,10,10,10,10,10,10,9,9,9,9,9,8,8,8,8;

v=9 10   14   10   9     16   23   24   16   21   19   17   15   20   15   9     9     6     21   14   8     16   9     9     8     16   16       12   7     22   17   14   12   16   8     6     24   14   12   12   11   9     19   16   15   14   12   14   10   10   5;

约束条件和目标函数见附件 约束条件和目标函数

作者: 139851    时间: 2012-7-31 00:07
model:
sets:
row/1..51/:time,v;
col/1..25/:t;
link(row,col):x;
endsets
data:
time=26 24 22 21 21 20 19 18 18 17 17 17 17 16 16 16 16 16 15 15 15 14 14 14 14 13 13 13 13 12 12 12 12 11 11 11 10 10 10 10 10 10 9 9 9 9 9 8 8 8 8;
v=9 10   14   10   9     16   23   24   16   21   19   17   15   20   15   9     9     6     21   14   8     16   9     9     8     16   16       12   7     22   17   14   12   16   8     6     24   14   12   12   11   9     19   16   15   14   12   14   10   10   5;
enddata
min=@sum(col:t);
@for(row(i)sum(col(j):x(i,j))=1);
@for(col(j)sum(row(i):x(i,j)*v(i))<40);
@for(col(j)sum(row(i):x(i,j))<6);
@for(col(j)t(j)=@max(row(i):x(i,j)*time(i))));
@for(linkbin(x));
t(j)-t(@min(j))<5;
@for(link:x(i,j)*(t*(@min(j))-@min(x(i,j)*time(i))));
end
作者: 139851    时间: 2012-7-31 00:10
这么多错误

作者: zzpals    时间: 2012-7-31 10:55
本帖最后由 zzpals 于 2012-7-31 12:34 编辑
  1. model:
  2. sets:
  3. row/1..51/:time,v;
  4. col/1..25/:t,tmin;
  5. link(row,col):x;
  6. endsets
  7. data:
  8. time=26 24 22 21 21 20 19 18 18 17 17 17 17 16 16 16 16 16 15 15 15 14 14 14 14 13 13 13 13 12 12 12 12 11 11 11 10 10 10 10 10 10 9 9 9 9 9 8 8 8 8;
  9. v=9 10   14   10   9     16   23   24   16   21   19   17   15   20   15   9     9     6     21   14   8     16   9     9     8     16   16       12   7     22   17   14   12   16   8     6     24   14   12   12   11   9     19   16   15   14   12   14   10   10   5;
  10. enddata
  11. min=@sum(col(j):t(j));
  12. @for(row(i):@sum(col(j):x(i,j))>1);
  13. @for(row(i):@sum(col(j):x(i,j))<1);
  14. @for(col(j):@sum(row(i):x(i,j)*v(i))<40);
  15. @for(col(j):@sum(row(i):x(i,j))<6);
  16. @for(col(j):t(j)=@max(row(i):x(i,j)*time(i)));
  17. @for(col(j):tmin(j)=@if(@sum(row(i):x(i,j)),@min(row(i):x(i,j)*time(i)),0));
  18. @for(col(j):t(j)-tmin(j)<5);
  19. @for(link(i,j):@bin(x));
  20. end
复制代码
貌似要运行很长时间,有两个问题:
1、tmin是一个有25个数的数列吧?
2、x(i,j)=0时tmin为什么?这一句有点不懂

建议楼主优化一下模型,x有51×25=1275个,太大了,可以尝试一下进化算法,直接用lingo或者matlab不一定能有结果。我以前一个210个0-1变量的模型lingo算了20个小时都没给出结果,只有结束后的临时结果。我的这个程序算了1个小时也没结果。当然也可能是我对你的模型理解错误所以程序有问题。
作者: darker50    时间: 2012-7-31 11:27
139851 发表于 2012-7-31 00:07
model:
sets:
row/1..51/:time,v;

使用编辑上上面的那个“<>”这个符号,在里面写代码就不会错误了。
作者: zzpals    时间: 2012-7-31 11:49
139851 发表于 2012-7-31 00:07
model:
sets:
row/1..51/:time,v;
t(j)-t(@min(j))<5;

你的这一句我这总提示错误,我也不知道怎么改。
我编的程序我运行不出结果,你的有结果吗?




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