lingo基础入门Day 8——派生集合与最短路径建模求解

lingo基础入门Day 8

lingo:稠密集合与稀疏集合

派生集合分为两种:

稠密集合:

如果一个派生集合在定义时省略了元素列表,那么意味着他的元素是全部父级元素的所有组合构成的,这样的集合被称为稠密集合。

稀疏集合:

如果派生集合的元素只是稠密集合中的一部分(子集),那么这样的派生集合就被成为稀疏集合。

派生集合的构造方法:

语法格式:
派生集合的名字(父集合,...,父集合N)[/元素列表/][:属性元素];
稀疏集合的定义方法

直接罗列法:

factory/A1..A3/;
shop/B1..B4/;
link(factory,shop)
/A1 B1,A1 B2,,
A2 B3,A2 B4,
A3 B1,A3 B2,A3 B3/;

元素过滤法:

factory/A1..A3/;
shop/B1..B4/;
link(factory,shop)|&1 #LE# &2;

最短路径的建模与求解:

求从一条城市A出道到G的最短路线

引入决策变量Xij:

如果Xij=1,表示最终A到G的最短路径经过弧(i,j);

如果Xij=0,表示最终A到G的最短路径不经过弧(i,j);

最短路径问题的整数规划模型

在这里插入图片描述

模型的建立:
MODEL:

SETS:
	CITY/A B C D E F G/;
	ROAD(CITY,CITY)
	/A B,A C,
	 B D,B E,B F,
	 C D,C E,C F,
	 D G,
	 E G,
	 F G/:W,X;
ENDSETS

DATA:
 W=
  2 4
  3 5 1
  2 3 6
  4 
  3
  5;
ENDDATA

MIN = @SUM(ROAD: W*X);

@SUM(ROAD(I,J)|I #EQ# A: X(I,J))=1;
@SUM(ROAD(I,J)|J #EQ# G: X(I,J))=1;
@FOR(CITY(I)|I #NE# A #AND# I #NE# G:
	@SUM(ROAD(I,J):X(I,J))=@SUM(ROAD(K,J):X(K,I))
);
	@FOR(ROAD: @BIN(X));
END

在这里插入图片描述

网络最大流问题的建模与求解
  • 网络最大流问题是人们生活中许多问题的抽象,例如:交通中有车流,运输系统中有物资流,地铁车站有旅客流等等
  • 在每一网格中每一条弧(i,j)都有实际的流量限制,也就是通过这一条弧的实际流量必须在[0,cij]之间。
  • 求出网络中从顶点1-7最大流量。
  • 引入决策变量Fij和Fmax
  • fij是达到最大流是,弧(i,j)上的实际流量,fmax就是网络的最大流量,它等于顶点1的全部出射弧上的流量之和,也等于顶点7的全部入射弧的流量之和。
完整模型:
MODEL:

SETS:
	Vertex/1..7/;
	Arc(Vertex,Vertex)
	/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(Vertex);
 MAX = FMAX;
 @SUM(ARC(I,J)|I #EQ# 1: F(I,J))=FMAX;
 @SUM(ARC(I,J)|J #EQ# N: F(I,J))=FAMX;

 @FOR(Vertex(I)|I #GT# 1 #AND# I #LT# N:
	@SUM(ARC(K,I):F(K,I))=@SUM(ARC(I,J):F(I,J))
);
 @FOR(ARC(I,J): F(I,J)<=C(I,J));
END 
	
实现结果:

在这里插入图片描述

  Global optimal solution found.
  Objective value:                              18.00000
  Infeasibilities:                              0.000000
  Total solver iterations:                             8


                       Variable           Value        Reduced Cost
                              N        7.000000            0.000000
                           FMAX        18.00000            0.000000
                           FAMX        18.00000            0.000000
                       C( 1, 2)        8.000000            0.000000
                       C( 1, 3)        10.00000            0.000000
                       C( 1, 4)        12.00000            0.000000
                       C( 2, 3)        3.000000            0.000000
                       C( 2, 5)        6.000000            0.000000
                       C( 3, 4)        4.000000            0.000000
                       C( 3, 5)        4.000000            0.000000
                       C( 3, 6)        7.000000            0.000000
                       C( 4, 6)        8.000000            0.000000
                       C( 5, 6)        9.000000            0.000000
                       C( 5, 7)        8.000000            0.000000
                       C( 6, 7)        10.00000            0.000000
                       F( 1, 2)        4.000000            0.000000
                       F( 1, 3)        6.000000            0.000000
                       F( 1, 4)        8.000000            0.000000
                       F( 2, 3)        0.000000            0.000000
                       F( 2, 5)        4.000000            0.000000
                       F( 3, 4)        0.000000            0.000000
                       F( 3, 5)        4.000000            0.000000
                       F( 3, 6)        2.000000            0.000000
                       F( 4, 6)        8.000000            0.000000
                       F( 5, 6)        0.000000            0.000000
                       F( 5, 7)        8.000000            0.000000
                       F( 6, 7)        10.00000            0.000000

 

集合操作函数

函数名返回值
@IN(s:e)如果元素e在集合s中,返回1,否则返回0.
@SIZE返回集合s中的成员个数
@INDEX(s:ek)返回成员ek在集合s中的顺序号,顺序号从1开始,最大为s中的元素个数
@WRAP(I,N)用来转换集合两端的索引,到达集合最后一个元素,再从第一个元素开始索引

总结

本小节主要讲了lingo的稠密集合与系稀疏集合,还有稀疏集合的两种定义方法,直接列举法与条件过滤法,最短的路径规划以及网络最大流派,最后还讲了有关集合操作函数。

  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值