使用DFS的Ford Fulkerson最大流量,最小切割,Python中的邻接表实现

问题描述

我正在用Python编码,并且是一个初学者。我被福特-富克森DFS邻接表代码所困扰。不知何故,我无法正确分配流量变量。如果有人可以在这里帮助我,那将是很棒的。问题似乎在于流量变量,其中信息无法通过不同的功能正确传输。

#..............................................................................
Code in Python is as follows:  Answer to the problem1 is 11. Answer to problem2 is 19. 
#...................................................................

'''code'''

class Edge:
    def __init__(self,v1,v2,capacity,flow):
        self.from1 = v1
        self.to1 = v2
        self.capacity = capacity
        self.residual=[]
        self.flow = flow
        
        
    def isResidual(self):
        return self.capacity == 0
    
    def remaining_capacity(self):
        
        kk = self.capacity - self.flow
        print("Line 22,inside remaining capacity,kk,self.flow",self.flow )
        return self.capacity - self.flow
        
    def augment(self,bottleneck):
        print("Line 24,INside Augment,self.flow,self.residual.flow,self.from1,self.to1,self.capacity ",self.capacity )
        self.flow =+ bottleneck
        self.residual.flow =- bottleneck
        #self.residual.capacity =- bottleneck
        #self.capacity =- bottleneck
        #self.residual.capacity =- bottleneck
        
        
class Graph:
    def __init__(self,numvertices):
        self.m = numvertices
        self.graph = []
        self.initialize_empty_flow_graph()
        
    def initialize_empty_flow_graph(self):
        
        for i in range(self.m):
            self.graph.append([])
            
    def add_edge(self,flow):
        e1 = Edge(v1,flow)
        e2 = Edge(v2,flow)
        
        e1.residual = e2
        e2.residual = e1
                self.graph[v1].append(e1)
        self.graph[v2].append(e2)
        
class ford_fulkerson:
    def __init__(self,Graph,numvertices):
        #self.n = numvertices
        self.n = numvertices
        self.s = self.n - self.n # source index
        self.t = self.n - 1  # sink index
        self.visitedToken = 0
        #self.visited = list(range(0,self.n))
        self.visited = list(range(100,n+100))
        #self.visited = list(range(-self.n,0))
        self.minCut = [False]*self.n
        self.maxFlow = 0
        
    def solve(self,Graph):
        
        while True:
                
            print("-------Line 293---------,in solve")
            f = self.dfs(Graph,self.s,flow = float("inf"))
            print("Line 79,bottleneck value in solve",f)
            self.visitedToken = self.visitedToken+1
            self.maxFlow = self.maxFlow+f
            
            print("Line 83: self.maxFlow and F",self.maxFlow,f )
            if f == 0:
                break
            
    def dfs(self,node,flow):
        print("-----------a-------------------")
        #print()
        
        if (node == self.t):
            print("Line 92,flow",flow)
            return flow
        
        self.visited[node] = self.visitedToken
        edges = Graph.graph[node]
        for edge in edges:
            print("Line 97:Inside for loop,edge.from1,edge.to1,edge.capacity",edge.capacity)
            if (edge.remaining_capacity()>0 and self.visited[edge.to1] != self.visitedToken):
                print("Line 99:Inside if condition,for loop")
                bottleneck = self.dfs(Graph,min(flow,edge.remaining_capacity()))
                #flow = edge.flow
                print("Line 102,bottleneck",bottleneck)
                if (bottleneck > 0):
                    
                    edge.augment(bottleneck)
                    
                    return bottleneck
        return 0
    
            
#.......................
# Problem 1: # Answer is 11.      

n = 4
g = Graph(n) # nodes+1source node +1 sink node

s = n-n # source node is n-2; 
t = n-1 # sink node is n-1
flow = 0
g.add_edge(s,1,7,flow)
g.add_edge(s,2,12,flow)
g.add_edge(1,9,t,10,flow);
g.add_edge(2,4,flow);

ford = ford_fulkerson(g,n)
ford.solve(g)

#.......................
# Problem 1: # Answer is 19

n = 6
g = adjacency_set_graph(n,directed = False) # nodes+1source node +1 sink node
s = n-n # source node is n-2; 
t = n-1 # sink node is n-1
flow = 0
g.add_edge(s,flow)

g.add_edge(1,3,8,flow)
g.add_edge(2,flow)
g.add_edge(4,6,flow)

g.add_edge(3,flow);
g.add_edge(4,flow);
ford = ford_fulkerson(g)
print(ford.n,ford.s,ford.t)
ford.solve(g)
    

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...