Many problems in computer science amount to finding the best sequence of objects consistent with some precedence constraints.
An intuitive example comes from routing problems, where we would like to find the shortest route between cities but we have requirements (i.e. for example to pick up and subsequently deliver a package) on the order in which the cities should be visited [1]}. Another case is found in compiler pipelines, wherein the "cities" become operations to be executed and the constraints come from the data dependencies between these operations, such as when the result of an operation is an operand in a subsequent one. In this case, the metric to be optimized can be the run time of the compiled program, or the memory required to execute the program [2]}.
Common across this class of problems is their formulation in term of finding the optimal topological order of the Directed Acyclic Graph (DAG) that encodes the precedence constraints, which induces a Combinatorial Optimization [3]} (CO) problem which is in general computationally hard [4]}.
