lingo程序 两个求和符号的表达式怎么表达啊

img


选哪个吗 顺便讲讲知识点 要把自己绕晕了 上面的C(a,b):x是什么意思啊

个人也在参加数学建模,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

! 定义集合ab,由于不关注这两个集合,所以不需要定义其属性,省略即可;
! 通过上面两个原始集合,定义派生集合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的集直接求和