当前位置:   article > 正文

lingo_lingo定义双下标

lingo定义双下标

lingo是专门求解优化的软件,有目标函数,有约束条件 ,可以解决线性优化问题,非线性优化问题,线性方程组,非线性方程组

对于换行可以直接敲回车; 

开头用!,结尾用分号 用于注释,可用于多行注释

lingo不区分大小写

lingo crtl+滚轮 调整代码的字体

lingo中的乘号不能省略

在lingo中加空格不影响

lingo中每一句要用分号结尾

小规模问题:不使用集合语言(变量小于20个等)

大规模问题:使用集合语言


max,min用于定义目标函数

@bin(x) 表示x为0或1

@gin(x)表示x为整数

@free(x)表示x为任意实数

@bnd(L,x,U)表示x为[L,U]之间的实数

lingo中默认变量都是非负数

  1. min=2*x1+3*x2;
  2. x1+x2>=350;
  3. x1>=100;
  4. 2*x1+x2<=600;
  5. !x1 -100,100;
  6. @free(x1); !去掉变量的限制
  7. @bnd(-100,x1,100);

对于大规模问题要用集合

  1. !写一个集合可以运行的看一下报不报错;
  2. !定义集合;
  3. sets:
  4. L/1..6/:a,b,d;!单下标a,b,d的下标都是1..6;
  5. YY/1,2/: e,x ,y;!单下标e,x的下标都是1..2;
  6. H(L,YY):C;!双下标,C是由L,Y组成的双下标;
  7. endsets
  8. !数据集合;
  9. data:
  10. a=6, 2, 6 , 4 ,2 ,9 ;
  11. b=4 ,9 ,5 ,3 ,5 ,8 ;
  12. d=1 ,2, 1, 9, 4, 3 ;
  13. e=10 20;
  14. x=1 2;
  15. y=1 10;
  16. enddata
  17. !目标函数;
  18. min =@sum(YY(j):@sum(L(i):
  19. C(i,j) * @sqrt( (x(j)-a(i))^2 + (y(j)-b(i))^2 ) ) ) ;
  20. !j从1..2,在YY集合里就写YY(j);
  21. !@sum(YY(j):表达式a(j)):表示求和符号
  22. !约束;
  23. !for 循环;
  24. !对于所有的i来说;
  25. @for(L(i):
  26. @sum(YY(j):c(i,j))
  27. =d(i) );
  28. @for(YY(j):
  29. @sum(L(i):c(i,j))
  30. <=e(j) );

 求解非线性问题就要设置

  1. !求解非线性问题;
  2. max=@sin(r)/r+1;
  3. r=@sqrt((x-50)^2+(y-50)^2)+2.71828;
  4. @bnd(0,x,100);
  5. @bnd(0,y,100);
  6. !在solver中选择全局求解器,点击全局求解;

求解方程组

  1. !求解方程组;
  2. 10*(x+y)=750;
  3. 20*(x-y)=350;

目标函数是0就是没有的意思

*.lng可以用记事本打开,*.lg4只能用lingo打开

求解:

点击靶子求解,或者ctrl+U求解,点solver

  1. !求解非线性方程;
  2. x^2+y^2=2;
  3. 2*x^2+x+y^2+y=4;

 只能找到一个解,可以加条件进行变换解的范围;

  1. x^2+y^2=5^2;
  2. y>=2;
  3. x>=2;
  4. @gin(x);
  5. @gin(y);

目标函数的Z不要输入;

lingo中没有严格大于或严格小于,只有>=,=,=<三种,输入>相当于输入>=,它会自己改;

要属于严格小于,可以减去一个非常非常小的数


不使用集合语言

容易检查

  1. max=4*x1+3*x2;
  2. 2*x1+x2<10;
  3. x1+x2<=8;
  4. x<=7;
  5. @gin(x1);
  6. @gin(x2);

 条件的顺序没有任何的关系(顺序随便)

  1. !x属于(-5,5)的整数;
  2. @free(x);
  3. @bnd(-5,x,5);
  4. @gin(x);

 x只能取-1和1

  1. !x属于{-1,1},x只能取-11;
  2. @bin((x+1)/2);

