拓扑排序的 +Leapms 线性规划模型

知识点

拓扑排序

拓扑排序的+Leapms模型

无圈有向图

一个图G(V,E), 如果边有向且不存在回路,则为无圈有向图。在无圈有向图上可以定义拓扑排序。下图是一个无圈有向图的例子。

拓扑排序

给定一个无圈有向图G(V,E),对其顶点集合V中的元素进行排序,使得对任何两个顶点v1,v2,如果(v1,v2)是图上的一条边,则在排序中v1优先于v2.

拓扑排序的+Leapms模型

对图G(V,E)中的边的表示可以用其起始边和终止边表示,对第k条边,其起始定点使用函数alpha[k]表示,其终止顶点用beta[k]表示。

设m是图中的边数,n是图中的顶点数。设x[i]是顶点i的次序数(拓扑排序中允许并列次序,例如并列第2等等)。

于是对任意一条边,其终止顶点的次序数一定至少比其起始顶点的次序数大至少1。于是有约束:

x[bata[k]]>=x[alpha[k]]+1 | k=1,...,m

希望至少从1开始编号次序数,于是有另外的约束:

x[i]>=1|i=1,...,n

为了对次序数进行紧凑编号,模型的目标设为极小化所有次序数的和:

min sum{i=1,...,n}x[i]

完整的+Leapms模型为:

min sum{i=1,...,n}x[i]
subject to
	x[bata[k]]>=x[alpha[k]]+1 | k=1,...,m
	x[i]>=1|i=1,...,n

where
	m,n are integers
	e is a set
	alpha[k],bata[k] are integers| k=1,...,m
	x[i] is a variable of nonnegative number| i=1,...,n

data_relation
	m=_$(e)/2
	alpha[k]=e[2k-1]  | k=1,...,m
	bata[k]=e[2k] | k=1,...,m
	n=0
	n=max(n,alpha[k]) | k=1,...,m
	n=max(n,bata[k]) | k=1,...,m

data
    e={
	(1 2)
	(1 3)
	(1 4)
	(2 3)
	(2 5)
	(3 5)
	(3 6)
	(4 6)
	(4 7)
	(5 6)
	(5 8)
	(6 8)
	(6 9)
	(7 6)
	(7 10)
	(8 9)
	(8 11)
	(9 11)
	(10 9)
	(10 11)
    }

求解过程:

+Leapms>load
 Current directory is "ROOT".
 .........
        toposort.leap
 .........
please input the filename:toposort
================================================================
1:  // x[i] 是 i点的拓扑排序层次
2:
3:  min sum{i=1,...,n}x[i]
4:  subject to
5:      x[bata[k]]>=x[alpha[k]]+1 | k=1,...,m
6:      x[i]>=1|i=1,...,n
7:
8:  where
9:      m,n are integers
10:     e is a set
11:     alpha[k],bata[k] are integers| k=1,...,m
12:     x[i] is a variable of nonnegative number| i=1,...,n
13:
14:  data_relation
15:     m=_$(e)/2
16:     alpha[k]=e[2k-1]  | k=1,...,m
17:     bata[k]=e[2k] | k=1,...,m
18:     n=0
19:     n=max(n,alpha[k]) | k=1,...,m
20:     n=max(n,bata[k]) | k=1,...,m
21:
22:  data
23:      e={
24:     (1 2)
25:     (1 3)
26:     1 4
27:     2 3
28:     2 5
29:     3 5
30:     3 6
31:     4 6
32:     4 7
33:     5 6
34:     5 8
35:     6 8
36:     6 9
37:     7 6
38:     7 10
39:     8 9
40:     8 11
41:     9 11
42:     10 9
43:     10 11
44:      }
================================================================
>>end of the file.
Parsing model:
1D
2R
3V
4O
5C
6S
7End.
..................................
number of variables=11
number of constraints=31
..................................
+Leapms>mip
relexed_solution=45; number_of_nodes_branched=0; memindex=(2,2)
The Problem is solved to optimal as an MIP.
找到整数规划的最优解.非零变量值和最优目标值如下:
  .........
    x1* =1
    x2* =2
    x3* =3
    x4* =2
    x5* =4
    x6* =5
    x7* =3
    x8* =6
    x9* =7
    x10* =4
    x11* =8
  .........
    Objective*=45
  .........
