Schedule Optimization

Mathematical Schedule Optimization Without a PhD

User Solutions TeamUser Solutions Team
|
16 min read

Production schedule optimization software takes a working finite capacity schedule and searches for a measurably better one: fewer late jobs, less changeover time, or a shorter overall plan, all without violating a single capacity constraint. In EDGEBIC by User Solutions, optimization is a two-layer feature. A multi-run search evaluates dozens of complete schedules and is guaranteed never worse than your current plan. A mathematical solver layer, built on Google OR-Tools CP-SAT, goes further and reports a proven optimality gap: a mathematical statement of how close the proposal is to the best schedule possible. Either way, nothing changes until you review a side-by-side comparison and press Accept.

This guide explains how both layers work in planner language, how to read the comparison screen, what the goal presets favor, why some jobs stay locked in place, and what the honest limits of each claim are. No operations research degree required.

User Solutions has built scheduling tools for manufacturers since 1991. Customers like GE, Cummins, BAE Systems, and the US Navy have used that lineage of software on problems from railcar refurbishment (on-time performance from 30% to 90% at GE Railcar) to 26,000+ maintenance tasks on the USS Nimitz. The optimizer is the newest layer on that foundation, and it lives inside EDGEBIC, the current-generation platform.

Why a Good Scheduler Still Leaves Money on the Table

EDGEBIC's scheduling engine plans one job at a time, most important first. That approach is fast, predictable, and respects every constraint: shifts, holidays, machine instances, setup times, routing dependencies. It is how most serious finite capacity scheduling engines work.

But planning one job at a time has a blind spot: the engine commits each job's entire routing before it looks at the next job. Consider the documented example from the EDGEBIC engine reference. Two work centers (a cut station and a mill), three jobs, all released Monday morning:

JobRoutingDue
ACut 6 h, then Mill 2 hTuesday 12:00
BCut 2 h, then Mill 6 hTuesday 12:00
CCut 3 h, then Mill 3 hTuesday 16:00

The engine's sort runs A first. A's long 6-hour cut holds the saw all Monday morning while the mill sits idle for 6 hours. B's 2-hour cut would have fed the mill by 10:00, but the engine had already committed A. Result: B finishes 2 hours late, C finishes late, and total tardiness is 3 hours.

Run the jobs as B, A, C instead and every job is on time. The mill never starves, and the overall plan shrinks from 17 working hours to 14, an 18% reduction in makespan. No static priority rule finds this in general; the problem of choosing the best interleaving across all jobs is the mathematically hard core of scheduling. That is the gap the optimizer exists to close.

The Two Layers, Honestly Described

EDGEBIC ships two optimizer engines. You pick one in Options, under Schedule, in the Optimizer Engine setting. Both use the same screen, the same buttons, and the same safety rules. Only the strength of the claim on the result changes.

Multi-run search (default)Mathematical solver (CP-SAT)
How it worksRuns the real scheduling engine many times with different global job orderings and keeps the best complete scheduleEncodes the scheduling problem for the Google OR-Tools CP-SAT solver, warm-started from your current plan, and solves the goal tiers in strict order
GuaranteeNever worse than your current plan (enforced by an explicit comparison after the search)Never worse, plus a proven lower bound on how good any schedule could be
Badge on the result"Best of N schedules tried in Xs""Proven within X% of optimal in Xs", or "Proven optimal in Xs" when the gap is 0%
Honest claimMulti-run optimization: evaluates dozens of complete schedules, guaranteed never worse than beforeMathematical optimization with a proven optimality gap

Two phrases you will never see EDGEBIC use: "always optimal" and "AI magic." The multi-run layer is a disciplined search, not a proof. The solver layer produces a real mathematical certificate, and when the gap is not zero it says so plainly. When you want the deeper story on what that certificate means, see what an optimality gap is in production scheduling.

How the multi-run search works

For small problems (four jobs or fewer), the search tries every possible job ordering. Four jobs means 24 complete schedules, each one produced by the same engine that runs your real plant, so every candidate respects every constraint by construction.

For larger problems, it runs a set of named dispatch heuristics, then seeded shuffles:

  • Earliest due date first
  • Priority, then due date
  • Shortest total work content first
  • Longest total work content first
  • Critical ratio (time remaining divided by work remaining)
  • Randomized orderings, generated from a fixed seed