大规模问题

多个约束条件用for,多个求和使用sum

s/1..2/:c,x;  定义一个S集合,c,x变量依赖于s这个集合

eq?%5Csum_%7Bj%5Cin%20S%7D%20%7BC%7D_%7Bj%7D%5Ccdot%7Bx%7D_%7Bj%7D   

 @sum()---------表示求和符号

                       S(j)-----------表示j在S里面取值,    S={1,2}

   :-------表示对于什么求和

@        sum(        s(j):        c(j)*x(j)        )


x1,x2...x200均为整数<------------> xi均为整数,for i属于S

@for(        s(i)        :        @        gin(         x(i)         )         )

model:开始                                end结束                                               可有可无 

c=1 2 3;中间用,  空格  或回车都可以

段 -------------------  冒号开始   结束不用符号

lingo程序主要分为:1.集合段   2.数据段   3.模型段   4.其他:初始化段,计算段,子模型段

注:

各段之间没有顺序关系

数据段不能使用分式;

数据段可使用问号“?”来实现实时输入;

数据段可从硬盘文件中读取  A=@file(data.txt);

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

title:标题; 

@text(data.txt)=@table(x);   !把x作为表格输出出来,输出到文本文件里,空的就输出到屏幕上;

  1. model:
  2. title:指派问题;
  3. sets:
  4. s/1..5/:;
  5. link(S,S):c,x;
  6. endsets
  7. data:
  8. c=3 8 2 10 3
  9. 8 7 2 9 7
  10. 6 4 2 7 5
  11. 8 4 2 3 5
  12. 9 10 6 9 10;
  13. @text(data.txt)=@table(x); !把x作为表格输出出来,输出到文本文件里,空的就输出到屏幕上;
  14. enddata
  15. min=@sum(link(i,j):c(i,j)*x(i,j));!两个求和符号;
  16. @for(S(i):@sum(S(j):x(i,j))=1);
  17. @for(S(j):@sum(S(i):x(i,j))=1);
  18. @for(link(i,j):@bin( x(i,j) ) );

link(i,j)表示对集合里的所有下标求和可以省略掉 变成 link 


逻辑运算

#gt#: great than                         (严格大于)

#ge#:great than or equal          (大于或等于)

#lt# less than                             (严格小于)

#eq#:equal                                  (等于)

#ne#:not equal                            (不等于)

#not#

#and#

#or#

 对指标进行限制

