数学建模学习(26):Lingo解决线性,非线性,助力建模国赛!

举报
川川菜鸟 发表于 2021/10/16 00:04:58 2021/10/16
【摘要】 前言 前面一篇文章,我们学到了基本的lingo使用。下面我将会讲到用集合方式来写lingo.当然,你也可以使用matlab,但是我在此是为了加强lingo的使用,因为我们用lingo做出来的分析数据,写...

前言

前面一篇文章,我们学到了基本的lingo使用。下面我将会讲到用集合方式来写lingo.当然,你也可以使用matlab,但是我在此是为了加强lingo的使用,因为我们用lingo做出来的分析数据,写论文报告要多一些,hhhxs.

构建分块讲解

集合完整模板如下:

model:

sets:


endsets

data:


enddata


end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

集合部分语法

sets:
集合名称1/成员列表1/:属性1_1,属性1_2,...,属性1_n1;
集合名称2/成员列表2/:属性2_1,属性2_2,...,属性2_n2;
派生集合名称(集合名称1,集合名称2):属性3_1,...,属性3_n3;
endsets

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

数据部分的语法为:

data:
属性1 = 数据列表;
属性2 = 数据列表;
enddata

  
 
  • 1
  • 2
  • 3
  • 4

数据计算段部分不能含有变量,必须是已知数据的计算

calc:
b=0;
a=a+1;
endcalc

  
 
  • 1
  • 2
  • 3
  • 4

线性规划

在这里插入图片描述
这样的案例,其实你并不陌生,按照我上一篇,你可以逐行写出目标函数和约束条件。但是这里我以这样的例子用集合例子来写,从而学会集合如何使用。代码如下:

model:

sets:
variable/1..3/:x,c;!定义决策变量;
contrant/1,2/:b;!定义约束变量;
matrix(contrant, variable): A;!定义系数矩阵为A;
endsets

data:
c=4,1,2;!目标函数系数;
b=4 3;
A=2 1 2
  3 3 1;
enddata

min=@sum (variable(j):c(j)*x(j));!目标函数  保证每一个c与每一个x相乘;

@for(contrant(i):@sum(variable(j):A(i,j)*x(j))=b(i));!约束的系数求和等于右边值;

end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果:
在这里插入图片描述
具体你可以把集合形式分为三大块来写:
第一块,定义变量,就是上面例子中的:sets:…endsets
第二块:变量赋值,就是上面例子中的data:…enddata
第三块:目标函数和约束条件表达式计算
如果要讲解起来,实在费劲,上面我有注释,大家可以参考,这个for循环是有点东西的。可以参考下面我提供的基本语法,从而搭建这样一个线性规划。
总结:集合真的麻烦!!

非线性规划

例子如下
在这里插入图片描述
整个过程一定要慢慢领悟怎么写的,耐心点,注意看我注释。

model:
!第一步定义集合;
sets:
bianliang/1,2/:x,c;!目标函数:定义变量x,x的系数c;
yueshu/1/:b;  !约束条件:与x相关的的是右边的常数b;
juzhen(bianliang,yueshu):A;!矩阵友目标函数和约束函数组成,取名为A;
endsets

!第二步定义数据直接赋值;
data:
c=1 1;
b=1;
A=1 1;
enddata

!第三步开始写目标函数;
min=@sum(bianliang(j):c(j)*x(j)^2);

!第四步开始写约束条件;
@for(yueshu:@sum(bianliang(j):A(j,1)*x(j))>=b);
@for(bianliang:@bnd(0,x,1));

end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

从而得到全局最优解:
在这里插入图片描述
我们还是这个例子,换个简单的写法
在这里插入图片描述
代码为:

model:

sets:
variable/1,2/:x,C,A;
endsets

data:
c=1 1;A=1 1;
enddata


min=@sum (variable:c*x^2);
@sum (variable:A*X)>=1;
@for(variable: @bnd (0,x,1));


end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

同样返回全局最优解,这样简单很多。

总结

后面还有整数规划,0-1规划跟这里的线性与非线性规划是类似的,前提是你要好好理解这里的集合到底是怎么写的,川川在这里希望你要多花时间琢磨一下,不是看一眼就会的。
结合上一篇lingo入门,基本上你已经学会了lingo的使用了,lingo到此为止。后续我将继续开始介绍算法和模型。祝大家建模比赛顺利。

文章来源: chuanchuan.blog.csdn.net,作者:川川菜鸟,版权归原作者所有,如需转载,请联系作者。

原文链接:chuanchuan.blog.csdn.net/article/details/119793037

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。