Lingo是很好用的规划类问题求解器,相对matlab而言,其形式更加灵活。其实我用的也不是非常多,只是用来求解一些数模或者作业里面的规划类问题。本文简单地罗列一下用过的函数、功能等。
一、界面简介
前面一些新建,打开文件夹,保存什么的就不一一介绍了。主要还是知道一下solver的位置,就是红色圈圈那个,模型写好后点击这个就可以运行了。
其他我用过的还有最上面菜单栏的solver-option。有时候模型比较复杂容易陷入局部最优,于是在里面选择global solver,还可以设置步长。
二、求解格式
model:
sets:
!这里可以设置集合
endsets
data:
!这里初始化数据
enddata
min=a+b+c+d;
!可以用min也可以用max
!这里可以写很多约束条件,不像matlab那样要转化成标准格式输入
end
举例:
set里面相当于声明了数组的长度,维度,以及后面写for循环时可以直接使用这个集合的类型名。
data里面赋值的长度一定要跟sets里面声明的一样长。
model:
sets:
supply/1..20/:c,k2;
week/1..24/:in,out,s;
trans/1..6/:tr;
week1/1..23/:;
link1(supply,week):k1,m;
endsets
data:
Mi=56400;
c=
1.38889 1.66667 1.51515 1.51515 1.66667 1.38889 1.66667 1.66667 1.66667 1.38889 1.51515 1.66667 1.51515 1.51515 1.51515 1.38889 1.51515 1.66667 1.51515 1.38889
;
m=
1859 19 11 94 981 1239 123 1284 151 1497 1448 1677 2188 1499 1313 1351 1237 1454 231 1615 223 1899 1574 1666
132 198 1666 1351 875 1474 858 1326 117 2136 1585 1629 136 1538 188 1429 975 1486 144 78 1248 2221 115 112
15543 0 1 0 14866 13 7 6 13 3 6 5 6 7 12 9 8 3 4 3 5 4 2 5
774 625 792 79 822 849 773 7 814 78 779 688 786 759 781 66 84 73 668 639 725 636 755 698
635 453 631 525 75 676 643 581 648 576 628 612 67 614 724 523 643 54 62 519 583 513 557 547
32 523 683 876 122 1181 835 729 93 879 877 681 757 96 991 97 77 758 798 777 811 742 779 961
337 493 812 67 726 81 754 632 686 77 623 537 6 793 686 785 766 569 611 639 676 632 553 73
413 258 27 162 178 33 448 625 77 839 856 889 926 1119 995 936 959 172 1216 1351 1412 1271 136 78
634 617 62 744 853 878 73 698 894 552 719 822 831 966 83 64 711 671 687 76 744 532 786 779
414 468 76 574 667 893 733 564 785 555 647 744 714 859 525 619 596 75 576 716 684 68 599 66
246 426 29 231 252 337 219 35 173 254 266 284 29 348 186 299 224 271 295 171 264 262 238 293
52 519 61 66 66 687 535 54 584 556 526 475 477 632 559 548 531 513 524 517 495 57 531 535
9253 0 7931 0 4 26 21 17 34 12 13 9 16 19 21 5 17 7 15 6 1 13 9 4
28 282 448 228 32 299 259 323 271 216 24 288 252 385 39 232 219 24 294 283 152 313 221 279
439 314 435 399 437 378 466 35 627 6 649 536 67 57 589 466 494 47 511 443 548 473 546 538
69 31 22 345 289 16 166 366 69 726 754 78 149 847 765 78 621 666 675 699 1222 98 631 1478
0 0 0 4 0 0 0 0 6 122 161 6 18 42 55 16 78 47 49 45 38 48 59 58
35 325 416 418 487 536 46 384 427 424 44 441 45 499 426 46 389 447 431 39 384 394 42 438
474 414 466 467 539 693 599 495 536 55 469 49 488 612 64 625 65 591 552 531 49 48 483 51
582 4 673 42 471 79 57 3 418 63 62 42 423 197 356 41 519 94 581 48 285 171 362 24
;
enddata
min=@sum(supply(i):k2(i));
@for(week(j):in(j)=@sum(supply(i):k1(i,j)*m(i,j)*c(i));
@for(week(j):out(j)=28200);
s(1)=56400+in(1)-out(1));
@for(week1(j):s(j+1)=s(j)+in(j+1)-out(j+1));
@for(supply(i):k2(i)=@if(@sum(week(j):k1(i,j)),1,0));
@for(week(j):s(j)>mi);
@for(link1(i,j):@bin(k1(i,j)));
end
三、基础函数
1.数据类型
一般默认变量连续非负,如果想要设置为0-1变量,可以
@bin(x1);
如果是整数变量,
@gin(x1);
2.for 循环
格式:week1是sets里面定义好的,具体可以看上面的代码。冒号后面直接接语句就行了。
@for(week1(j):s(j+1)=s(j)+in(j+1)-out(j+1));
3.sum求和
格式跟循环类似,一般要赋值给等式左边:
k=@sum(supply(i):k2(i));
4.if语句
实现如果a>3,k=1,否则k=0:
k=@if(a>3,1,0));