这里先介绍网络最大流问题以及网络最大流问题拓展的相关其他问题如最小费用流等问题函数代码的使用
原文:http://blog.csdn.net/qq_34861102/article/details/77849582
最大流:
注意Matlab 中的最大流问题是必须是单源和单汇问题,因此这里需要构建虚拟的源点S
和汇点G
。
一共会存在九个节点:
clc,clear
a = zeros(9,9);
a(1,[2:4]) = [20,20,100];
a(2,[5 6 8]) = [30,10,40];
a(3,[7 8]) = [10,50];
a(4,[5:8]) = [20,10,40,5];
a([5:8],9) = [20,20,60,20];
a = sparse(a);
[b,c] = graphmaxflow(a,1,9)
最大流拓展:最小费用最大流
仅仅是在求得最大流之后进行对最小费用的求解:
clc,clear
a = zeros(5);
a(1,[2 3]) = [10 8];
a(2,[4,5]) = [2 7];
a(3,[2 4]) = [5 10];
a(4,5) = 4;
a = sparse(a);
[b c] = graphmaxflow(a,1,5)
最大流量为11
自定义Matlab代码:
最小费用求解
Lingo:
model:
sets:
nodes/s,1,2,3,t/:d;
arcs(nodes,nodes)/s 1,s 2,1 3,1 t,2 1,2 3,3 t/:b,c,f;
endsets
data:
b = 4 1 6 1 2 3 2;
c = 10 8 2 7 5 10 4;
d = 11 0 0 0 -11;
enddata
n = @size(nodes);
min = @sum(arcs:b*f);
@for(nodes(i):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i)) = d(i));
@for(arcs:@bnd(0,f,c));
end
Matlab实现:
n = 5;
%弧容量
a = zeros(5);
a(1,[2 3]) = [10 8];
a(2,[4,5]) = [2 7];
a(3,[2 4]) = [5 10];
a(4,5) = 4;
C = a;
%C = [0 15 16 0 0;0 0 0 13 14;0 11 0 17 0;0 0 0 0 8;0 0 0 0 0];
%弧上单元的费用
a(1,[2 3]) = [4 1];
a(2,[4,5]) = [6 1];
a(3,[2 4]) = [2 3];
a(4,5) = <