- Thu 16 July 2026
- Progress Report
Topology optimization is the problem of finding the shape that handles a given set of forces (sometimes called "load cases"), without any part of the shape exceeding its maximum load rating, using the minimum amount of material. You could be starting with a rough design that somebody made by hand in CAD, or you could be starting with an automatically generated mesh or voxel grid1.
Calculating the loads at each point in the design being optimized is done basically in the same way it's done in undergrad statics; the load at an element is the sum of the loads flowing into it. Finding such a design that handles all the required loads while minimizing the amount of material (and therefore cost and weight) is typically done using gradient optimization2.
Can we do better than running a big optimization algorithm that may or may not ever find a solution? One way is by re-framing the problem as a max flow problem.
The mapping goes like:
- the envelope is voxelized and turned into a nearest neighbor graph of the voxel centers
- loads are flows
- load capacities are flow capacities
- point loads (forces coming in from the outside) are edges connecting those points in the voxel graph to a single supersource vertex, and the forces of those loads are the capacities of those connections. This means that if the full nearest neighbor graph has enough capacity to handle the loads, then the connections to the supersource is the minimum cut, and by the max-flow min-cut theorem the capacity of the network equals the total load.
- attachment points (to a chassis to a vehicle, to foundation piles in a building, etc) are edges connecting those vertices to a single supersink vertex
- load at each member is the flow at that edge that come from calculating the max flow from the supersource to the supersink
- if the max flow is at least the sum of the point loads then you have a solution
- edges that have zero flow in the max flow solution can be deleted
There's an implementation of this here. It works okay, but a real implementation of this would have capacities/flows being vector valued which would require reimplementing the max flow solver. It shouldn't be that hard to extend Dinic to use vector-valued edges.
Here are some screenshots:



-
This is sometimes called "generative design", not to be confused with "generative AI". No neural nets are typically used here, and when they are they're just one part of a larger optimization loop. ↩
-
See this survey paper ↩