南邮运筹学实验4:Ford-Fulkerson算法:最大流问题

题目:求发点1到收点7的最大流量,括号中数据为给定初始可行流。

解:

一、计算过程:

1. Excel

先写出容量表,如下图所示。

 

然后,在如下图所示位置输入公式:=SUM(D30:J30),下拉复制公式,另一行的流出量也是如此。

建立约束条件,流量不能超过容量,且要是大于等于0的整数。两个位置流出量值要一致。

得出结果:

 

2. Lingo

MODEL:
sets:
nodes/s,1,2,3,4,5,t/;
arcs(nodes,nodes)/
s,1 s,2 2,1 2,5 2,3 1,4 1,3 3,4 3,t 4,t 5,3 5,t/:c,f;
endsets
data:
c=8 13 5 8 3 7 4 4 10 7 3 6;
enddata
max = flow;
n=@size(nodes);!顶点的个数;
@for(nodes(i)|i#ne#1#and#i#ne#n:
@sum(arcs(j,i):f(j,i))=@sum(arcs(i,j):f(i,j)));
!@for(nodes(i)|i#eq#s;
@sum(arcs(i,j)|i#eq#1:f(i,j))=flow;
!@for(nodes(i)|i#eq#t;
@sum(arcs(i,j)|j#eq#n:f(i,j))=flow;
@for(arcs:@bnd(0,f,c));
END

 

3. Matlab

clc,clear
u(1,2)=8;u(1,3)=13;u(2,4)=4;u(2,5)=7;u(3,2)=5;u(3,4)=3;u(3,6)=8;u(4,5)=4;u(4,7)=10;u(5,7)=7;u(6,4)=3;u(6,7)=6;
f(1,2)=6;f(1,3)=10;f(2,4)=3;f(2,5)=6;f(3,2)=3;f(3,4)=0;f(3,6)=7;f(4,5)=1;f(4,7)=3;f(5,7)=7;f(6,4)=1;f(6,7)=6;
n=length(u);
list=[];
maxf(n)=1;
while maxf(n)>0;
    maxf=zeros(1,n);
    pred=zeros(1,n);
    list=1;
    record=list;
    maxf(1)=inf;
    %list是未检查邻接点的标号点,record是已标号点
    while(~isempty(list))&(maxf(n)==0)
        flag=list(1);
        list(1)=[];
        label1=find(u(flag,:)-f(flag,:));
        label1=setdiff(label1,record);
        list=union(list,label1);
        pred(label1)=flag;
        maxf(label1)=min(maxf(flag),u(flag,label1)...
            -f(flag,label1));
        record=union(record,label1);
        label2=find(f(:,flag));
        label2=label2';
        label2=setdiff(label2,record);
        list=union(list,label2);
        pred(label2)=-flag;
        maxf(label2)=min(maxf(flag),f(label2,flag));
        record=union(record,label2);
    end
    if maxf(n)>0
        v2=n;
        v1=pred(v2);
        while v2~=1
            if v1>0
                f(v1,v2)=f(v1,v2)+maxf(n);
            else
                v1=abs(v1);
                f(v2,v1)=f(v2,v1)-maxf(n);
            end
            v2=v1;
            v1=pred(v2);
        end
    end
end
f
f(1,2)+f(1,3)

u表示路线上的容量。

f表示路线上的流量。

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Ford-Fulkerson算法是一种解决最大流问题算法,它通过不断寻找增广路径来增加流量,直到无法找到增广路径为止。在Matlab中,可以使用图论工具箱中的函数来实现Ford-Fulkerson算法,例如使用graph和maxflow函数。具体实现方法可以参考Matlab官方文档或相关教程。 ### 回答2: Ford-Fulkerson算法是求解最大流问题的一种经典算法,用于确定一个网络中从源节点到汇节点的最大可行流量。下面我将简要介绍如何使用Matlab实现Ford-Fulkerson算法。 首先,我们需要定义一个图结构来表示网络。可以使用邻接矩阵来表示有向图,其中矩阵元素表示边的容量。源节点可以用一个预先定义的节点索引表示,汇节点也可以用另一个预先定义的节点索引表示。 接下来,我们可以实现Ford-Fulkerson算法的关键步骤。算法的主要思想是在剩余网络上找到增广路径,并在这条路径上增加流量,直到不能找到增广路径为止。 具体实现中可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来找到增广路径。在每一次搜索过程中,我们需要判断当前节点是否已经被访问过,并且是否还可以通过当前边增加流量。 在找到增广路径后,我们可以计算出该路径上的最小容量(也称作瓶颈容量),并将该容量从剩余网络中减去。随后,我们将该容量添加到流网络中,并继续寻找新的增广路径。 当无法找到增广路径时,算法结束并返回最大流量值。最大流量值等于从源节点发出的所有流量之和。 综上所述,以上是在Matlab中实现Ford-Fulkerson算法的基本步骤。当然,具体实现中还需要考虑一些细节问题,并且可能需要调用一些Matlab内置的图算法函数来辅助实现。 ### 回答3: Ford-Fulkerson算法是用于求解最大流问题的一种常见算法,适用于有向图。算法的基本思想是不断在剩余网络中寻找一条增广路径,然后更新流量分布,直到无法找到增广路径为止。 在MATLAB中,可以使用图算法工具箱中的函数来实现Ford-Fulkerson算法。具体步骤如下: 1. 首先,需要创建一个有向图对象,并定义图中的节点和边。可以使用Graph对象来进行操作。 2. 然后,设置源节点和汇节点,即确定最大流的起点和终点。 3. 接下来,需要定义图中各个边的初始容量。可以使用addedge函数来添加边,并设置其容量。 4. 之后,可以使用fordfulkerson函数来求解最大流。该函数会返回一个最大流值,同时也会更新图中各个边的流量。 5. 最后,可以使用findedge函数来查找某条边的流量。该函数需要指定边的起点和终点节点,返回对应边的流量值。 需要注意的是,Ford-Fulkerson算法的复杂度较高,最坏情况下为O(f * m),其中f为最大流值,m为边的数量。因此,在处理大规模图的情况下可能会面临一定的挑战。 以上是用MATLAB实现Ford-Fulkerson算法的简要过程。通过使用MATLAB的图算法工具箱,可以方便地对最大流问题进行求解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wonz

创作不易,一块就行。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值