数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
楼主: wanbaocheng

LINGO8.0 for windows软件及应用(编译)

[复制链接]
发表于 2005-9-5 01:43:02 | 显示全部楼层
<>下载了lingo,就看到了你的热帖,麻烦你也发到我的有箱一份.非常感激!</P>
发表于 2005-9-5 01:46:21 | 显示全部楼层
<><a href="mailthuluwa1961@sina.com" target="_blank" >huluwa1961@sina.com</A></P>
发表于 2005-9-5 02:11:25 | 显示全部楼层
<>请教一个问题,lingo程序如下:</P>
<>model:<BR>sets:<BR>ai/1..10/:a;<BR>bi/1..5/:b;<BR>endsets<BR>init:<BR>b=10;<BR>endinit<BR>@for(ai(i):a(i)=i);<BR>@for(bi(i)bnd(1,b(i),10));<BR>@for(bi(i)gin(b(i)));<BR><a href="mailtmin=@sum(bi(i)sum(ai(j):@if(j" target="_blank" >min=@sum(bi(i):@sum(ai(j):@if(j</A> #eq# b(i),a(j),0)));<BR>end</P>
<>本想结果是b(i)都等于1,min=5。但运行后min=0,何解?</P>
<P>请指教。</P>
 楼主| 发表于 2005-9-5 02:20:46 | 显示全部楼层
<STRONG><FONT face=Verdana color=#61b713>水葫芦娃:已发送,请查收!</FONT></STRONG>
发表于 2005-9-5 03:16:26 | 显示全部楼层
刚才的问题解决了,谢谢~
 楼主| 发表于 2005-9-5 03:19:01 | 显示全部楼层
<>model:<BR>用这段代码也表达了同样的意思</P>
<>sets:<BR>bi/1..5/:b;<BR>endsets</P>
<>@for(bi(i)bnd(1,b(i),10));<BR>@for(bi(i)gin(b(i)));</P>
<P><a href="mailtmin=@sum(bi:b" target="_blank" >min=@sum(bi:b</A>);<BR>end</P>
<P>当然,你那样做也许有别的目的。我试了,确实有问题。问题就出在@if那里,这里我通过引入0-1指示变量,就实现了@if的功能,运行结果是正确的。对于新加入的代码已经做了注释。</P>
<P>model:<BR>data:<BR>  M1=10; !b(i)-j的上界;<BR>  M2=-10;!b(i)-j的下界;<BR>enddata<BR>sets:<BR>ai/1..10/:a;<BR>bi/1..5/:b;<BR>abi(bi,ai):del1,del2,del;  !0-1指示变量,共计150个;<BR>endsets<BR>@for(ai(i):a(i)=i);<BR>@for(bi(i)bnd(1,b(i),10));<BR>@for(bi(i):@gin(b(i)));<BR>@for(abi: @bin(del1);@bin(del2);@bin(del););</P>
<P>!为了引入指示变量而加入的约束;<BR>@for(abi(i,j):<BR>  b(i)-j&lt;=M1*del1(i,j)+0.5*(del1(i,j)-1);<BR>  b(i)-j&gt;=M2*del2(i,j)-0.5*(del2(i,j)-1);<BR>  del1(i,j)+del2(i,j)-del(i,j)&lt;=1;<BR>  b(i)-j&lt;=M1*(1-del(i,j));<BR>  b(i)-j&gt;=M2*(1-del(i,j));<BR>);</P>
<P><a href="mailt!min=@sum(bi(i):@sum(ai(j):@if(j" target="_blank" >!min=@sum(bi(i):@sum(ai(j):@if(j</A> #eq# b(i),a(j),0)));<BR>!引入指示变量后的目标函数,实际上代替了@if的功能;<BR><a href="mailtmin=@sum(bi(i" target="_blank" >min=@sum(bi(i</A>):<BR>  @sum(ai(j): del(i,j)*a(j))<BR>);<BR>end<BR></P>
 楼主| 发表于 2005-9-5 03:21:33 | 显示全部楼层
你是如何解决的,可以给大家说一说,交流交流嘛。
发表于 2005-9-5 03:50:18 | 显示全部楼层
<>我发觉是@gin(x)这个函数的问题。lingo对整数有一个精度限制,存在一个绝对误差限和相对误差限。例如绝对误差限默认值为10的-6次方,则lingo会把1.999999当成整数2,所以程序中b(i)未必就取真正意义上的整数。于是,虽然有了</P>
<>@for(bi(i)bnd(1,b(i),10));<BR>@for(bi(i)gin(b(i)));<BR>但对于<a href="mailti@if" target="_blank" >@if</A>函数里面的判断条件j #eq# b(i),就算j取遍1到10,条件仍可能全都判假。(只要b(i)不是真正的整数)</P>
<>于是改写一下程序就可以了:</P>
<P>model:<BR>sets:<BR>ai/1..10/:a;<BR>bi/1..5/:b;<BR>endsets<BR><a href="mailtmin=@sum(bi(i)sum(ai(j):@if(j-b(i" target="_blank" >min=@sum(bi(i):@sum(ai(j):@if(j-b(i</A>) #le# 0.1 #or# j-b(i) #le# -0.1,a(j),0)));<BR>@for(ai(i):a(i)=i);<BR>@for(bi(i):@bnd(1,b(i),10));<BR>@for(bi(i):@gin(b(i)));<BR>end</P>
发表于 2005-9-5 04:17:59 | 显示全部楼层
<>sorry,上面的代码好似还有问题~</P>
<>不过下面的例子可以说明一点问题:</P>
<>sets:<BR>ai/1..10/:a;<BR>endsets<BR>@for(ai(i):a(i)=i);<BR>@gin(c);<BR>@bnd(1,c,10);<BR><a href="mailtmin=@sum(ai(i)if(i" target="_blank" >min=@sum(ai(i)if(i</A> #eq# c,a(i),0));<BR><a href="mailt!min=@sum(ai(i)if(i-c" target="_blank" >!min=@sum(ai(i):@if(i-c</A> #le# 0.1 #and# i-c #ge# -0.1,a(i),0));</P>
<P>本来两个min的结果应该一致的,答案是1。</P>
<P>但实验发现上面的min取值是0,用下面的min可以得到正确结果。</P>
发表于 2005-9-5 05:51:11 | 显示全部楼层
<>第429楼的程序应该如下:</P>
<>model:<br>sets:<br>ai/1..10/:a;<br>bi/1..5/:b;<br>endsets<br><a href="http://www.shumo.com/bbs/mailtmin=@sum(bi(i)sum(ai(j)if((j-b(i" target="_blank" >min=@sum(bi(i)sum(ai(j):@if((j-b(i</A>) #le# 0.1) #and# (j-b(i) #ge# -0.1),a(j),0)));<br>@for(ai(i):a(i)=i);<br>@for(bi(i):@bnd(1,b(i),10););<br>@for(bi(i):@gin(b(i)));<br>end</P>
<>同时还需要修改options里面的整数的绝对误差限,把-6改为-8次方。</P>
<P>我晕了~</P>
[此贴子已经被作者于2005-9-4 22:34:39编辑过]

您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2025-6-28 01:41 , Processed in 0.052707 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表