lingo如何表示c(i,j)=a(i)-b(j)
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/06 03:10:48
定义一个派生集link如下,其中x即可表示为一个矩阵sets:r/1..5/:;c/1..5/:;h/1..5/:;link(r,c,h):x;endsets
加一个0-1变量就可以了@for(supply(j):@sum(demand(i):x(i,j))=4+b);@bin(b);再问:牛╮(╯▽╰)╭,好吧,可是如果是045咋办其实我要做的是045再答
首先语法不对自己找个教程看看他的语法怎么写的然后就是你要注意lingo的模型里面都是约束清楚这点就行了再问:就是左边全是i,右边全是j,对于左右两边分别加总相等,该怎么写呢?你可以写一下嘛。再答:@s
@for(link1(i,j):v(i,j)=@if(c(i)#gt#A(j),1,0));c(i)和A(j)至少要有一个为已知确定值
@FOR(product(J):SUM(WORKER(I):X(I,J))=@if(W(J)#gt#0,1,SUM(WORKER(I):X(I,J)));这样试试
sets:a/1..10/:;b/1..45/:;link(a,b):x;endsets@for(a(i):@for(b(j):x(i,j)+x(i,j+1)
[i]是一个一维数组,i是一个参数,根据i的不同,b[0],b[1],b[2],b[3]…作为不同的变量,b[i][j]是二维数组,那么i不变的时候(比如i=0),根据j的不同,b[0][0],b[0
如果有积分,lingo是处理不了的.建议到matlab工具箱中运行求解吧,积分可以利用数值积分的方法.
从代码看是没错,具体还得看你的集合定义
model:sets:m/1..23/;n/1..10/;links(m,n):x;endsets@for(n(j):@sum(m(i)|i#le#21:x(i,j)+x(i+1,j)+x(i+2,j
注意lingo主模型段写的是约束不是赋值语句你这样写肯定不行可以用一个中间变量来过渡吧或者用一个0-1变量乘上你这个量
不可以@if是一个函数整个@if你把它看成一个数@if(条件,条件真时的值,条件假时的值)再问:那Q=@if((@abs(z(i)-k(j))
(d(j+1)-d(j))^2
lingo中下标只能从1开始sets:r/1..11/:;c/1..11/:;!j的上限未知,暂设为11;links(r,c):u,d;endsetssum=@sum(links(i,j)|j#gt#
首先你要定义好集然后才能写sets:si/1..5/:;sj/1..4/:;sij(i,j):c,x;endsetsz=@sum(sij(i,j):c(i,j)*x(i,j));
你写错了吧应该是|x1-x2|=5@abs(x1-x2)=5;
可以写s*x>=0或者用@if的话写x=@if(s#lt#0,0,x)不过这些效果都不会太好你自己斟酌吧这种非线性的约束放到lingo里面解都可能影响解的准确性和求解速度的
在集循环函数里面的j下标声明的时候可以在后面加|j#ne#i来限制j不等于i比如@sum(seti(i):@sum(setj(j)|j#ne#i:sw(i,j)))你自己写一下吧
SETS:r/1..3/:;c/1..4/:;link(r,c):x,y,z;ENDSETS@for(r(i):x(i,j)+@if(i#eq#1,0,z(i-1,j))=y(i,j)+z(i,j))
@for(demend(i):@sum(supply(j):x(i,j)