天天看点

运筹学上的lingo小练习——秒懂!运筹学课上的小练习一、求和二、实际问题总结

运筹学课上的小练习

笔者也是菜鸟一枚,这篇博客记录了我们课上的练习,如有错误请不吝赐教。

一、求和

题1:

求1+2+3+…100;

!lingo代码:;
sets:
	set/1..100/:x;
endsets

@for(set(i):x(i) = i);
sum = @sum(set(i):x(i));
           

输出结果:

运筹学上的lingo小练习——秒懂!运筹学课上的小练习一、求和二、实际问题总结

题2:

求1+2+3+…+98+100;

!lingo代码:;
sets:
	set/1..98/:x;
endsets

data:
	a = 100;
enddata

@for(set(i):x(i) = i);
sum = @sum(set(i):x(i));
final_sum = sum + a;
           

输出结果:

运筹学上的lingo小练习——秒懂!运筹学课上的小练习一、求和二、实际问题总结

题2:

求1+2+3+…+97+100;

同题2

二、实际问题

题1:

垃圾站问题

在十二个小区里建中转站,以成本最小为原则,看最少需要建几个中转站,以及各个中转站所辐射的小区。各个小区的回收量、投建中转站的固定成本和能提供的最大容量如下表所示。建立模型用lingo进行求解。

运筹学上的lingo小练习——秒懂!运筹学课上的小练习一、求和二、实际问题总结

分析:

笔者初看此题,一头雾水(太菜了(×_×)),读了几遍题才知道题的意思。

题的意思是:

1.总共有12个小区,每个小区都可以建立垃圾中转站,将一个小区的垃圾运送到有中转站的小区是有运费(表中上部)的。

2.每个小区自身是要产生垃圾的,产生垃圾的量就是表中的“回收量”。

3.建立每个垃圾中转站是是要花钱的,费用就是表中的“固定成本”。

4.每个中转站垃圾的最大容纳量为18。

于是可以建立模型如下:

xi_j 表示 小区i 运送到有中转站的 小区j 的垃圾数量;

cij表示 小区i 运送每单位垃圾到有中转站的 小区j 的运费;

di表示 小区i 建立垃圾中转站的费用;

小区1 小区2 ... 小区12 最大容量
小区1 x1_1 x1_2 ... x1_12 18
小区2 x2_1 x2_2 ... x2_12 18
... ... ... ... ...
小区12 x12_1 x12_2 ... x12_12 18
回收量 4 6 ... 2

可建立以下约束:

x1_1 + x2_1 + ...+ x12_1 = 4——方程1
:
x1_12 + x2_12 + ... + x12_12 = 2——方程12
x1_1 + x1_2 + ... + x1_12 <= 18——不等式1
:
x12_1 + x12_2 + ...+ x12_12 <= 18——不等式12
yi = 1(表示建立中转站)/0(表示不建立中转站)——方程13
xij >= 0, yi = 0或1

上述的数据较大,建议保存到excel文件里。

笔者保存的excel如下图:

运筹学上的lingo小练习——秒懂!运筹学课上的小练习一、求和二、实际问题总结

(需要该excel表的请私信)

总共费用 = 总运费 + 固定费用;

min = ΣΣcijxij + Σyidi;

!lingo代码:;
!a为容量,b为回收量,c为运费,gdcb为固定成本;
model:
	sets:
		hb/1..12/:a,y,gdcb;
		lb/1..12/:b;
		hlb(hb, lb):c,x;
	endsets
	data:
		a = @OLE( 'laji.xls','rongliang');
		b = @OLE( 'laji.xls', 'huishouliang');
		c = @OLE( 'laji.xls', 'yunjia');
		gdcb = @OLE( 'laji.xls', 'gudingchengben');
		@OLE('laji.xls', 'jie') = x;
	enddata
	@for(hb(i):@sum(lb(j):x(i,j)) <= a(i)*y(i)); !方程1~~方程12;
	@for(lb(j):@sum(hb(i):x(i,j)) = b(j));       !不等式1~~不等式12;
	@for(hb:@bin(y));					   !方程13;
	min = @sum(hlb:c*x) + @sum(hb:y*gdcb);
end
!注意:笔者lingo的版本是17.0,无法读取后缀名为.xlsx文件,可以读取.xls文件;
           

运行结果如下:

运筹学上的lingo小练习——秒懂!运筹学课上的小练习一、求和二、实际问题总结
运筹学上的lingo小练习——秒懂!运筹学课上的小练习一、求和二、实际问题总结

总结

1.定义集:
sets:
	set/1..n/:x;
endsets
2.定义数据:
data:
	a = n;
enddata
3.分别赋值:
即x1 = 1, x2 = 2, ...,xn = n;
@for(set(i):x(i) = i);
4.求和Σ
即sum = x1 + x2 + ...+ xn;
sum = @sum(set(i):x(i));
5.数据相加
a = b + c;