想自己写一个edmond的matlab代码实现
写了两个函数和一个脚本
分别是一个检验有没有增广路径的bfs.m函数
function B=bf(source,sink)
%参数调整
source=1;
sink=5;
m=5; %节点数(0-4)
residual=zeros(m); %初始化剩余容量矩阵为0*0
maxflow=zeros(m); %初始化实际流量矩阵为0*0
flow=zeros(m); %初始化增广路径上的最小剩余流量
pre=inf(m); %记录BFS函数中的前置节点
q=source; %创建队列
augumentflow=0;
%重置前置节点为无穷大,方便后续检验
pre=inf(m);
%源点source流量设置为无穷大
flow(source)=inf;
% %源点source入队q
% q=source;
%%检验当前节点的剩余流量是否为零
while ~isempty(q) %判断q是非空
index=q(1); %取出队首元素
q(1)=[]; %清空第一个元素
%检验节点是否为汇点
if index==sink
break;
end
%遍历数组内所有节点,
% 是不是源点、有无剩余容量、是否访问过
for i=1:m
if (i ~= source) && (residual(index, i) > 0) && isinf(pre(i))
pre(i)=index;
flow(i)=min(flow(index),residual(index,i));%判断是否大于剩余流量
q.enqueue(i);%节点入队
end
end
end
%检测是否有增广路径
if isinf(pre(sink))
augumentflow=-1; %无增广路径
else
augumentflow=flow(sink);
end
end
一个生成最大流的函数maxflow.m
function maxflow=mf(source,sink)
sumflow = 0; % 初始化总流量
source=1;
sink=5;
while true
% 调用 BFS 函数寻找增广路径
path=bf(source,sink);
% 检查是否找到增广路径
if augmentflow == -1
break; % 无增广路径,结束算法
end
% 回溯更新残差图
k = sink;
while k ~= source
% 获取前驱节点
prev = pre(k);
% 更新最大流图
maxflowgraph(prev, k) = maxflowgraph(prev, k) + augmentflow;
% 更新残差图
residual(prev, k) = residual(prev, k) - augmentflow; % 减少正向边容量
residual(k, prev) = residual(k, prev) + augmentflow; % 增加反向边容量
% 回溯到前驱节点
k = prev;
end
% 累加流量
sumflow = sumflow + augmentflow;
end
end
以及一个主函数
%初始化设置
m=5; %节点数(0-4)
residual=zeros(m); %初始化剩余容量矩阵为0*0
maxflow=zeros(m); %初始化实际流量矩阵为0*0
flow=zeros(m); %初始化增广路径上的最小剩余流量
pre=inf(m); %记录BFS函数中的前置节点
%输入源点和汇点
source=1;
sink=5;
q=source; %创建队列
%初始化residual的容量数据
% 填充边权重
residual(1,2) = 1; % 边 1-2
residual(1,3) = 2; % 边 1-3
residual(1,4) = 2; % 边 1-4
residual(2,3) = 1; % 边
residual(2,5) = 2; % 边
residual(3,5) = 1; % 边
residual(4,3) = 3; % 边
residual(4,5) = 3; % 边
%填充实际流量
maxflow(1,2)=1;
maxflow(1,3)=0;
maxflow(1,4)=1;
maxflow(2,3)=0;
maxflow(2,5)=1;
maxflow(3,5)=1;
maxflow(4,3)=1;
maxflow(4,5)=0;
%求增广路径
ap=bf(source,sink)
%求最大流
maxf=mf(source,sink)
一直显示Output argument "BFS" (and possibly others) not assigned a value in the execution with "bf" function.
出错 Edmond (第 45 行)
ap=bf(source,sink)
不知道如何修改,然后也不知道自己对着建模写的代码对不对,想请教一下
软件就是matlab R2024a