Every candidate is scored with one shared KPI calculator, and the winner must beat your current plan in a single direct comparison. If nothing beats it, you are told your plan stood, and often how close the nearest challenger came. Because the candidate generation is seeded, the same inputs and the same seed always produce the same result, which matters when you need to reproduce a run for a colleague or a support case.

How the mathematical solver works

The CP-SAT layer models your scheduling problem the way a mathematician would: one interval variable per operation, no-overlap rules per machine, precedence links between routing steps, queue-time gaps, and due dates as heavily weighted penalties rather than hard walls. Time is measured in ticks of 0.01 hours (36 seconds) on a compressed working-hour axis: nights, weekends, and whole-day holidays are squeezed out before the solver ever sees the problem.

Two things make this layer trustworthy rather than clever:

  1. It starts from your plan. The current schedule is fed to the solver as a hint, and after solving, EDGEBIC still runs the explicit never-worse comparison. The hint alone is advisory; the comparison is the law.
  2. It proves its distance from perfect. The solver computes both its best schedule and a mathematical lower bound. The gap between them is the optimality gap. Gap 0% means proven optimal: no schedule can beat this one on your chosen goal. The engine is validated nightly against the public job-shop benchmark ft06, whose known optimal makespan of 55 it proves.

Locked jobs: correctness before cleverness

The v1 mathematical model natively optimizes plain single-machine, sequential jobs. A job whose routing uses something richer gets locked: reproduced exactly as the scheduling engine planned it, consuming its capacity in the model, while other jobs are optimized around it. The lock reasons are specific and visible:

  • A multi-instance work center
  • A one-per-day work center rule
  • Transit days between steps
  • Lot streaming (either overlap model, including transfer batches)
  • Parallel processing (dependent or independent)
  • Alternate work centers
  • A sequence-dependent setup matrix that is not eligible for native modeling

This is a safety feature, not a failure. The optimizer never guesses about a feature it does not fully model. The Explain dialog lists each locked job with its reason, for example "multi-instance WC 'CNC-Mill-1'" or "FlowStep lot streaming." When every job is locked, EDGEBIC says exactly that: "Nothing to optimize," verifies the plan, changes nothing, and claims no optimality. Meanwhile the multi-run engine reorders whole jobs regardless of routing features, so it remains useful on any dataset.

One notable exception: when your site has populated a sequence-dependent setup matrix and the referenced machines qualify, the solver models changeovers natively as part of the sequence. That is where the Least setup time goal becomes genuinely powerful; the solver can find orderings that cut changeover hours the one-job-at-a-time engine cannot see. The paint shop changeover sequencing example walks through exactly that scenario.

Choosing a Goal: Four Presets, One Guarantee

Optimization needs a definition of "better." EDGEBIC offers four planner-facing goal presets, each an ordered list of measures compared strictly in sequence (protect the first measure, then improve the second, and so on):

GoalFavorsWhen to choose it
On-time first (default)Due dates above everything: weighted lateness, then late-job count, then stability, then makespanMost days. It protects delivery promises even if the plant as a whole finishes a little later
Fastest overall finishThe shortest total planClearing a backlog, or freeing capacity sooner matters more than any single due date
Least setup timeFewest changeover hoursShops with sequence-dependent setups. Hidden until setup-matrix data exists
Fewest changesMinimum disruption to the committed planMid-week, once the floor is committed and only clearly worthwhile moves should happen

Every goal carries the same guarantee: it can never make your plan worse than it is today. Trying a goal costs nothing; you can run, look, and discard as often as you like.

The Fewest changes goal deserves a note, because it addresses a real adoption problem in scheduling: schedule nervousness. A proposal that improves lateness by twenty minutes but moves forty operations is a bad trade for a committed shop floor. EDGEBIC measures instability explicitly (total hours of start-time movement versus the committed plan, and the count of moved operations) and can rank it above everything except due dates. Stability is measured against the plan the floor actually knows, the committed one in the database, never against a hypothetical.

Reading the Comparison Screen

A run takes the time budget you give it: 10, 30, or 60 seconds, default 30. Nothing locks while it thinks. When it finishes, five elements tell the whole story:

The verdict. One honest sentence. When the optimizer found something: "This plan makes 1 more job(s) on time, reduces lateness by 4.7 hours. Nothing already started was touched." When it did not: "We tried 24 alternative schedules; your current plan is still the best."