+Leapms>

标记在图上

拓扑排序的用途

拓扑排序在算法设计上有广泛的用途,例如在制造资源管理中的Gozinto图的计算等。

对上述图如果有向边表示次序关系,则可删除任何起始顶点和终止顶点次序数相差大于2的边得到更加简化的图,且不改变次序逻辑:

原文地址:https://www.cnblogs.com/leapms/p/10059771.html

时间: 2024-10-31 01:49:04

拓扑排序的 +Leapms 线性规划模型的相关文章

浅谈拓扑排序在OI的应用

by MedalPluS [拓扑排序的定义] 引例: 在大学里有很多学科需要学习,而有的学科需要学习其他学科后才能学习,比如说必须先学数学再学微积分......这就是一个拓扑序的关系 [拓扑排序的应用] 对于上述题目,可以假设如果学习a需要学习b的话,从b连一条边到a,然后对整个图求一次拓扑序列,这便是学习的一种方案 很显然,拓扑排序应该从入度为0,然后1,然后2...来找 [拓扑排序的实现] 很容易想到一种算法,暴力枚举每个点,然后找与之相连的点,删掉这条边,并把点的入度-1,再次寻找,知道找

【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割

1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1972  Solved: 917[Submit][Status][Discuss] Description Input Output 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0. Sample Input 3 2 10 0 20 0 -10 0 -5 1 0 0 100 1 2 1 100 0 Sample

旅游公司租车问题 —— 动态规划 v.s. + Leapms线性规划

有一个旅游公司承包一条旅游线路,未来四周内的大巴车需求分别是:4辆.1辆.4辆和5辆.该公司向租车公司租赁服务,租车公司的计价方案是:租车收取一次性手续费3000,每车每周费用2000.求最节省租车方案. 线性规划方法 参数定义: d[k]: 第k周的需求车数: s[k]: 第k周周初库存车辆数量: x[k]: 第k周周初租车数量: y[k]第k周周初还车数量. 目标 数学式: $\min \sum_{k=1}^{n}(3000x_k+2000(x_k+s_k-y_k))$ +Leapms形式:

拓扑排序讲解

在这里我们要说的拓扑排序是有前提的 我们在这里说的拓扑排序是基于有向无环图的!!!. (⊙o⊙)…我所说的有向无环图都知道是什么东西吧.. 如果不知道,我们下面先来来说说什么是有向无环图. 所谓有向无环图,顾名思义是不存在环的有向图(至于有向图是什么不知道的在前面我们有一个图论讲解上都有). 点的入度:以这个点为结束点的边数. 点的出度:以这个点为出发点的边的条数. 拓扑序就是对于一个节点的一个排列,使得(u,v)属于E,那么u一定出现在v的前面.然而拓扑排序就是一个用来求拓扑序的东西. 对于左

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c    

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu

hdu1285(拓扑排序)

这道题要求没有输赢关系的两个元素必须按照升序输出,有输赢关系的,赢得在输的前面,所以用队列或者栈来降低时间复杂度的优化过的拓扑排序会出错. 比如这组输入 5 3 1 2 2 3 4 5 至少我写的两种拓扑排序都wa了.但是不用队列或者栈来优化的话, 1.每次都从头至尾扫描一遍,找到一个没标记过的节点, 2.将它标记 3.然后删除从它出来的每条边. 重复这三个操作,加标记的次序,就是题目要的答案. 下面的代码中用到了队列,但只是用来保存答案而已.并没有用它优化的意思. #include <iost

uva 10305 Ordering Tasks(拓扑排序)

拓扑排序,不用判断是否有环,dfs挺简单的 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> int map[105][105]; int visit[105]; int c[105]; int n,m,t; void dfs(int x) { visit[x] = 1; for(int i=1; i<=n; i++) { if(!visit[i]&&map[i][x]==1)