annotate tools/myTools/bin/FVS_python3/README.md @ 1:7e5c71b2e71f draft default tip

Uploaded
author laurenmarazzi
date Wed, 22 Dec 2021 16:00:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
1 # README
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
2
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
3 # I) THE METHOD
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
4 This repository contains functions used to approximate the minimum feedback vertex set (FVS) of a directed graph, a problem whose exact solution is known to be NP-hard. This algorithms was used to estimate the size of the minimum FVS in a recent paper "Zañudo, J. G. T., Yang, G., & Albert, R. (2017). PNAS 114: 28, 7234–7239, doi: 10.1073/pnas.1617387114".
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
5
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
6 This algorithm identifies a near-minimum feedback vertex set using simulated annealing (SA) and a local search of topological ordering. The algorithm is describe in the paper "Galinier, P., Lemamou, E. & Bouzidi, M.W. J Heuristics (2013) 19: 797. doi:10.1007/s10732-013-9224-z". The code follows the pseudocode given in Page 805 in that paper.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
7
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
8 The originally code was written in Python 2.7, and this updated version seems to work for Python 3 (although it is still not fully tested). The module requires NetworkX 1.11.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
9
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
10 Another version written in Cython is available at https://github.com/yanggangthu/FVS_cython. The cython version is typically 5-10 times faster than the python version. It has not been updated for use in Python 3.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
11
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
12
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
13 # II) STRUCTURE OF MODULE
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
14 Related functions are stored in FVS.py and FVS_localsearch_10_python.py.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
15
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
16 Core functions of finding a maximum sub topological ordering of a given graph (which is equivalent to identifying a minimum FVS) is written in FVS_localsearch_10_python.py.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
17
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
18 FVS.py is a wrapper, that deals with graph input and identifies a near-minimum FVS by subtracting the nodes in the topological ordering from all the nodes.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
19
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
20 FVS_test.py contains three examples illustrating how to use the code.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
21
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
22 # III) INSTRUCTIONS
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
23
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
24 To use this module, import FVS and call FVS() just as a regular function. The function can take 6 paramters listed below and only the first (the graph) is neccessary.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
25
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
26 This was tested in anaconda3 creating an environment "py37_FVS" with Python=3.7 and networkx=1.1:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
27
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
28 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
29 conda create -n py3_FVS python=3.7 networkx=1.11
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
30 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
31
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
32 From there, the FVS_python3 folder with the contents of the repository was moved to *anaconda3/envs/py37_FVS/lib/python3.7/site-packages*. With that, the *FVS_test.py* runs as it should:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
33
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
34 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
35 python FVS_test.py
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
36
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
37 [(0, 4), (0, 1), (1, 0), (2, 1), (2, 4), (2, 5), (2, 3), (3, 5), (3, 4), (4, 1), (5, 2), (5, 0)]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
38 [0, 2]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
39 [('A', 'B'), ('A', 'D'), ('B', 'C'), ('C', 'A'), ('D', 'A')]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
40 ['A']
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
41 [('A', 'B'), ('B', 'C'), ('C', 'A')]
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
42 ['B']
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
43 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
44
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
45 Parameters
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
46 ----------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
47 G : NetworkX Graph/DiGraph, result for MultiGraph is not tested
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
48 T_0 : the initial temperature in SA
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
49 alpha : the cooling multiplier for temperatue in the geometric cooling regime
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
50 maxMvt_factor : maxMvt_factor times network size is the number of iterations for the inner loop given a fixed temperatue
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
51 maxFail : FVS_local_search stops when maxFail number of outloops (temperatue) fail to improve the result
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
52 randomseed: random seed for generating random numbers
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
53
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
54 Default Parameter Values
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
55 -----------------------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
56 T_0 = 0.6, alpha = 0.99, maxMvt_factor = 5, maxFail = 50, randomseed=None
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
57 The default values are suggested by the author of the paper.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
58 T_0 and maxFail are chosen after a limited number of preliminary experiments
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
59 alpha is chosen more arbitrarily, however alpha should be a positive number slightly smaller than 1.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
60 Increase alpha or maxMvt_factor or maxFail will increase the time of finding FVS.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
61
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
62 Returns
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
63 -------
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
64 An approximation of the minimum FVS of the given graph as a list.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
65
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
66 # IV) EXAMPLES
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
67
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
68 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
69 import networkx as nx
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
70 from FVS_python3 import FVS as FVS
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
71 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
72 Here we construct an example with an optimal solution. G2_FVS shoule be ['A'] as a list.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
73
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
74 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
75 G2=nx.DiGraph()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
76 G2.add_edges_from([('A','B'),('B','C'),('C','A'),('A','D'),('D','A')])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
77 G2_FVS=FVS.FVS(G2)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
78 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
79
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
80 Here we construct an example of three-node feedback loops.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
81 We show how you change all the parameters and set a random seed.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
82 Your result should be the same with the same randomseed.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
83 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
84 G3=nx.DiGraph()
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
85 G3.add_edges_from([('A','B'),('B','C'),('C','A')])
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
86 G3_FVS=FVS.FVS(G3, T_0=0.6, alpha=0.99, maxMvt_factor=5, maxFail=50, randomseed=1)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
87 ```
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
88
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
89
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
90
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
91 # V) COPYRIGHT
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
92
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
93
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
94 The MIT License (MIT)
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
95
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
96 Copyright (c) 2017 Gang Yang and Reka Albert.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
97
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
98 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
99
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
100 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
101
7e5c71b2e71f Uploaded
laurenmarazzi
parents:
diff changeset
102 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.