The badge. The certificate of how hard the answer is. "Best of 6 schedules tried in 2.1s" from the multi-run engine; "Proven optimal in 2.1s" or "Proven within X% of optimal" from the solver.

The KPI table. Measure, Current, Proposed, Change: one row per metric (late jobs, weighted lateness, makespan, setup hours when setup data exists, plan changes when a committed plan exists). The Change cell always spells out direction in words: "2 better," "0.5 worse," "no change." A goal may accept a small loss on a minor metric to win a large gain on the one you asked for, and the table makes that trade visible instead of hiding it.

The move list. Only the operations that actually move, one row each, with old start, new start, and a short reason such as "starts 4.0h earlier." Unmoved operations are never listed, so the review is a 30-second read, not an audit.

The safety strip. Three fixed guarantees printed on every result: nothing saved yet, completed work untouched, never worse than the current plan.

A worked run, end to end

From the EDGEBIC user guide's documented example: Monday, July 20. One saw, one mill, day shift 08:00 to 16:00. Three jobs:

JobRouting (hours include setup)Due
JOB-0121Saw 6 h, then Mill 2 hFriday
JOB-0122Saw 2 h, then Mill 8 hWednesday
JOB-0123Saw 3 h, then Mill 6 hWednesday

The current plan ran the jobs in priority order, so job 0121's 6-hour cut held the saw all Monday morning while the mill idled until 14:00. The mill then backed up, and JOB-0123 landed one day late.

You pick On-time first, 30 seconds, and Run. With three jobs the search tries every ordering and finds the one where the short cuts go first: 0122, then 0123, then 0121. The mill is fed by 10:00 Monday.

MeasureCurrentProposedChange
Late jobs101 better
Weighted lateness (h)4.70.04.7 better
Makespan (h)22.018.04 better

The move list shows six rows. The most interesting one: JOB-0121's mill work moves from Monday 14:00 to Wednesday 08:00. It gives way, and it is still on time for Friday. That deliberate yielding, one job stepping back so two others hit their dates, is the trade no one-job-at-a-time pass can make. Press Accept and all three jobs show zero days late.

Accept, Discard, and the Audit Trail

The optimizer writes nothing on its own. The only path to the database is the Accept button, and it comes with three protections:

  1. Staleness detection. Before solving, EDGEBIC fingerprints the current schedule. If a colleague reschedules or shop-floor actuals land while you are reading the proposal, Accept refuses rather than overwriting, with a banner ("Changes arrived while you reviewed; re-run to include them") and a one-click re-run on fresh data. Never a data-loss situation.
  2. The standard persist pipeline. Accept saves through the same machinery as a normal scheduling run, with the same protections for recorded work. Completed and in-progress operations pass through untouched, the same rule every reschedule follows.
  3. A permanent audit record. Accept writes one audit entry carrying the full plain-language explanation, the goal, the seed, the solve statistics, and the before/after numbers. Months later, the job's audit trail answers "who changed this schedule and why" with the exact story the Explain dialog showed at accept time.

Discard drops the proposal and leaves the database byte-for-byte identical. Closing the application discards any pending proposal too, which is always safe, because nothing was saved.

The Explain Dialog: The Same Story for Everyone

Click Explain on any result and you get a plain-language record in five sections: the goal you asked for, how the search ran (how many alternatives, how long, which ordering won), the outcome per measure, the most significant moves as sentences, and what was protected. With the solver engine it also lists every locked job and its reason.

The practical value: Copy puts the whole story on the clipboard. Supervisors, sales, and the plant manager all quote one narrative, and that same text is what lands in the audit log on Accept. There is no gap between what you were shown and what history records.

Practical Guidance

Run the optimizer after every meaningful scheduling run. It costs seconds and is guaranteed non-destructive. The one-job-at-a-time engine leaves reorderings like the worked example on the table routinely.

Default to On-time first; switch goals deliberately. Goals are trade-offs. Pick per this week's priority, not per habit.

Use Fewest changes mid-week. A committed floor values stability over the last few percent of improvement.

Prefer the mathematical solver for the considered planning run. Same safety, plus a proof. "Proven within 2% of optimal" ends the "couldn't we do better?" debate with mathematics instead of opinion.

Read the move list before accepting. You are the planner; the optimizer is your analyst. The changes-only format keeps the review short by design.

Do not fight locked jobs. A lock means "reproduced exactly, correctness first." If a locked job is the one you most want optimized, the multi-run engine reorders whole jobs regardless of features.

