个人也在参加数学建模,lingo中的俩个或三个更多的,也就是循环。需要用到你集合域定义的集合
一个求和就是@sum( )
俩个的话就是
@sum(a:@sum( …));试试,省略号是内容添加
望采纳哦
Lingo相关的内容,需要对Lingo编程有一定了解。
Lingo程序一般分为5段:集合段、数据段、初始段、计算段、目标和约束段。而题目中的展现的部分为集合段,是用来定义变量的。
集合一般可以分为:原始集合和派生集合。
原始集合定义:
SETS:
set_name /1..n/ : var1, var2,...;
ENDSETS
! SETS 是集合段开始标志;
! set_name 是集合名称;
! /1..n/ 是集合下标, n表示该集合存在n个元素;
! var1, var2,是属性名称,一个集合可以存在多个属性,用逗号隔开;
! ENDSETS 是集合段结束标志。
举个例子:
SETS:
Car /1..3/ : a, b;
ENDSETS
! 定义了集合Car,其包含3个元素,这三个元素可以通过a或者b表示。如果用a表示,就是a1,a2,a3;用b表示就是b1,b2,b3。
派生集合,顾名思义,由原始集合派生而来。定义如下:
SETS:
C1 /1..n1/: a,b;
C2 /1..n2/: x,y;
C3 /1..N3/: w,z;
...
Derive (C1, C2, C3, ...) : var1, var2, ...;
ENSET
! 我们定义了集合C1, C2, C3等等。其中 ... 省略号,表示存在多个相同类型;
! 最后,定义了派生集合Derive,其由上面的原始集合组成。同样,var1, var2等,表示定义的属性名。
举个例子:
SETS:
a/1..3/ : ;
b/1..4/ : ;
c(a,b) : x;
ENDSET
! 定义集合a和b,由于不关注这两个集合,所以不需要定义其属性,省略即可;
! 通过上面两个原始集合,定义派生集合c,并且定义了属性x,用来访问其元素。
! 其中,集合a包含3个元素,集合b包含4个元素,所以集合c包含12元素。可以把集合c想象成一个二维数组,或者矩阵。
集合c中的15个元素通过xij来表示,分别为x11,x12,x13,x14,x21,x22,x23, ... , x33, x34。
讲完了集合段,自然要讲计算段。因为sum
和计算段有关。
sum函数的定义可以表示为:
sum(set(i,j,k,...) : var(i,j,k,...))
! 对集合set进行求和,i,j,k表示下标,var表示在集合段中定义属性。
! 下标和数量和组成集合set的原始集合数据数量有关
! 上面的表达式的含义为对集合set进行求和,即将集合中所有元素相加。因此,要通过下标访问到每一个元素。
最终,我们可以得到下面的例子:
SETS:
a/1..3/ : i ;
b/1..4/ : j ;
c(a,b) : x;
ENDSET
CALC:
sum(c(i, j): x(i,j)) = 30
ENDCALC
! 对c集合求和,最终结果为30。就是上面的表达式的含义。
题目答案最终选 B。
下面是找到的两个比较优秀的教程:
https://blog.csdn.net/NeverMakeIt/article/details/112700110
https://zhuanlan.zhihu.com/p/231026008
关于sum函数的用法:
https://blog.csdn.net/m1m2m3mmm/article/details/94066019
是@sum啊 两个求和就用两个@sum先求和一次然后再在外面再求和比如@sum(set1(i):@sum(sets2(j):b(i,j)*x(i,j))) 当然也可以对i,j的集直接求和