lingo派生集合

派生集合的构造方法

派生集合的名字(父集合1,父集合2,....父集合N) [/元素列表/][:属性列表];

稠密集合

运输问题例题

某糖果公司有三个加工厂A1 , A2 , A3,每天的糖果生产量分别是7吨,4吨和9吨,该 公司要将这些糖果分别运送到四个地区的门市部B1,B2, B3,B$销售,每天的销售量分别是3吨,6吨,5吨,6吨,现在已知从每个加工厂A,到各销售门市部B,之间每吨糖果的运价(单位:百元)如下表所示。该糖果厂应该如何调运糖果,在满足各门市部销售需要的情况下,使总的运费支出最少。

  门市部B1 门市部B2 门市部B3 门市部B4 产量
加工厂A1 3 11 3 10 7
加工厂A2 1 9 2 8 4
加工厂A3 7 4 10 5 9
销量 3 6 5 6  

运输问题的数学模型

用ai(i=1,2,3)表示第i个加工厂的产量(单位:吨)

用bi(i=1,2,3,4)表示第j个门市部的销量(单位:吨)

用cij(i=1,2,3;j=1,2,3,4)表示单位运价,即从第i个加工厂向第j个门市部运送一吨糖果的运输价格(单位:百元)

设决策变量xi(i=1,2,3;j=1,2,3,4)为从第i个加工厂调动给第j个门市部的糖果数量(单位:吨)

用lingo建立模型

model:

sets:
factory/1..3/:a;
shop/1..4/:b;
link(factory,shop):c,x;
endsets

data:
a = 7 4 9;
b = 3 6 5 6;
c = 
3 11 3 10
1 9  2  8
7 4 10  5;
enddata

min = @sum(link(i,j):c(i,j)*x(i,j));
@for(factory(i):@sum(shop(j):x(i,j))=a(i));
@for(shop(j):@sum(factory(i):x(i,j))=b(j));

end

求解结果为:

lingo派生集合

指派问题例题

有n项任务要分配给n个人去做,每人只完成一项任务,每个任务也只由一个人完成。

已知第i个人完成第j项任务所需的 时间为Cij (称为效率矩阵)。问如何分配任务,使完成所有工作所用的总时间最少?

  任务A 任务B 任务C 任务D 任务E
人员1 8 6 10 9 12
人员2 12 10 7 15 9
人员3 7 4 3 5 6
人员4 9 5 4 12 8
人员5 4 11 6 7 15

用lingo建立模型

model:
sets:
task/a b c d e/;
worker/1..5/;
link(task,worker):c,x;
endsets

data:
c=
8 6 10 9 12
12 10 7 15 9
7 4 3 5 6
9 5 4 12 8
4 11 6 7 15;
enddata
min = @sum(link(i,j):c(i,j)*x(i,j));
@for(worker(i):@sum(task(j):x(i,j))=1);
@for(task(j):@sum(worker(i):x(i,j))=1);
@for(link:@bin(x));
end

求解结果为:

lingo派生集合

稀疏集合

定义方法

1.直接罗列法

2.元素过滤法

网络最大流例题

网络最大流问题是人们的日常生活中许多问题的抽象。例如:交通系统中有车流,运输系统中有物资流,地铁车站有旅客流,金融系统中有资金流。在网络中每一条弧(ij)都有实际的流量限制cij,也就是通过这一条弧的实际流量必须在[0,cij]之间。

lingo派生集合

用lingo建立模型

model:

sets:
v/1..7/;
a(v,v)/
1 2,1 3,1 4,
2 3,2 5,
3 4,3 5,3 6,
4 6,
5 6,5 7,
6 7
/:c,f;
endsets

data:
c = 
8 10 12
3 6
4 4 7
8
9 8
10;
enddata

n =@size(v);
max = fmax;
@sum(a(i,j)|i#eq#1:f(i,j))=fmax;
@sum(a(i,j)|j#eq#n:f(i,j))=fmax;
@for(v(i)|i#gt#1#and#i#lt#n:@sum(a(k,i):f(k,i))=@sum(a(i,j):f(i,j)));
@for(a(i,j):f(i,j)<=c(i,j));

end

求解结果为:

lingo派生集合

上一篇:
下一篇:
发表评论 取消回复
表情 图片 链接 代码

分享