Trying to solve the longest cycle problem for a directed, unweighted graph with 133 nodes and 737 edges. (See also Wikipedia Longest Path Problem).
I tried using the networkx library for Python, but it wasn't able to compute it. Is it worth finding a faster implementation like using DFS in C? It seems to be NP hard which discourages me. I'm not sure if this will take minutes, hours, days, or until the heat death of the universe.
Tried using NetworkX to find the cycles but unable to compute within an hour.
Here is the set of edges of the graph:
[
(77, 158), (158, 84), (158, 164), (158, 2294), (328, 41), (328, 2005),
(328, 36), (328, 167), (328, 62), (328, 23), (41, 278), (41, 2229),
(41, 103), (41, 113), (41, 2335), (356, 2751), (356, 258), (356, 275),
(356, 2294), (356, 135), (356, 158), (356, 77), (2751, 202), (2751,
2005), (2751, 167), (2751, 328), (2751, 62), (2751, 36), (2226, 2429),
(2226, 242), (2226, 5), (2226, 2229), (2429, 2247), (2429, 242),
(2429, 2348), (249, 2638), (249, 2226), (249, 2348), (249, 98), (249,
2229), (249, 242), (2638, 166), (2638, 68), (2638, 2429), (2638,
2226), (2638, 2229), (2440, 166), (2440, 326), (166, 62), (166, 167),
(166, 113), (166, 2335), (238, 62), (238, 2459), (238, 96), (238, 57),
(62, 2440), (62, 2439), (2633, 2050), (2633, 221), (2633, 2006),
(2633, 57), (2633, 99), (2633, 333), (2633, 96), (2633, 142), (2633,
238), (2050, 2459), (2050, 2117), (2050, 41), (2050, 2309), (221,
277), (221, 2711), (221, 259), (221, 183), (221, 258), (221, 150),
(221, 2390), (277, 259), (277, 239), (277, 201), (277, 197), (197,
2117), (197, 9), (197, 239), (197, 2641), (197, 251), (197, 66),
(2117, 2006), (2117, 2459), (2117, 2084), (142, 2348), (142, 238),
(142, 2579), (142, 166), (142, 8), (2348, 2638), (2348, 2393), (213,
2509), (213, 195), (213, 2), (213, 2117), (213, 77), (213, 135), (213,
84), (213, 120), (213, 164), (213, 127), (2509, 2226), (2509, 135),
(2509, 120), (2509, 158), (2509, 356), (2509, 77), (2509, 84), (135,
166), (135, 38), (135, 127), (135, 164), (135, 158), (135, 77), (135,
275), (295, 259), (295, 2032), (295, 324), (259, 103), (259, 2335),
(127, 2711), (127, 2006), (127, 275), (127, 356), (127, 164), (2711,
2050), (2711, 193), (2711, 2117), (2711, 2649), (150, 218), (150, 77),
(150, 258), (150, 2390), (150, 103), (150, 259), (150, 154), (218,
113), (218, 58), (84, 356), (84, 98), (84, 127), (2628, 38), (2628,
2567), (2628, 201), (2628, 2305), (2628, 197), (2628, 2306), (2628,
277), (2628, 2641), (2628, 251), (2628, 239), (2628, 66), (38, 25),
(152, 151), (152, 2641), (152, 41), (152, 52), (152, 259), (152, 154),
(152, 153), (151, 295), (151, 58), (151, 235), (151, 2116), (151,
252), (151, 218), (153, 2026), (153, 2247), (153, 259), (153, 2390),
(153, 150), (153, 221), (153, 258), (153, 154), (2026, 245), (2026,
2653), (2026, 2247), (2026, 295), (245, 2534), (245, 2390), (245, 8),
(245, 113), (245, 99), (120, 2084), (120, 2429), (120, 2567), (120,
127), (120, 84), (120, 77), (120, 164), (2084, 2199), (2084, 193),
(2084, 189), (2084, 113), (2084, 2649), (2084, 2006), (164, 103),
(164, 218), (164, 84), (103, 97), (103, 152), (130, 36), (130, 62),
(130, 41), (130, 120), (130, 2294), (130, 84), (130, 213), (130, 127),
(130, 164), (130, 158), (130, 356), (130, 194), (130, 2509), (36,
2440), (36, 62), (36, 167), (26, 189), (26, 6), (26, 38), (26, 264),
(26, 254), (26, 24), (26, 9), (26, 25), (189, 276), (189, 2006), (189,
193), (189, 2117), (189, 2711), (189, 2649), (248, 2636), (248, 242),
(248, 235), (248, 2426), (248, 58), (248, 218), (248, 151), (2636,
349), (2636, 2393), (2636, 98), (2636, 2229), (2636, 249), (2636, 5),
(2636, 2348), (2636, 242), (2636, 2638), (61, 2483), (61, 2579), (61,
2309), (61, 142), (61, 2), (61, 238), (61, 57), (61, 2633), (61, 344),
(61, 96), (61, 59), (61, 99), (2483, 252), (2483, 265), (2483, 24),
(2483, 12), (2483, 26), (2483, 25), (2483, 38), (2483, 254), (201,
2638), (201, 2309), (201, 158), (201, 2305), (201, 66), (201, 197),
(12, 21), (12, 38), (12, 26), (12, 9), (21, 2649), (21, 62), (21,
2440), (21, 2439), (21, 23), (21, 167), (202, 2459), (202, 55), (202,
218), (202, 58), (202, 248), (8, 2132), (8, 2579), (8, 252), (8, 2),
(8, 145), (2132, 193), (2132, 84), (2132, 202), (2132, 58), (2132,
2567), (2132, 2426), (2132, 151), (2132, 218), (145, 2653), (145, 59),
(145, 202), (145, 96), (145, 238), (145, 2), (145, 245), (2653, 276),
(2653, 98), (2653, 2572), (2653, 326), (2653, 6), (2653, 309), (2653,
349), (2653, 2433), (2653, 2032), (2653, 324), (252, 58), (252, 239),
(252, 2751), (252, 328), (252, 68), (252, 24), (326, 2229), (326,
2026), (326, 2032), (256, 2393), (256, 2026), (256, 326), (256, 2032),
(256, 295), (256, 2247), (256, 324), (2393, 36), (2393, 2390), (2393,
2638), (2393, 2429), (2393, 2226), (2393, 2229), (195, 2226), (195,
2006), (195, 2711), (195, 2459), (195, 2084), (195, 193), (195, 2050),
(195, 189), (30, 242), (30, 24), (30, 278), (30, 204), (30, 9), (30,
265), (30, 12), (30, 25), (30, 38), (30, 26), (30, 87), (242, 309),
(242, 5), (242, 2348), (242, 2638), (2655, 113), (2655, 2306), (2655,
248), (2655, 151), (2655, 58), (2655, 235), (2655, 202), (2655, 2567),
(2655, 2132), (2655, 2116), (2335, 2572), (2335, 5), (2335, 2006),
(2335, 295), (2335, 113), (2335, 252), (2335, 8), (2572, 2655), (2572,
2032), (2572, 326), (2572, 309), (2572, 2433), (324, 349), (324,
2084), (324, 2247), (324, 290), (324, 2433), (324, 276), (324, 2026),
(324, 2572), (349, 2433), (349, 41), (349, 113), (349, 2426), (96,
193), (96, 57), (96, 2459), (96, 344), (96, 142), (96, 97), (193, 77),
(193, 2309), (193, 2006), (193, 2459), (193, 2050), (57, 254), (57,
58), (57, 142), (57, 245), (57, 2579), (254, 21), (254, 9), (254,
204), (254, 30), (254, 265), (254, 12), (254, 24), (254, 38), (344,
235), (344, 12), (344, 189), (344, 245), (344, 8), (344, 2), (344,
145), (235, 2426), (235, 2032), (235, 249), (235, 218), (235, 202),
(2579, 2247), (2579, 2429), (2579, 96), (2579, 245), (2579, 238),
(2579, 2633), (2579, 228), (2247, 349), (2247, 290), (2247, 295),
(2247, 2572), (333, 328), (333, 251), (333, 2433), (333, 238), (333,
8), (333, 245), (333, 344), (333, 145), (333, 2), (2567, 249), (2567,
2426), (2567, 202), (2567, 248), (2567, 58), (2567, 235), (194, 87),
(194, 2032), (194, 2649), (194, 275), (194, 164), (194, 127), (194,
2294), (194, 213), (194, 77), (194, 84), (194, 120), (87, 25), (87,
153), (87, 252), (87, 2439), (87, 183), (87, 228), (87, 2426), (87,
103), (251, 2433), (251, 2636), (251, 277), (251, 201), (251, 66),
(251, 2306), (251, 2305), (251, 239), (2433, 309), (2433, 326), (2433,
2247), (183, 97), (183, 41), (183, 2509), (183, 258), (183, 152),
(183, 103), (97, 2116), (97, 58), (97, 258), (97, 221), (97, 154),
(97, 256), (97, 152), (204, 68), (204, 278), (204, 24), (204, 265),
(204, 38), (204, 25), (204, 9), (204, 2483), (68, 167), (68, 21), (68,
278), (68, 2005), (68, 36), (68, 2440), (68, 2751), (68, 328), (264,
2309), (264, 127), (264, 24), (264, 12), (264, 25), (264, 204), (264,
2483), (264, 38), (264, 265), (2309, 195), (2309, 2006), (2309, 189),
(2309, 2084), (98, 62), (98, 2229), (98, 2393), (98, 5), (98, 2429),
(98, 242), (98, 2226), (52, 99), (52, 97), (52, 103), (52, 59), (52,
2390), (52, 183), (52, 309), (52, 57), (99, 344), (99, 167), (99, 2),
(99, 57), (99, 145), (99, 333), (99, 8), (99, 5), (228, 59), (228,
2348), (228, 154), (228, 152), (228, 103), (228, 52), (228, 183),
(228, 97), (228, 2390), (228, 153), (59, 221), (59, 150), (59, 259),
(59, 153), (2116, 2226), (2116, 59), (2116, 2567), (2116, 218), (2116,
2132), (2116, 235), (2116, 2655), (2116, 58), (167, 2638), (2306,
142), (2306, 201), (2306, 2641), (2306, 66), (2306, 197), (2306, 239),
(2306, 277), (2306, 2305), (2306, 2628), (154, 238), (154, 2335),
(154, 52), (154, 349), (154, 103), (154, 183), (2032, 2433), (2032,
113), (2390, 2572), (2390, 259), (2390, 258), (2390, 59), (6, 2117),
(6, 2348), (6, 309), (6, 2433), (6, 2032), (6, 290), (6, 326), (6,
2572), (6, 295), (276, 87), (276, 256), (276, 295), (276, 2026), (276,
290), (276, 2247), (2005, 38), (2005, 2440), (2005, 2426), (2005,
2439), (2005, 349), (2005, 167), (2005, 36), (2005, 21), (2426, 151),
(2426, 202), (2426, 218), (2426, 2116), (265, 275), (265, 36), (265,
25), (265, 24), (265, 9), (265, 12), (275, 166), (275, 77), (275,
2509), (275, 120), (275, 158), (25, 2439), (25, 12), (25, 24), (2439,
249), (2439, 328), (2439, 167), (2439, 2440), (2641, 248), (2641,
251), (2641, 277), (2641, 2305), (2641, 66), (2641, 201), (66, 2294),
(66, 195), (66, 277), (2294, 2440), (2294, 164), (2294, 77), (2294,
2509), (2294, 275), (2294, 135), (2006, 2084), (2006, 2459), (258,
295), (258, 59), (2305, 277), (2305, 248), (2305, 150), (2305, 66),
(2305, 197), (5, 290), (5, 2393), (5, 2429), (5, 249), (5, 2348),
(2649, 113), (2649, 2117), (2649, 2459), (2649, 2309), (2649, 2199),
(2649, 2050), (2649, 195), (2229, 166), (2229, 2429), (2229, 2348),
(309, 2199), (309, 276), (309, 2032), (309, 290), (309, 326), (2199,
9), (2199, 113), (2199, 2711), (2199, 2050), (2199, 2006), (2199,
2309), (2199, 2117), (2459, 2199), (2459, 2711), (24, 87), (24, 9),
(2, 23), (2, 142), (2, 245), (2, 98), (23, 2711), (23, 2751), (23,
2439), (23, 2440), (23, 36), (23, 62), (9, 264), (9, 38), (290, 158),
(290, 2050), (290, 256), (290, 295), (290, 2026), (239, 326), (239,
66), (239, 2305), (239, 2641), (239, 201), (278, 23), (278, 167),
(278, 21), (278, 62), (278, 2439), (278, 2440), (278, 2751), (278, 68),
]
The graph size is challenging for finding the largest cycle.
A first observation was that a few vertices only have incoming edges, or only outgoing edges, and so they could never be part of a cycle. So I decided to eliminate these from the graph in a first phase in the algorithm: this can have a cascading effect so that other nodes also become isolated in that way.
It turned out 9 vertices and 79 edges could be removed in that first phase.
Then I made several attempts to find (long) cycles
This looked dim: running for an hour or so did not yield conclusive results.
After playing more with some heuristics, the DFS approach eventually gave me a cycle for all nodes (those not removed in the first phase), i.e. a Hamiltonian cycle on the cleaned graph. It didn't feel right to go for the heuristic that by trial and error made it work, so then I thought of applying randomness in the DFS approach, and to automatically abort and retry when some time slice expired. A bit based on Monte Carlo sampling.
This gave satisfying results: although the time needed can vary between one second or several minutes, it would really be bad luck if it took more than 5 minutes to find a Hamiltonian cycle in this graph.
So here is the code that I eventually ended up with. Granted, it doesn't find the largest cycle when there would not have been a Hamiltonian cycle, as the below algorithm cannot exclude that a still larger cycle than found would exist.
Implementation
Here is the Python code:
Because of the random nature of this algorithm, the output is different in each run. Here is one output:
Here the result was found after two iterations of performing a DFS search from scratch. How many are needed will vary.
You can run it on repl.it