Populate the setup matrix if changeovers hurt. The Least setup time goal appears automatically once sequence-dependent setup data exists, and with the solver it optimizes changeovers as part of the sequence itself.

If a run surprises you (an empty result, a "nothing to optimize" badge, a proposal that moves less than expected), the EDGEBIC troubleshooting guide covers the common causes, and most of them are one-line fixes like a missing routing or an unscheduled order.

Where This Fits in the Bigger Picture

Optimization is the last step of a pipeline, not a substitute for it. The gains above assume your master data is real: routings that match the floor, shift calendars that match the clock, and actuals logged daily so the plan starts from reality. The complete EDGEBIC guide maps the whole platform, and the scheduling engine guide explains the finite capacity engine the optimizer improves. If you are coming from RMDB, the optimizer is one of the clearest generational additions; see the RMDB to EDGEBIC path for what carries forward.

For a first-principles grounding in the discipline itself, start with what production scheduling is and identifying your production bottleneck: the optimizer is at its most valuable exactly where a bottleneck resource makes job ordering matter.

Want to see the comparison screen on your own jobs? Contact US for a demo and bring a week of real orders. The never-worse guarantee means the worst possible outcome is confirmation that your current plan is already the best, and that is worth knowing too.

No. Every optimizer proposal is compared directly against your current plan under the goal you chose, and if the proposal is not strictly better, EDGEBIC returns your current plan as the answer. This never-worse rule is enforced in the product with an explicit post-solve comparison, not just promised. The safety strip on the comparison screen states it every time you run.

The multi-run search runs the real scheduling engine many times with different job orderings and keeps the best complete schedule, badged as best of N schedules tried. The CP-SAT mathematical solver (Google OR-Tools) additionally computes a lower bound, so it can report a proven optimality gap: proven within X% of optimal, or proven optimal when the gap is zero. Both are never worse than your current plan.

No. An optimizer run computes entirely in memory and holds its proposal on your screen. The database, the Gantt, and every other user's view stay untouched until you press Accept. Discard drops the proposal and leaves the database byte-for-byte identical. Accept saves through the same pipeline as a normal scheduling run and writes a full audit record.

A locked job uses a routing feature the mathematical solver does not yet rearrange natively, such as parallel processing, lot streaming, transit days, or a multi-instance work center. Rather than guess, EDGEBIC reproduces that job exactly as the scheduling engine planned it and optimizes the other jobs around it. The Explain dialog lists the specific reason for every locked job.

Yes, in many cases. Priorities decide the queue order, but no fixed queue order fixes every interleaving problem, because a long first operation can starve a downstream machine while a short job waits. The optimizer evaluates complete alternative schedules across all jobs at once, which is exactly the reordering a one-job-at-a-time dispatch pass cannot see.

Expert Q&A: Deep Dive

Q: We ran the optimizer and it said our current plan is already the best. Did we waste the run?

A: No, that is a genuinely useful answer. The verdict tells you your plan survived a serious challenge: for example, we tried 24 alternative schedules and your current plan is still the best, often with the nearest challenger's margin quoted in hours of weighted lateness. That is evidence you can give a plant manager who asks whether the schedule could be better. If you want a harder search, raise the time budget from 30 to 60 seconds or switch the engine to the mathematical solver, which can end the debate with a proven gap.

Q: Three jobs share a saw and a mill, and one is always a day late no matter how I prioritize. Can the optimizer fix that?

A: This is the textbook case. In the documented worked example, three jobs routed saw-then-mill left the mill idle all Monday morning because a 6-hour cut ran first; one job finished a day late. The optimizer tried all six orderings in 2.1 seconds, found the sequence where the 2-hour cut feeds the mill by 10:00, and the comparison showed late jobs 1 to 0, weighted lateness 4.7 hours to 0, and makespan 22 to 18 hours. No fixed priority rule finds that plan, because the winning order deliberately makes one job give way while still meeting its own due date.

Frequently Asked Questions

Ready to Transform Your Production Scheduling?

User Solutions has been helping manufacturers optimize their production schedules for over 35 years. One-time license, 5-day implementation.

User Solutions Team

User Solutions Team

Manufacturing Software Experts

User Solutions has been developing production planning and scheduling software for manufacturers since 1991. Our team combines 35+ years of manufacturing software expertise with deep industry knowledge to help factories optimize their operations.

Let's Solve Your Challenges Together