Looking for an algorithm - calculate ingredients for a set of recipes
Paul Moore
p.f.moore at gmail.com
Mon Sep 25 11:07:46 EDT 2017
On 25 September 2017 at 15:20, Paul Moore <p.f.moore at gmail.com> wrote:
> On 25 September 2017 at 14:23, Ian Kelly <ian.g.kelly at gmail.com> wrote:
>> You have a DAG, so you can sort it topologically. Then you can process
>> it in that order so that everything that uses X will be processed
>> before X so that when you get to X you'll know exactly how much of it
>> you need and you don't have to worry about "feedback". For actual
>> production, run through it in the opposite order so that you'll
>> produce all your precursors before the things that require them.
>
> Hmm, yes that makes sense. I was thinking of a topological sort in the
> other direction (ingredient before product) and that way round doesn't
> work. For some reason, when thinking about topological sorts, I tend
> to get fixated on one direction and forget they are actually
> reversible...
Thank you. With that hint, the problem turned out to be remarkably
simple. If anyone is interested, here's the basic approach:
import networkx as nx
G = nx.DiGraph()
G.add_edge("Tank", "Bars", qty=4)
G.add_edge("Tank", "Iron", qty=4)
G.add_edge("Tank", "Glass", qty=1)
G.add_edge("Bars", "Iron", qty=6, batch=16)
G.add_edge("Chassis", "Bars", qty=4)
G.add_edge("Chassis", "Iron", qty=4)
G.add_edge("Chassis", "Capacitor", qty=1)
G.add_edge("Alloy Smelter", "Chassis", qty=1)
G.add_edge("Alloy Smelter", "Cauldron", qty=1)
G.add_edge("Alloy Smelter", "Furnace", qty=3)
G.add_edge("Alloy Smelter", "Iron", qty=4)
G.add_edge("Cauldron", "Iron", qty=7)
from collections import defaultdict
need = defaultdict(int)
need["Alloy Smelter"] = 1
need["Tank"] = 2
import math
for item in nx.topological_sort(G):
for ingredient in G[item]:
edge = G[item][ingredient]
if "batch" in edge:
# Round up
batches = math.ceil(need[item] / edge["batch"])
else:
batches = need[item]
need[ingredient] += batches * G[item][ingredient]["qty"]
print(need)
Paul
More information about the Python-list
mailing list