lingo解决线性规划问题的程序经典Word格式文档下载.docx
- 文档编号:18503673
- 上传时间:2022-12-18
- 格式:DOCX
- 页数:19
- 大小:89.20KB
lingo解决线性规划问题的程序经典Word格式文档下载.docx
《lingo解决线性规划问题的程序经典Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《lingo解决线性规划问题的程序经典Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
运输单价,决策运输量;
==================================;
s=60,55,51,43,41,52;
d=3537223241324338;
c=62674295
49538582
52197433
76739271
23957265
55228143;
submodeltransfer:
min=cost;
目标函数极小化;
cost=@sum(links:
c*x);
目标函数:
运输总成本;
@for(rows(i):
@sum(cols(j):
x(i,j))<
s(i));
产量约束;
@for(cols(j):
@sum(rows(i):
x(i,j))>
d(j));
!
需求约束;
endsubmodel
calc:
@solve(transfer);
运行子模块(解线性规划);
@divert('
transfer_out.txt'
);
向.txt文件按自定格式输出数据;
@write('
最小运输成本='
cost,@newline
(1),'
最优运输方案x='
@write(@newline
(1));
@writefor(cols(j):
'
@format(x(i,j),'
3.0f'
)));
@divert();
关闭输出文件;
endcalc
end
打开transfer_out.txt文件,内容为:
最小运输成本=664
最优运输方案x=
0190041000
100320000
0110000400
000005038
347000000
0022002730
例4data段的编写技巧
(1):
从txt文件中读取原始数据
exam_3.lg4源程序中的data也可以写为:
s=@file('
transfer_data.txt'
d=@file('
c=@file('
其中,transfer_data.txt的内容为:
transfer.lg4程序的数据;
产量约束s=;
60,55,51,43,41,52~
需求约束d=;
3537223241324338~
运输单价c=;
62674295
49538582
52197433
76739271
23957265
55228143~
注:
字符~是数据分割符,若无此符,视所有数据为一个数据块,只赋给一个变量;
例5lingo程序的的3种输入和3种输出方法;
exam_5.lg4的源程序;
rows/1..3/:
;
cols/1..4/:
link(rows,cols):
a,b,mat1,mat2;
b=1,2,3,4
5,6,7,8
9,10,11,12;
程序内输入;
a=@file('
a.txt'
外部txt文件输入;
mat1=@ole('
d:
\lingo12\data.xls'
mat1);
EXcel文件输入;
@text('
a_out.txt'
)=a;
列向量形式输出数据;
@for(link:
mat2=2*mat1);
@ole('
)=mat2;
把mat2输出到xls文件中的同名数据块;
向.txt文件按自定格式输出数据(参照前例);
Endcalc
例6程序段中的循环和选择结构举例
exam_6.lg4的源程序;
rows/1..5/:
;
cols/1..3/:
d;
d=023
432
132
472
216;
i=1;
@while(i#le#5:
a=d(i,1);
b=d(i,2);
c=d(i,3);
@ifc(a#eq#0:
infeasible!
'
@newline
(1));
@else
delta=b^2-4*a*c;
sqrt=@sqrt(@if(delta#ge#0,delta,-delta));
@ifc(delta#ge#0:
x1='
(-b+sqrt)/2/a,'
x2='
(-b-sqrt)/2/a,@newline
(1));
-b/2/a,'
+'
sqrt/2/a,'
i'
'
x2='
-'
);
i=i+1;
endcalc
本程序中的循环结构也可以用@for(rows(i):
程序体);
进行计算。
例7指派问题(n人n任务费用最小)
B1
B2
B3
B4
B5
B6
A1
6
2
7
4
A2
9
5
3
8
A3
1
A4
A5
A6
解:
设决策变量
=1或0,表示第i个人是否完成第j项任务,i,j=1,2,…n;
记
=第i个人完成第j项任务的费用,i,j=1,2,…n;
n=6.
设目标函数为总费用,约束条件为
(1)每人只完成一项任务;
(2)每项任务只由一人完成。
于是形成如下规划问题:
exam_7.lg4的源程序;
model:
6人6任务指派问题;
rows/1..6/:
6人6任务;
links(rows,rows):
费用和决策变量;
endsets
-------------------------------------;
c=626742
495385
521974
767392
239572
552281;
submodelappointment:
总费用;
@sum(rows(j):
x(i,j))=1);
每人完成一项;
@for(rows(j):
x(i,j))=1);
每项由一人完成;
@for(links:
@bin(x));
0-1变量约束;
submodelbinVar:
@solve(appointment,binVar);
appointment_out.txt'
最小指派费用='
分配方案x='
@writefor(rows(j):
例8多目标规划转化为单目标规划问题举例
把上述运输问题稍加修改,考虑到运输量可以要取整数,就变成整数规划问题,而且运输问题除了成本最小一个目标以外,有时也要考虑各发点的运输量尽量均衡作为另一个目标。
本程序处理的方法一是两目标加权平均,方法二是只选一个目标,另一个目标转化为约束,从而把多目标改为单目标。
exam_8.lg4源程序;
6发点8收点运输问题;
s;
发点的产量限制;
cols/1..8/:
d;
售点的需求限制;
submodelobj_1:
min=minCost;
minCost=@sum(links:
submodelobj_2:
min=objValue;
objValue=0.4*obj1+0.6*obj2;
二目标加权平均;
obj1=@sum(links:
目标函数1:
obj2=max1-min1;
目标函数2:
发点运输量极差;
@for(links(i,j):
max1;
min1;
submodelobj_3:
min=obj2;
cost1=@sum(links:
cost1<
1.05*minCost;
运输总成本约束;
submodelsubject_to_1:
submodelsubject_to_2:
@gin(x));
整数约束;
@solve(obj_1,subject_to_1,subject_to_2);
运行子模块(解线性整数规划);
intModel_out.txt'
@write(@newline
(2),'
整数规划的最小运输成本='
minCost,@newline
(1),'
@write(@newline
(1));
@writefor(cols(j):
@format(x(i,j),'
@pause();
@solve(obj_2,subject_to_1,subject_to_2);
a'
向.txt文件追加输出数据;
二目标加权平均最小值='
objValue,@newline
(1),'
@solve(obj_3,subject_to_1,subject_to_2);
成本约束时极差最小值='
obj2,@newline
(1),'
成本约束时运输量最平均方案x='
本例中的运输量均衡指标,可以用方差表示,但变成非线性规划问题,只能求出局部最优解,而线性规划的最优解是全局最优解。
例9杂例1
费波那契数列;
exam_9.lg4源程序;
II/1..100/:
Fi;
submodelmyProc:
Fi
(1)=1;
Fi
(2)=1;
@for(II(i)|(i#ge#3)#and#(i#le#n):
Fi(i)=Fi(i-1)+Fi(i-2));
n=10;
@solve(myProc);
Fibo_out.txt'
@writefor(II(k)|k#le#n:
Fi('
@format(k,'
2.0f'
),'
)='
@format(Fi(k),'
),@newline
(1));
@divert();
例10杂例2
II/1..3/:
links(II,II):
a,x;
a=1,2,3
2,1,4
3,2,2;
submodelfMin:
求函数的极值,极小值点;
min=z^2+4*z+3;
@free(z);
submodelfzero:
解方程,求函数的零点;
@cos(y)=y;
@bnd(0,y,5);
submodelget_invMat:
解矩阵方程,求逆阵;
@for(II(i):
@for(II(j):
@sum(II(k):
a(i,k)*x(k,j))=@if(i#eq#j,1,0)));
@free(x));
@solve(fMin);
@solve(fzero);
@solve(get_invMat);
Lingo编程语言参考:
LINGO有9种类型的函数:
1.基本运算符:
包括算术运算符、逻辑运算符和关系运算符
2.数学函数:
三角函数和常规的数学函数
3.金融函数:
LINGO提供的两种金融函数
4.概率函数:
LINGO提供了大量概率相关的函数
5.变量界定函数:
这类函数用来定义变量的取值范围
6.集操作函数:
这类函数为对集的操作提供帮助
7.集循环函数:
遍历集的元素,执行一定的操作的函数
8.数据输入输出函数:
允许模型和外部数据源相联系,进行数据输入输出
9.辅助函数:
各种杂类函数
1.基本运算符
1.1算术运算符
^、﹡、/、﹢、﹣
1.2逻辑运算符:
#not#否定该操作数的逻辑值,#not#是一个一元运算符
#eq#若两个运算数相等,则为true;
否则为flase
#ne#若两个运算符不相等,则为true;
#gt#若左边的运算符严格大于右边的运算符,则为true;
#ge#若左边的运算符大于或等于右边的运算符,则为true;
#lt#若左边的运算符严格小于右边的运算符,则为true;
#le#若左边的运算符小于或等于右边的运算符,则为true;
#and#仅当两个参数都为true时,结果为true;
#or#仅当两个参数都为false时,结果为false;
否则为true
1.3关系运算符
“=”、“<
=”和“>
=”,LINGO中还能用“<
”表示小于等于关系,
2.2数学函数
三角函数@sin(x),@sinh(x),@asin(x),@asinh(x),@cos(x),@cosh(x),@acos(x),@acosh(x),@tan(x),@tanh(x),@atan(x),@atanh(x),@atan2(x)
@abs(x)返回x的绝对值
@exp(x)返回常数e的x次方
@floor(x)返回去掉小数部分后的整数
@log(x)返回x的自然对数
@log10(x)返回x的以10为底的对数
@lgm(x)返回x的gamma函数的自然对数
@mod(m,n)返回用n整除m的余数.,如@mod(5,3)返回2;
@pi()返回圆周率
@pow(x,y)返回x的y次幂
@sign(x)如果x<
0返回-1;
否则,返回1
@smax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值
@smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值
@sqr(x)返回x的平方.
@sqrt(x)返回x的平方根.
2.3金融函数
@fpa(I,n)返回如下情形的净现值:
单位时段利率为I,连续n个时段支付,每个时段支付单位费用。
若每个时段支付x单位的费用,则净现值可用x乘以@fpa(I,n)算得。
@fpl(I,n)返回如下情形的净现值:
单位时段利率为I,第n个时段支付单位费用。
2.4概率函数
@norminv(p,mu,sigma)N(mu,sigma^2)分布函数的反函数
@norminv(p,mu,sigma)N(0,1)分布函数的反函数
@pbn(p,n,x)二项分布的累积分布函数。
当n和(或)x不是整数时,用线性插值法进行计算。
@pcx(n,x)自由度为n的χ2分布的累积分布函数。
@peb(a,x)当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。
@pel(a,x)当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。
@pfd(n,d,x)自由度为n和d的F分布的累积分布函数。
@pfs(a,x,c)当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。
a是顾客数乘以平均服务时间,再除以平均返修时间。
(或)x不是整数时,采用线性插值进行计算。
@phg(pop,g,n,x)超几何(Hypergeometric)分布的累积分布函数。
pop表示产品总数,g是正品数。
从所有产品中任意取出n(n≤pop)件。
pop,g,n和x都可以是非整数,这时采用线性插值进行计算。
@ppl(a,x)Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson分布。
@pps(a,x)均值为a的Poisson分布的累积分布函数。
当x不是整数时,采用线性插值进行计算。
@psl(x)单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布。
@psn(x)标准正态分布的累积分布函数。
@ptd(n,x)自由度为n的t分布的累积分布函数。
@qrand(seed)产生服从(0,1)区间的拟随机数。
@rand(seed)返回0和1间的伪随机数,
2.5变量界定函数
变量界定函数实现对变量取值范围的附加限制,共4种:
@bin(x)限制x为0或1
@bnd(L,x,U)限制L≤x≤U
@free(x)取消对变量x的默认下界为0的限制,即x可以取任意实数
@gin(x)限制x为整数
在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lingo 解决 线性规划 问题 程序 经典