@sum(  s(i)         |         i #ge#5 :        x(i)  )    !不能使用>这些符号

一些函数

@abs(x)     @sin(x)    @exp(x)   @log(x)    @lgm(x)  @floor(x)

  @cos(x)    @tan(x)    @sing(x)   @mod(x,y)   @smax(x1,x2,x3...xn)

@smin(x1,x2,x3...xn)

注意:max 对于目标函数的     @smax----对于一个系列          @max-----对于集合

集合函数

@size  这个集合有几个下标,几个元素

@wrap 

@rand  随机数

@qrand 


 x^2+y^2=1;
@atan(X)-y=0;

利用最小二乘法,将上述的非线性方程转换为非线性规划问题:

min      (x^2+y^2-1)^2+(arctan-y)^2 ;


lingo放到TXT中

~   txt文本中表示结束

3  8  2 10  3
8  7  2  9  7
6  4  2  7  5
8  4  2  3  5
9  10 6  9  10~

1 2  3~

  c=@file('新建文本文档.txt');

  d=@file('新建文本文档.txt');!读完c的数据接着读下面的数据给d

  d=1 2 3;

将解的结果放到记事本里

@text('result.txt')=@write('the result is :',@newline(1))  !结果是:换一行开始;

@text('result.txt')=@write(  link(i,j) |  x(i,j)#gt#0:     ' x('   , i,   ','  ,j,  ')=1'  ,@newline(1)    );

@text('result.txt')=@table(x);


随机数

  1. !@qrand(seed)可生成一系列的随机数,但只能用在数据段;
  2. !seed随机种子;
  3. model:
  4. data:
  5. M=4;N=2;seed=1234567;
  6. enddata
  7. sets:
  8. rows/1..M/;
  9. cols/1..N/;
  10. table(rows,cols):x,y;
  11. endsets
  12. data:
  13. x=@qrand(seed);
  14. @text()=@table(x);
  15. @text()=@table(y);!放最后面一行会报错;
  16. enddata
  17. @for(table(i,j):y=20*x);
  1. !@rand(seed)可生成一个随机数,但可以用在数据段和计算段;
  2. !seed随机种子;
  3. model:
  4. data:
  5. M=4;N=2;seed=1234567;
  6. enddata
  7. sets:
  8. rows/1..M/;
  9. cols/1..N/;
  10. table(rows,cols):x,y;
  11. endsets
  12. Calc:
  13. @for(table(i,j):x(i,j)=@rand(seed);
  14. seed=x(i,j));
  15. endCalc
  16. data:
  17. @text()=@table(x);
  18. @text()=@table(y);!放最后面一行会报错;
  19. enddata
  20. !模型段;
  21. @for(table(i,j):y=20*x);

对于这个随机种子哔哩哔哩有个up主讲的很好,下面是连接很短,虽然是别的软件但是内容一样

https://www.bilibili.com/video/BV177411w7RJfrom=search&seid=8077816425857132924&spm_id_from=333.337.0.0https://www.bilibili.com/video/BV177411w7RJ?from=search&seid=8077816425857132924&spm_id_from=333.337.0.0

lingo界面的参数设计 ,我英语太差了,一般看着ling8.0的中文版,调lingo18版的英文版

进行灵敏度分析,一般不使用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo55qE5LiN6IO95YaN56yo55qE5oeS576K576K,size_10,color_FFFFFF,t_70,g_se,x_16

 非线性规划要求全局最优解,默认没有求全局最优解

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo55qE5LiN6IO95YaN56yo55qE5oeS576K576K,size_10,color_FFFFFF,t_70,g_se,x_16

 


lingo求解非线性规划的设置

1.lingo非线性求解器设置那里勾选第一个grash initial sol,其他几个选项不选,不管有没有选全局求解器,几乎所有的非线性规划都可以算出最优解。

2.设置全局求解  

设置初始值 

  1. max=4*x^2-x^4-3;
  2. @free(x);
  3. init:!设置初始值;
  4. x=2;
  5. endinit

 


分段函数

  1. min=fx+fy;
  2. fx=@if(x#gt#0,100,0)+2*x;
  3. fx=@if(x#gt#0,60,0)+3*y;
  4. x+y>=30;

1.@if(x#gt#0,100,0)  如果x>0,x=100,如果x=<0,x=0

2.一般的分段线性函数       还可以引入0-1变量指明x在那个区间

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo55qE5LiN6IO95YaN56yo55qE5oeS576K576K,size_20,color_FFFFFF,t_70,g_se,x_16

 1b3ce5fbfb1f4f739c7dccf8bb2cbcf6.png

 

3.分段是非线性函数,可以使用     sign(x-1)+1   变形来处理

window--->status window(状态窗口)

window--->tile(排列窗口)   (运行过后才能按)

LP线性规划

Reduced Cost  (检验数)   x变化一个单位,目标函数值减小多少

把求解出来的变量带进原方程取等号,松弛变量就是0,否则算出来的和边界差多少就写多少。就它成长的空间这个意思

对偶价格为0:只给你12个资源,你再给更多的资源(约束放大),他的目标值也不会变

  1. max=2*x1+3*x2;
  2. x1+2*x2<=8;
  3. 4*x1 <=16;
  4. 4*x2<=12;

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo55qE5LiN6IO95YaN56yo55qE5oeS576K576K,size_14,color_FFFFFF,t_70,g_se,x_16

  1. max=2*x1+3*x2;
  2. x1+2*x2<=8;
  3. 4*x1 <=16;
  4. 4*x2<=120000;

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo55qE5LiN6IO95YaN56yo55qE5oeS576K576K,size_13,color_FFFFFF,t_70,g_se,x_16

 对偶价格就是说,资源量给你增加一个单位,你的目标值将增加多少

  1. max=2*x1+3*x2;
  2. x1+2*x2<=9;
  3. 4*x1 <=16;
  4. 4*x2<=12;

目标值变成了14.00+1.500=15.5000

PILP纯的整数线性规划


lingo求解时间

子模型

  1. submodel SM: !子模型;
  2. [obj]max =4* x1 + 3 * x2; !obj--目标函数;
  3. 2*x1+x2<=10;
  4. x1+x2<=8;
  5. x2<=7;
  6. endsubmodel
  7. calc:
  8. before=@time();!获得开始计算的时间;
  9. @solve(SM);!求解子模型;
  10. after=@time();!获得结束计算的时间;
  11. @write('运行时间是:',@format(after-before,'10.2g'),'seconds',@newline(1));
  12. @write('目标函数值是:',obj);
  13. endcalc
  1. !重复计算1000遍;
  2. sets:
  3. iter/1..1000/;
  4. endsets
  5. submodel SM:
  6. [obj]max =4* x1 + 3 * x2;
  7. 2*x1+x2<=10;
  8. x1+x2<=8;
  9. x2<=7;
  10. endsubmodel
  11. calc:
  12. before=@time();
  13. @for( iter(i) : @solve(SM));
  14. after=@time();
  15. @write('运行时间是:',@format(after-before,'10.2g'),'seconds',@newline(1));
  16. @write('目标函数值是:',obj);
  17. endcalc

两个子模型 

  1. !计算100遍;
  2. sets:
  3. iter/1..100/;
  4. endsets
  5. submodel SM1:
  6. max =4* x1 + 3 * x2;
  7. 2*x1+x2<=10;
  8. x1+x2<=8;
  9. x2<=7;
  10. endsubmodel
  11. submodel SM2:
  12. max =4* x1 + 3 * x2+100;
  13. 2*x1+x2<=10;
  14. x1+x2<=8;
  15. x2<=7;
  16. endsubmodel
  17. calc:
  18. before=@time();
  19. @for( iter(i) : @solve(SM1));
  20. @for( iter(i) : @solve(SM2));
  21. after=@time();
  22. @write('运行时间是:',@format(after-before,'10.2g'),'seconds',@newline(1));
  23. @write('目标函数值是:',obj);
  24. endcalc
  1. submodel SM:
  2. max=5*x1+6*x2;
  3. 2*x1+x2<5;
  4. x2<3;
  5. endsubmodel
  6. Calc:
  7. @solve(SM);
  8. @divert('C:\Users\hff\Desktop\data.txt','a');!转到那个位置写文件;
  9. @write('目标函数值',obj, ',x1=' ,x1, ',x2=',x2,@newline(1) );
  10. endCalc

lingo与Excel

  1. model:
  2. sets:
  3. s/1..10/:a,b;
  4. endsets
  5. data:
  6. a,b= @ole('懒羊羊.xlsx','名称1','名称2');
  7. endata
  8. end

定义名称

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo55qE5LiN6IO95YaN56yo55qE5oeS576K576K,size_20,color_FFFFFF,t_70,g_se,x_16

 或者,改完之后敲回车

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo55qE5LiN6IO95YaN56yo55qE5oeS576K576K,size_7,color_FFFFFF,t_70,g_se,x_16

 如果文件打开了,路径名和文件名都可以省略掉。

a,b= @ole( ,'名称1','名称2');

@ole( ,'名称1','名称2')=a,b;写到Excel里;


 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55660
推荐阅读
相关标签
  

闽ICP备14008679号