the problem is underestimated because you did not specify, for example. if the graph must remain connected, or if you want to remove the "small" number of non-FIXED edges to break all the loops, or you really need the minimum minimum number of FIXED edges to be excluded globally.
If the graph should not remain connected, simply cross all the edges and remove all the non-fixed ones. This removes all loops that you can remove without removing the FIXED edges.
If you want a simple greedy algorithm to remove edges that are pure DFS, you can use something like this IF the graph remains connected when you delete some of the non-FIXED edges:
proc recurse(vertex n, vertex_set ns) if (n appers_in ns) // it is a cycle return BREAK_CYCLE else for (e in list_outgoing_edges_from(n)) np = e.destination result = recurse(np, add_to_set(ns, np)) if (result == BREAK_CYCLE) if (e.FIXED) return BREAK_CYCLE else [remove e from the graph] return RETRY else if (result == RETRY) return recurse(n, ns) return FINISHED if (recurse (your_initial_node, empty_vertex_set())) [graph contains a cycle through only FIXED edges] else [the reachable component from initial_node has no longer cycles]
source share