Lingo超经典案例大全要点.pdf
Lingo 超经典案例大全 LINGO 是 Linear Interactive and General Optimizer的缩写,即 “ 交互式的线性和通用优化 求解器 ” 。Lingo 超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、 非线性整数规划、非线性混合规划、二次规划等)比matlab、maple 等强得多, Lingo 编程 简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用Lingo 语言编程,十 分直观。 Lingo 模型由 4 个段构成: (1)集合段( sets endsets );( 2)数据段( data enddata); (3)初始段( init endinit );( 4)目标与约束段。 Lingo 的五大优点: 1. 对大规模数学规划,LINGO 语言所建模型较简洁,语句不多; 2. 模型易于扩展,因为FOR、SUM 等语句并没有指定循环或求和的上下限,如果在集 合定义部分增加集合成员的个数,则循环或求和自然扩展,不需要改动目标函数和约束条件; 3. 数据初始化部分与其它部分语句分开,对同一模型用不同数据来计算时,只需改动数据 部分即可,其它语句不变; 4. “集合 ” 是 LINGO 有特色的概念,它把实际问题中的事物与数学变量及常量联系起来,是 实际问题到数学量的抽象,它比C 语言中的数组用途更为广泛。 5. 使用了集合以及FOR、SUM 等集合操作函数以后可以用简洁的语句表达出常见的规 划模型中的目标函数和约束条件,即使模型有大量决策变量和大量数据,组成模型的语句并 不随之增加 一、求解线性整数规划、非线性整数规划问题: 1.线性整数规划: model: max=x1+x2; x1+9/14*x20.001; abs(x2-1)0.001; end 求得 x1=2,x2=2.若再次排除这组解,发现Lingo 解不出第三组解了,这时我们可以断定: 此优化模型有两组解: x1=3,x2=1 和 x1=2,x2=2. 求解模型时需注意:Lingo 中,默认变量均为非负;输出的解可能是最优解中的一组,要判 断、检验是否还有其他解(根据具体问题的解的情况或用排除已知最优解的约束条件法)。 2、非线性整数规划: model: sets: row/14/:b; col/15/:c1,c2,x; link(row,col):a; endsets data: c1=1,1,3,4,2; c2=-8,-2,-3,-1,-2; a=1 1 1 1 1 1 2 2 1 6 2 1 6 0 0 0 0 1 1 5; b=400,800,200,200; enddata max=sum(col:c1*x2+c2*x); for(row(i):sum(col(j):a(i,j)*x(j)=0) ; ! 对于每一个存在优先关系的作业对(I,J)来说, I 先 J后安排 ; FOR( STATION( K):SUM( TXS( I, K): T( I) * X( I, K) =required (j)( j=1,2,3,.,7) model: sets: days/monsun/: required,start; endsets data: !每天所需的最少职员数; required = 20 16 13 16 19 14 12; enddata !最小化每周所需职员数; min=sum(days: start); for(days(J):sum(days(I) | I #le# 5:start(wrap(J+2+I,7) = required(J); end 解得: 总共需要22 人,周一8 人开始值班,周二2 人,周三0 人,周四6 人,周五3 人, 周六 3 人,周日0 人。 十、填数问题 分别把 1,2, ,16 填到图示的16 个圈内,使得每个三角形上的所有圈内的数的和为81 (共 4 个三角形)。 决策变量 :e_ij=1,第 i 个圈填数a_j;e_ij=0, 第 i 个圈不填数a_j。a_j=j,j=1,2,3,.,16 。 模型: model: sets: number/116/:a; link(number,number):e; tri1(number)/1 2 3 4 5 6 7 8 9/; tri2(number)/1 2 3 4 16 15 12 11 10/; tri3(number)/4 5 6 7 14 13 12 15 16/; tri4(number)/7 8 9 1 10 11 12 13 14/; endsets data: a=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; enddata objmax=sum(link(i,j):e(i,j)*a(j); for(number(i):sum(link(i,j):e(i,j)=1); for(number(j):sum(link(i,j):e(i,j)=1); for(link(i,j):bin(e(i,j); sum(number(j):sum(tri1(i):e(i,j)*a(j)=81; sum(number(j):sum(tri2(i):e(i,j)*a(j)=81; sum(number(j):sum(tri3(i):e(i,j)*a(j)=81; sum(number(j):sum(tri4(i):e(i,j)*a(j)=81; sum(link(i,j):e(i,j)*a(j)=136; end 红色的那句程序可以去掉,也可以为:min=sum(link(i,j):e(i,j)*a(j),但求的结果不同,结 果都符合要求。 编号 116 的圆圈的填数结果至少有3 种: (1)12 11 1 10 7 8 14 13 5 9 4 16 2 6 15 3 (2)14 3 5 15 8 7 13 4 12 6 11 10 9 2 16 1 (3)14 11 4 15 9 8 13 2 5 16 3 10 12 6 1 7 为了求得更多的解,可以约束编号116 的圆圈的填数结果不为以上3 种结果。 model: sets: number/116/:a; link(number,number):e; tri1(number)/1 2 3 4 5 6 7 8 9/; tri2(number)/1 2 3 4 16 15 12 11 10/; tri3(number)/4 5 6 7 14 13 12 15 16/; tri4(number)/7 8 9 1 10 11 12 13 14/; yueshu1:c1; yueshu2:c2; yueshu3:c3; endsets data: a=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; c1=12 11 1 10 7 8 14 13 5 9 4 16 2 6 15 3; c2=14 3 5 15 8 7 13 4 12 6 11 10 9 2 16 1; c3=14 11 4 15 9 8 13 2 5 16 3 10 12 6 1 7; enddata objmin=sum(number(i):sum(number(j):e(i,j)*a(j); for(number(i):sum(number(j):e(i,j)=1); for(number(j):sum(link(i,j):e(i,j)=1); for(link(i,j):bin(e(i,j); sum(number(j):sum(tri1(i):e(i,j)*a(j)=81; sum(number(j):sum(tri2(i):e(i,j)*a(j)=81; sum(number(j):sum(tri3(i):e(i,j)*a(j)=81; sum(number(j):sum(tri4(i):e(i,j)*a(j)=81; sum(link(i,j):e(i,j)*a(j)=136; sum(yueshu1(j):sum(link(i,j):e(i,j)16; sum(yueshu2(j):sum(link(i,j):e(i,j)16; sum(yueshu3(j):sum(link(i,j):e(i,j)16; end 解得:( 4) 12 15 11 10 3 8 16 1 5 4 7 14 9 13 2 6 可以继续下去:· · · · · · 十一、数独求解 在琳琅在线数独随机截取一至尊级题目如下: 用 Lingo 求解这道题。