Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mikolalysenko/push-relabel
A push-relabel network flow solver in JavaScript
https://github.com/mikolalysenko/push-relabel
Last synced: about 2 months ago
JSON representation
A push-relabel network flow solver in JavaScript
- Host: GitHub
- URL: https://github.com/mikolalysenko/push-relabel
- Owner: mikolalysenko
- Created: 2013-03-11T15:55:44.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2013-03-17T15:31:13.000Z (almost 12 years ago)
- Last Synced: 2024-10-20T14:28:06.665Z (2 months ago)
- Language: JavaScript
- Size: 121 KB
- Stars: 5
- Watchers: 3
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
push-relabel
============
[Network flow](http://en.wikipedia.org/wiki/Flow_network) is a fundamental tool in computer science and operations research, and can be used to solve many common tasks such as:* [Transportation problems](http://en.wikipedia.org/wiki/Transportation_problem)
* [Assignment problems](http://en.wikipedia.org/wiki/Assignment_problem)
* [Bipartite matching](http://en.wikipedia.org/wiki/Bipartite_matching#Maximum_bipartite_matchings)
* [Project selection](http://en.wikipedia.org/wiki/Max-flow_min-cut_theorem#Project_selection_problem)
* [Image segmentation](http://en.wikipedia.org/wiki/Graph_cuts_in_computer_vision)
* [Stereo vision](http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1315016&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D1315016)This library is an implementation of Goldberg and Tarjan's [push-relabel algorithm](http://en.wikipedia.org/wiki/Push%E2%80%93relabel_maximum_flow_algorithm) for solving network flow problems in JavaScript. It use relabel-to-front ordering as well as the global and gap relabelling heuristics, as described by [Cherkassy and Goldberg](https://www.ads.tuwien.ac.at/teaching/archiv/praktika/CherkasskyGoldberg-1995-MaxFlow.pdf), giving it a run time on the order of |V|^3 in the worst case.
Currently in early development, patches welcome!
Usage
=====
To install the library, use npm:npm install push-relabel
And then you can call it as follows:```javascript
//Solve flow for following network:
//
// 1
// ^ |
// 2 / |1
// / V 1
// s=0-->2--->3
// 9 | |
// |7 |7
// V V
// 4--->t=5
// 4
//
var num_vertices = 6
var source = 0
var sink = 5
var edges = [[0,1],[0,2],[1,2],[2,3],[2,4],[3,5],[4,5]]
var capacities = [ 2, 9, 1, 1, 7, 7, 4 ]//Load library
var pushRelabel = require("push-relabel")//Compute maximum flow
var flow = pushRelabel.maxFlow(num_vertices, source, sink, edges, capacities)
for(var i=0; i= `edges.length`
* `flow` (optional) is an array which will get the resulting flow. If not specified, a new flow array is allocated. Must be of size at least `edges.length`
* `dual` (optional) is the topological dual of the flow network. If not specified, a new dual is computed.**WARNING** If you don't specify a dual, the library will permute the order of the edges/capacities array
Returns: The flow, which is stored in the object `flow`
### `pushRelabel.minCut(num_vertices, source, sink, edges, capacities[, cut, dual])`
Computes a [minimum cut](http://en.wikipedia.org/wiki/Minimum_cut) in a flow network* `num_vertices` is the number of vertices in the graph
* `source` is the index of the source vertex
* `sink` is the index of the sink vertex
* `edges` is a list of edges in the graph
* `capacities` is a list of per-edge capacities. Must have size >= `edges.length`
* `cut` (optional) is an array which will get the resulting cut. If not specified, a new uint8 array is allocated. Must be of size at least `num_vertices
* `dual` (optional) is the topological dual of the flow network. If not specified, a new dual is computed.**WARNING** If you don't specify a dual, the library will permute the order of the edges/capacities array
Returns: The cut
Credits
=======
(c) 2013 Mikola Lysenko. BSD License