flot de coût quadratique minimum
[c,phi,flag] = min_qcost_flow(eps,g)
scalaire, précision
graphe (liste)
valeur du coût
vecteur ligne des valeurs des flots sur les arcs
problème soluble ou pas (0 ou 1)
min_qcost_flow
calcule flot de coût
quadratique minimum dans un réseau g
. Elle
renvoie le coût total du flot sur les arcs c
et le vecteur ligne des flots sur les arcs
phi
. eps
est la précision
de l'algorithme itératif. Si le problème n'est pas soluble
(impossible de trouver un flot compatible),
flag
est égal à 0, sinon il est égal à 1.
Les bornes sur les flots sont données par les éléments
g.edges.data.min_cap
et
g.edges.data.max_cap
du graphe.
Les valeurs des capacités maximum et minimum doivent être
non négatives. La valeur de la capacité maximum doit
être supérieure ou égale à la valeur de la capacité minimum. Si
la valeur de min_cap
ou de
max_cap
n'est pas donnée elle est supposé
nulle sur chaque arête.
Les coûts sur les arêtes sont donnés par les éléments
g.edges.data.q_orig
et
g.edges.data.q_weight
du graphe. Ce doit être
des valeurs non négatives. Si la valeur de
q_orig
ou q_weight
n'est
pas donnée, elle est supposé nulle sur chaque arête. Le coût
sur l'arc u
est donné par:
(1/2)*q_weight[u](phi[u]-q_orig[u])^2
.
Si les champs de donnée min_cap
ou
max_cap
ou q_orig
ou
q_weight
ne sont pas présents dans la
structure du graphe, ils peuvent être ajoutés et affectés en
utilisant la fonction add_edge_data.
Cette fonction utilise un algorithme dû à M. Minoux.
ta=[1 1 2 2 2 3 4 4 5 6 6 6 7 7 7 8 9 10 12 12 13 13 13 14 15 14 9 11 10 1 8]; he=[2 6 3 4 5 1 3 5 1 7 10 11 5 8 9 5 8 11 10 11 9 11 15 13 14 4 6 9 1 12 14]; g=make_graph('foo',1,15,ta,he); g.nodes.graphics.x=[155,153,85,155,237,244,244,334,338,346,442,440,439,333,438]; g.nodes.graphics.y=[45,177,253,254,253,114,171,257,174,101,172,64,264,350,351]; show_graph(g); ma=edge_number(g) g=add_edge_data(g,'min_cap',[0,1,5,5,0,3,3,5,4,1,4,3,3,1,3,1,1,4,1,3,1,4,5,4,4,2,1,4,2,3,2]); g=add_edge_data(g,'max_cap',[38,37,42,41,34,49,35,36,43,43,43,48,37,.. 36,42,48,44,36,30,31,30,41,32,42,34,48,32,36,36,36,30]); g=add_edge_data(g,'q_weight',ones(1,ma)); [c,phi,flag]=min_qcost_flow(0.001,g);flag g.edges.graphics.foreground(find(phi<>0))=color('red'); g=add_edge_data(g,'flow',phi) g.edges.graphics.display='flow'; show_graph(g); | ![]() | ![]() |