An AI scientist built a better factory scheduler

Built with Sagent and Trackinizer, the program beat an expert-designed scheduling solver on 29 of 30 fresh synthetic problems.

22 5 4 D4 P4 D5 P5
Delivery extension. Saved delivery sequence: two requests share a truck, using 8 of its 22 load units. Blue is request 5; orange is request 4.

We wanted an AI scientist to produce a program we could keep using after the research session ended. We chose factory scheduling: deciding when jobs should run on shared machines so that high-priority jobs finish on time. Using Sagent and Trackinizer, the AI scientist developed a C++ solver. We froze its code and tested it on thirty new synthetic problems against EGRASP, an expert-designed solver that achieved ten best-known results on standard scheduling benchmarks.

The final test, instance by instance

Candidate advantage over EGRASP on 30 fresh scheduling instances Positive bars mean the candidate had lower mean weighted tardiness. In the original instance order, 29 bars are positive and instance 7 is negative, at minus 1.65320046 percent. The mean normalized advantage is 9.66243265 percent. Each program ran three times per instance. The dashed line marks the mean; the solid line marks zero. Normalized advantage (%) · positive favors candidate Mean +9.66% 25% 20% 15% 10% 5% 0% −5% 1. final-tf3_2-uniform-0: +6.25417620% 1 2. final-tf3_2-uniform-1: +13.20564313% 2 3. final-tf3_2-uniform-2: +11.44238686% 3 4. final-tf3_2-uniform-3: +11.23189437% 4 5. final-tf3_2-uniform-4: +10.81912670% 5 6. final-tf3_2-priority-0: +5.55155168% 6 7. final-tf3_2-priority-1: -1.65320046% 7 8. final-tf3_2-priority-2: +9.67551622% 8 9. final-tf3_2-priority-3: +9.04168923% 9 10. final-tf3_2-priority-4: +7.12574440% 10 11. final-tf7_4-uniform-0: +5.86489497% 11 12. final-tf7_4-uniform-1: +18.56162695% 12 13. final-tf7_4-uniform-2: +10.03110138% 13 14. final-tf7_4-uniform-3: +21.18575616% 14 15. final-tf7_4-uniform-4: +10.98368661% 15 16. final-tf7_4-priority-0: +1.94355955% 16 17. final-tf7_4-priority-1: +4.00958069% 17 18. final-tf7_4-priority-2: +5.29328925% 18 19. final-tf7_4-priority-3: +10.82474227% 19 20. final-tf7_4-priority-4: +5.39798236% 20 21. final-tf2-uniform-0: +8.99907607% 21 22. final-tf2-uniform-1: +17.75675163% 22 23. final-tf2-uniform-2: +11.83518834% 23 24. final-tf2-uniform-3: +14.99903605% 24 25. final-tf2-uniform-4: +8.04819277% 25 26. final-tf2-priority-0: +9.75966293% 26 27. final-tf2-priority-1: +9.58685913% 27 28. final-tf2-priority-2: +9.20751260% 28 29. final-tf2-priority-3: +10.06663065% 29 30. final-tf2-priority-4: +12.82332082% 30 3/2 · uniform 3/2 · priority 7/4 · uniform 7/4 · priority 2 · uniform 2 · priority Instance, in source order · groups: deadline tightness and weights
The solver produced lower lateness penalties on 29 of 30 fresh problems, with a 9.66% mean normalized advantage across problems. Think of a factory paying a fee for each hour an order is late: cutting a $10,000 lateness bill to $9,034 would score +9.66%, a $966 saving on that problem. The dollars are illustrative; the benchmark uses synthetic priorities and time units.
Deadline multipliers 3/2, 7/4 and 2 allow 1.5×, 1.75× or 2× a job’s total processing time after release (rounded up); smaller means tighter deadlines. “Uniform” draws weights uniformly from 1–10; “priority” gives six jobs weight 10 and the other twenty-four weight 1.
How the comparison is calculated

Each job contributes its priority multiplied by its time late; on-time jobs contribute zero. Each bar compares the programs' mean penalties over three runs on one fresh problem. We divide the difference by the larger penalty (or 1, if both are smaller):

Normalized advantage = (EGRASP mean − candidate mean) / max(EGRASP mean, candidate mean, 1).

Averaging these 30 percentages gives 9.66%. This was a registered secondary statistic. It gives each problem equal weight and does not measure a reduction in the combined penalty across all problems, factory completion time or real-world costs.

The registered primary test scored each of the nine cross-program run pairings within a problem +1 for a win, −1 for a loss and 0 for a tie. The candidate won 260 of 270 pairings, yielding a mean score of +0.926 (95% interval: +0.793 to +1.000). These pairings reuse the 180 executions; the interval resamples whole problems. Frozen analysis and instance results.

The finished program takes a factory problem as input and searches for a schedule. It needs no language model at runtime. The AI scientist’s work was to investigate methods, write the solver and improve it through experiments; our work was to define the task, build the evaluation process and check what the results meant.

What the factory needs

The starting task, from FrontierOR, has thirty jobs moving through ten machines. Each job follows a prescribed sequence, and each machine can do only one operation at a time. Each late job contributes its priority weight multiplied by how late it finishes; on-time jobs contribute zero. The sum is total weighted tardiness, the score we want to minimize.

The synthetic inputs use time units without specifying minutes or hours. Weights are dimensionless priorities, so the score is in weighted time units. A job with priority 3 finishing 4 time units late contributes 12. Lower is better; zero means every job finished on time.

The AI scientist developed a solver that changes the order of operations on each machine. Moving one operation forward can bring other work forward, delay it, or create an impossible cycle of dependencies. The program searches legal moves using established critical-path and tabu-search ideas: concentrate on consequential operations, discourage immediate reversals, and restart from promising schedules when progress stalls.

Same work, different machine order

Two legal schedules with weighted tardiness 16 and 4 Constructed illustration. A uses machine 1 for three units, then machine 2 for two; B uses machine 2 for two, then machine 1 for two; C uses machine 1 for two, then machine 2 for one. Before: machine 1 runs B2 at 2–4, C1 at 4–6, A1 at 6–9; machine 2 runs B1 at 0–2, A2 at 9–11, C2 at 11–12. After: machine 1 runs A1 at 0–3, B2 at 3–5, C1 at 5–7; machine 2 runs B1 at 0–2, A2 at 3–5, C2 at 7–8. The animation loops between these endpoints, holding each schedule for inspection. Pause animation to hold the current frame. With animation disabled, use Show improved schedule to switch between the two schedules. Before · weighted tardiness 16 After · weighted tardiness 4 Machine 1 Machine 2 A1 B2 C1 A2 B1 C2 0 2 4 6 8 10 12 Simulated factory time
Constructed illustration, not a measured benchmark. Letters identify jobs; numbers identify their operation order. Due dates: A 7, B 5, C 6. Weights: A 1, B 5, C 2. Before, A finishes 4 units late and C 6 units late: 4 × 1 + 6 × 2 = 16 weighted time units. After, only C is late, by 2 units: 2 × 2 = 4. All six operation durations stay fixed; the moving frames illustrate the change between schedules, not execution on a machine.

These are known scheduling techniques. The result was a working implementation adapted to this task, with experiments to establish where it helped.

How the AI scientist changed the program

We supplied the formulation, public inputs and evaluation requirements. The AI scientist investigated approaches and wrote solver variants.

For this study we built a custom loop using Sagent, a universal LLM harness for customizing agent workflows across hosted providers and local models. Its pure-Python API lets you compose loops or graphs with your own tools and evaluation steps.

Within the loop, the AI scientist could save a solver, evaluate it and record what to try next. Each saved version had a source hash; each evaluation retained its schedule and logs. FrontierOR’s checker and a separate validator checked feasibility and recalculated the penalty. Trackinizer linked the versions, experiments and conclusions so the next decision could refer to the evidence behind it. We extended the Sagent loop with one rule for this study: record a conclusion before starting the next experiment.

Watch the research workflow in Trackinizer
The research record in Trackinizer. We recorded this 22-second view during development, before the final comparison. It replays record creation order using the links present when recorded. The pacing is a UI convention, not experiment runtime or a count of completed experiments. Recording provenance.

The first solver spent effort rebuilding machine dependencies for each proposed move and restarted from a narrow range of schedules. The recorded decision shows the AI scientist addressing both problems in V2: updating only affected links, reusing calculations, cutting off unpromising evaluations and restarting from a more varied set of schedules found during the search. With both versions given 300 seconds, V2 achieved a lower penalty on all five familiar large inputs.

That first result left a question: would the improvement survive a different random seed? V2 still trailed FrontierOR’s saved Gurobi solution on one input, so the recorded conclusion called for another comparison before spending more compute. The loop repeated the five tests with V2’s code unchanged and a new seed; V2 again beat V1 on all five. This gave a reason to extend the time budget and test a different scheduling method.

The next approach combined constraint programming with large-neighborhood search. It offered a different way to construct schedules, but its comparison with V2 exposed a tradeoff: on one development case, it finished the workload at simulated time 2,037 rather than 2,081, while incurring a higher lateness penalty, 31,063 rather than 28,661. V2’s schedule served the stated objective better even though the last job finished later. Comparing both measures made that distinction visible: the factory needed to limit priority-weighted lateness, which could require accepting a later overall finish.

See the saved schedules and the development comparison

Both programs ran on the public large_1 case with seed zero and a requested 1,200-second budget. The completion times 2,037 and 2,081 use simulated input time units; the 1,200-second limit is computation time.

Finishing sooner can still leave a higher penalty

V2 and CP-SAT with large-neighborhood search: saved machine schedules Each panel shows all 300 operations on ten machines, using the same time axis. V2 finishes at 2,081 with weighted tardiness 28,661. CP-SAT with large-neighborhood search finishes earlier, at 2,037, but has higher weighted tardiness, 31,063. Color shows whether the whole job finishes by its due date. Each operation has its saved job, machine and time in its title. Job on time Job late V2 Penalty 28,661 · finishes 2,081 0 200 400 600 800 1,000 1,200 1,400 1,600 1,800 2,000 2,200 M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 Job 0, operation 0: M9, 0–93. Job due 664; finishes 634; weight 4. 0 Job 0, operation 1: M0, 112–135. Job due 664; finishes 634; weight 4. Job 0, operation 2: M4, 148–213. Job due 664; finishes 634; weight 4. 0 Job 0, operation 3: M1, 213–235. Job due 664; finishes 634; weight 4. Job 0, operation 4: M8, 298–379. Job due 664; finishes 634; weight 4. 0 Job 0, operation 5: M7, 381–387. Job due 664; finishes 634; weight 4. Job 0, operation 6: M2, 390–451. Job due 664; finishes 634; weight 4. 0 Job 0, operation 7: M3, 465–523. Job due 664; finishes 634; weight 4. 0 Job 0, operation 8: M6, 523–545. Job due 664; finishes 634; weight 4. Job 0, operation 9: M5, 554–634. Job due 664; finishes 634; weight 4. 0 Job 1, operation 0: M0, 0–39. Job due 716; finishes 751; weight 4. Job 1, operation 1: M4, 39–90. Job due 716; finishes 751; weight 4. 1 Job 1, operation 2: M3, 90–164. Job due 716; finishes 751; weight 4. 1 Job 1, operation 3: M5, 164–208. Job due 716; finishes 751; weight 4. Job 1, operation 4: M6, 208–231. Job due 716; finishes 751; weight 4. Job 1, operation 5: M8, 231–298. Job due 716; finishes 751; weight 4. 1 Job 1, operation 6: M2, 336–362. Job due 716; finishes 751; weight 4. Job 1, operation 7: M9, 362–447. Job due 716; finishes 751; weight 4. 1 Job 1, operation 8: M1, 495–542. Job due 716; finishes 751; weight 4. 1 Job 1, operation 9: M7, 656–751. Job due 716; finishes 751; weight 4. 1 Job 2, operation 0: M8, 40–113. Job due 687; finishes 659; weight 4. 2 Job 2, operation 1: M2, 147–215. Job due 687; finishes 659; weight 4. 2 Job 2, operation 2: M0, 222–283. Job due 687; finishes 659; weight 4. 2 Job 2, operation 3: M1, 283–317. Job due 687; finishes 659; weight 4. Job 2, operation 4: M3, 317–380. Job due 687; finishes 659; weight 4. 2 Job 2, operation 5: M5, 425–493. Job due 687; finishes 659; weight 4. 2 Job 2, operation 6: M7, 493–524. Job due 687; finishes 659; weight 4. Job 2, operation 7: M9, 524–556. Job due 687; finishes 659; weight 4. Job 2, operation 8: M6, 556–588. Job due 687; finishes 659; weight 4. Job 2, operation 9: M4, 592–659. Job due 687; finishes 659; weight 4. 2 Job 3, operation 0: M6, 16–105. Job due 739; finishes 894; weight 4. 3 Job 3, operation 1: M8, 113–159. Job due 739; finishes 894; weight 4. 3 Job 3, operation 2: M2, 215–275. Job due 739; finishes 894; weight 4. 3 Job 3, operation 3: M5, 331–378. Job due 739; finishes 894; weight 4. 3 Job 3, operation 4: M7, 387–416. Job due 739; finishes 894; weight 4. Job 3, operation 5: M4, 417–482. Job due 739; finishes 894; weight 4. 3 Job 3, operation 6: M3, 523–573. Job due 739; finishes 894; weight 4. 3 Job 3, operation 7: M9, 686–742. Job due 739; finishes 894; weight 4. 3 Job 3, operation 8: M1, 765–816. Job due 739; finishes 894; weight 4. 3 Job 3, operation 9: M0, 818–894. Job due 739; finishes 894; weight 4. 3 Job 4, operation 0: M7, 0–86. Job due 702; finishes 701; weight 4. 4 Job 4, operation 1: M0, 86–112. Job due 702; finishes 701; weight 4. Job 4, operation 2: M1, 114–131. Job due 702; finishes 701; weight 4. Job 4, operation 3: M4, 131–148. Job due 702; finishes 701; weight 4. Job 4, operation 4: M8, 159–220. Job due 702; finishes 701; weight 4. 4 Job 4, operation 5: M5, 270–305. Job due 702; finishes 701; weight 4. Job 4, operation 6: M3, 380–465. Job due 702; finishes 701; weight 4. 4 Job 4, operation 7: M2, 483–582. Job due 702; finishes 701; weight 4. 4 Job 4, operation 8: M9, 587–686. Job due 702; finishes 701; weight 4. 4 Job 4, operation 9: M6, 686–701. Job due 702; finishes 701; weight 4. Job 5, operation 0: M8, 23–40. Job due 687; finishes 682; weight 4. Job 5, operation 1: M0, 40–83. Job due 687; finishes 682; weight 4. Job 5, operation 2: M7, 86–176. Job due 687; finishes 682; weight 4. 5 Job 5, operation 3: M3, 187–274. Job due 687; finishes 682; weight 4. 5 Job 5, operation 4: M6, 290–375. Job due 687; finishes 682; weight 4. 5 Job 5, operation 5: M5, 378–420. Job due 687; finishes 682; weight 4. Job 5, operation 6: M9, 447–458. Job due 687; finishes 682; weight 4. Job 5, operation 7: M1, 485–495. Job due 687; finishes 682; weight 4. Job 5, operation 8: M4, 495–592. Job due 687; finishes 682; weight 4. 5 Job 5, operation 9: M2, 635–682. Job due 687; finishes 682; weight 4. 5 Job 6, operation 0: M7, 176–247. Job due 624; finishes 848; weight 2. 6 Job 6, operation 1: M3, 274–279. Job due 624; finishes 848; weight 2. Job 6, operation 2: M2, 294–336. Job due 624; finishes 848; weight 2. Job 6, operation 3: M6, 375–377. Job due 624; finishes 848; weight 2. Job 6, operation 4: M1, 377–432. Job due 624; finishes 848; weight 2. 6 Job 6, operation 5: M0, 508–596. Job due 624; finishes 848; weight 2. 6 Job 6, operation 6: M8, 596–629. Job due 624; finishes 848; weight 2. Job 6, operation 7: M5, 664–737. Job due 624; finishes 848; weight 2. 6 Job 6, operation 8: M4, 737–800. Job due 624; finishes 848; weight 2. 6 Job 6, operation 9: M9, 800–848. Job due 624; finishes 848; weight 2. 6 Job 7, operation 0: M6, 969–1026. Job due 607; finishes 1793; weight 2. 7 Job 7, operation 1: M3, 1193–1250. Job due 607; finishes 1793; weight 2. 7 Job 7, operation 2: M5, 1358–1416. Job due 607; finishes 1793; weight 2. 7 Job 7, operation 3: M2, 1416–1510. Job due 607; finishes 1793; weight 2. 7 Job 7, operation 4: M4, 1510–1522. Job due 607; finishes 1793; weight 2. Job 7, operation 5: M0, 1522–1536. Job due 607; finishes 1793; weight 2. Job 7, operation 6: M9, 1564–1627. Job due 607; finishes 1793; weight 2. 7 Job 7, operation 7: M8, 1630–1646. Job due 607; finishes 1793; weight 2. Job 7, operation 8: M1, 1697–1736. Job due 607; finishes 1793; weight 2. Job 7, operation 9: M7, 1736–1793. Job due 607; finishes 1793; weight 2. 7 Job 8, operation 0: M9, 93–182. Job due 653; finishes 876; weight 2. 8 Job 8, operation 1: M0, 182–222. Job due 653; finishes 876; weight 2. Job 8, operation 2: M6, 231–290. Job due 653; finishes 876; weight 2. 8 Job 8, operation 3: M5, 420–425. Job due 653; finishes 876; weight 2. Job 8, operation 4: M8, 439–498. Job due 653; finishes 876; weight 2. 8 Job 8, operation 5: M3, 573–605. Job due 653; finishes 876; weight 2. Job 8, operation 6: M1, 605–698. Job due 653; finishes 876; weight 2. 8 Job 8, operation 7: M4, 698–735. Job due 653; finishes 876; weight 2. Job 8, operation 8: M7, 775–785. Job due 653; finishes 876; weight 2. Job 8, operation 9: M2, 797–876. Job due 653; finishes 876; weight 2. 8 Job 9, operation 0: M3, 0–67. Job due 660; finishes 1051; weight 2. 9 Job 9, operation 1: M2, 105–147. Job due 660; finishes 1051; weight 2. Job 9, operation 2: M5, 208–270. Job due 660; finishes 1051; weight 2. 9 Job 9, operation 3: M4, 270–320. Job due 660; finishes 1051; weight 2. 9 Job 9, operation 4: M0, 431–484. Job due 660; finishes 1051; weight 2. 9 Job 9, operation 5: M6, 511–522. Job due 660; finishes 1051; weight 2. Job 9, operation 6: M9, 556–587. Job due 660; finishes 1051; weight 2. Job 9, operation 7: M7, 842–910. Job due 660; finishes 1051; weight 2. 9 Job 9, operation 8: M8, 923–987. Job due 660; finishes 1051; weight 2. 9 Job 9, operation 9: M1, 991–1051. Job due 660; finishes 1051; weight 2. 9 Job 10, operation 0: M5, 0–72. Job due 690; finishes 1303; weight 2. 10 Job 10, operation 1: M7, 444–492. Job due 690; finishes 1303; weight 2. 10 Job 10, operation 2: M6, 545–547. Job due 690; finishes 1303; weight 2. Job 10, operation 3: M1, 547–596. Job due 690; finishes 1303; weight 2. 10 Job 10, operation 4: M4, 659–693. Job due 690; finishes 1303; weight 2. Job 10, operation 5: M9, 742–762. Job due 690; finishes 1303; weight 2. Job 10, operation 6: M3, 762–842. Job due 690; finishes 1303; weight 2. 10 Job 10, operation 7: M2, 1066–1116. Job due 690; finishes 1303; weight 2. 10 Job 10, operation 8: M8, 1127–1218. Job due 690; finishes 1303; weight 2. 10 Job 10, operation 9: M0, 1218–1303. Job due 690; finishes 1303; weight 2. 10 Job 11, operation 0: M6, 701–754. Job due 703; finishes 1502; weight 2. 11 Job 11, operation 1: M9, 848–860. Job due 703; finishes 1502; weight 2. Job 11, operation 2: M0, 936–966. Job due 703; finishes 1502; weight 2. Job 11, operation 3: M2, 977–1066. Job due 703; finishes 1502; weight 2. 11 Job 11, operation 4: M5, 1084–1147. Job due 703; finishes 1502; weight 2. 11 Job 11, operation 5: M4, 1201–1254. Job due 703; finishes 1502; weight 2. 11 Job 11, operation 6: M3, 1254–1341. Job due 703; finishes 1502; weight 2. 11 Job 11, operation 7: M1, 1341–1395. Job due 703; finishes 1502; weight 2. 11 Job 11, operation 8: M7, 1398–1423. Job due 703; finishes 1502; weight 2. Job 11, operation 9: M8, 1427–1502. Job due 703; finishes 1502; weight 2. 11 Job 12, operation 0: M0, 135–175. Job due 611; finishes 923; weight 2. Job 12, operation 1: M3, 279–317. Job due 611; finishes 923; weight 2. Job 12, operation 2: M4, 320–417. Job due 611; finishes 923; weight 2. 12 Job 12, operation 3: M7, 575–656. Job due 611; finishes 923; weight 2. 12 Job 12, operation 4: M2, 682–733. Job due 611; finishes 923; weight 2. 12 Job 12, operation 5: M1, 738–765. Job due 611; finishes 923; weight 2. Job 12, operation 6: M6, 765–787. Job due 611; finishes 923; weight 2. Job 12, operation 7: M5, 809–879. Job due 611; finishes 923; weight 2. 12 Job 12, operation 8: M9, 879–894. Job due 611; finishes 923; weight 2. Job 12, operation 9: M8, 894–923. Job due 611; finishes 923; weight 2. Job 13, operation 0: M4, 90–106. Job due 426; finishes 909; weight 2. Job 13, operation 1: M3, 179–187. Job due 426; finishes 909; weight 2. Job 13, operation 2: M1, 235–239. Job due 426; finishes 909; weight 2. Job 13, operation 3: M9, 300–335. Job due 426; finishes 909; weight 2. Job 13, operation 4: M6, 377–442. Job due 426; finishes 909; weight 2. 13 Job 13, operation 5: M0, 626–723. Job due 426; finishes 909; weight 2. 13 Job 13, operation 6: M5, 737–740. Job due 426; finishes 909; weight 2. Job 13, operation 7: M7, 751–775. Job due 426; finishes 909; weight 2. Job 13, operation 8: M8, 778–821. Job due 426; finishes 909; weight 2. Job 13, operation 9: M2, 876–909. Job due 426; finishes 909; weight 2. Job 14, operation 0: M4, 0–28. Job due 691; finishes 1331; weight 2. Job 14, operation 1: M1, 56–114. Job due 691; finishes 1331; weight 2. 14 Job 14, operation 2: M6, 114–197. Job due 691; finishes 1331; weight 2. 14 Job 14, operation 3: M0, 894–936. Job due 691; finishes 1331; weight 2. Job 14, operation 4: M3, 936–1003. Job due 691; finishes 1331; weight 2. 14 Job 14, operation 5: M5, 1029–1084. Job due 691; finishes 1331; weight 2. 14 Job 14, operation 6: M2, 1116–1202. Job due 691; finishes 1331; weight 2. 14 Job 14, operation 7: M8, 1218–1225. Job due 691; finishes 1331; weight 2. Job 14, operation 8: M7, 1225–1235. Job due 691; finishes 1331; weight 2. Job 14, operation 9: M9, 1235–1331. Job due 691; finishes 1331; weight 2. 14 Job 15, operation 0: M6, 0–16. Job due 650; finishes 1459; weight 2. Job 15, operation 1: M2, 16–105. Job due 650; finishes 1459; weight 2. 15 Job 15, operation 2: M1, 239–260. Job due 650; finishes 1459; weight 2. Job 15, operation 3: M3, 873–930. Job due 650; finishes 1459; weight 2. 15 Job 15, operation 4: M9, 944–988. Job due 650; finishes 1459; weight 2. Job 15, operation 5: M5, 1147–1244. Job due 650; finishes 1459; weight 2. 15 Job 15, operation 6: M8, 1244–1299. Job due 650; finishes 1459; weight 2. 15 Job 15, operation 7: M7, 1311–1398. Job due 650; finishes 1459; weight 2. 15 Job 15, operation 8: M0, 1398–1418. Job due 650; finishes 1459; weight 2. Job 15, operation 9: M4, 1445–1459. Job due 650; finishes 1459; weight 2. Job 16, operation 0: M7, 247–324. Job due 700; finishes 1204; weight 2. 16 Job 16, operation 1: M8, 379–439. Job due 700; finishes 1204; weight 2. 16 Job 16, operation 2: M0, 484–508. Job due 700; finishes 1204; weight 2. Job 16, operation 3: M2, 582–635. Job due 700; finishes 1204; weight 2. 16 Job 16, operation 4: M4, 836–916. Job due 700; finishes 1204; weight 2. 16 Job 16, operation 5: M5, 955–1029. Job due 700; finishes 1204; weight 2. 16 Job 16, operation 6: M3, 1029–1075. Job due 700; finishes 1204; weight 2. 16 Job 16, operation 7: M9, 1079–1116. Job due 700; finishes 1204; weight 2. Job 16, operation 8: M6, 1116–1125. Job due 700; finishes 1204; weight 2. Job 16, operation 9: M1, 1125–1204. Job due 700; finishes 1204; weight 2. 16 Job 17, operation 0: M1, 0–56. Job due 668; finishes 1201; weight 2. 17 Job 17, operation 1: M0, 283–342. Job due 668; finishes 1201; weight 2. 17 Job 17, operation 2: M7, 416–444. Job due 668; finishes 1201; weight 2. Job 17, operation 3: M2, 451–483. Job due 668; finishes 1201; weight 2. Job 17, operation 4: M5, 740–809. Job due 668; finishes 1201; weight 2. 17 Job 17, operation 5: M6, 818–843. Job due 668; finishes 1201; weight 2. Job 17, operation 6: M9, 894–944. Job due 668; finishes 1201; weight 2. 17 Job 17, operation 7: M8, 987–1056. Job due 668; finishes 1201; weight 2. 17 Job 17, operation 8: M3, 1075–1149. Job due 668; finishes 1201; weight 2. 17 Job 17, operation 9: M4, 1149–1201. Job due 668; finishes 1201; weight 2. 17 Job 18, operation 0: M7, 1132–1216. Job due 678; finishes 1744; weight 2. 18 Job 18, operation 1: M5, 1244–1275. Job due 678; finishes 1744; weight 2. Job 18, operation 2: M2, 1281–1343. Job due 678; finishes 1744; weight 2. 18 Job 18, operation 3: M3, 1343–1370. Job due 678; finishes 1744; weight 2. Job 18, operation 4: M0, 1418–1481. Job due 678; finishes 1744; weight 2. 18 Job 18, operation 5: M1, 1481–1566. Job due 678; finishes 1744; weight 2. 18 Job 18, operation 6: M8, 1566–1630. Job due 678; finishes 1744; weight 2. 18 Job 18, operation 7: M9, 1638–1695. Job due 678; finishes 1744; weight 2. 18 Job 18, operation 8: M6, 1695–1701. Job due 678; finishes 1744; weight 2. Job 18, operation 9: M4, 1701–1744. Job due 678; finishes 1744; weight 2. Job 19, operation 0: M8, 0–23. Job due 698; finishes 1220; weight 2. Job 19, operation 1: M3, 164–165. Job due 698; finishes 1220; weight 2. Job 19, operation 2: M2, 362–390. Job due 698; finishes 1220; weight 2. Job 19, operation 3: M5, 503–554. Job due 698; finishes 1220; weight 2. 19 Job 19, operation 4: M0, 723–818. Job due 698; finishes 1220; weight 2. 19 Job 19, operation 5: M6, 843–918. Job due 698; finishes 1220; weight 2. 19 Job 19, operation 6: M1, 938–991. Job due 698; finishes 1220; weight 2. 19 Job 19, operation 7: M4, 991–1019. Job due 698; finishes 1220; weight 2. Job 19, operation 8: M7, 1037–1132. Job due 698; finishes 1220; weight 2. 19 Job 19, operation 9: M9, 1132–1220. Job due 698; finishes 1220; weight 2. 19 Job 20, operation 0: M9, 212–300. Job due 754; finishes 1179; weight 2. 20 Job 20, operation 1: M5, 493–503. Job due 754; finishes 1179; weight 2. Job 20, operation 2: M3, 605–680. Job due 754; finishes 1179; weight 2. 20 Job 20, operation 3: M2, 733–797. Job due 754; finishes 1179; weight 2. 20 Job 20, operation 4: M6, 797–818. Job due 754; finishes 1179; weight 2. Job 20, operation 5: M8, 821–891. Job due 754; finishes 1179; weight 2. 20 Job 20, operation 6: M1, 904–938. Job due 754; finishes 1179; weight 2. Job 20, operation 7: M7, 955–1037. Job due 754; finishes 1179; weight 2. 20 Job 20, operation 8: M4, 1037–1131. Job due 754; finishes 1179; weight 2. 20 Job 20, operation 9: M0, 1137–1179. Job due 754; finishes 1179; weight 2. Job 21, operation 0: M0, 342–431. Job due 838; finishes 1407; weight 2. 21 Job 21, operation 1: M6, 442–511. Job due 838; finishes 1407; weight 2. 21 Job 21, operation 2: M8, 629–694. Job due 838; finishes 1407; weight 2. 21 Job 21, operation 3: M1, 698–738. Job due 838; finishes 1407; weight 2. Job 21, operation 4: M7, 785–842. Job due 838; finishes 1407; weight 2. 21 Job 21, operation 5: M5, 879–955. Job due 838; finishes 1407; weight 2. 21 Job 21, operation 6: M3, 1149–1193. Job due 838; finishes 1407; weight 2. Job 21, operation 7: M2, 1202–1261. Job due 838; finishes 1407; weight 2. 21 Job 21, operation 8: M4, 1261–1352. Job due 838; finishes 1407; weight 2. 21 Job 21, operation 9: M9, 1352–1407. Job due 838; finishes 1407; weight 2. 21 Job 22, operation 0: M7, 524–575. Job due 767; finishes 1217; weight 2. 22 Job 22, operation 1: M5, 634–664. Job due 767; finishes 1217; weight 2. Job 22, operation 2: M3, 680–758. Job due 767; finishes 1217; weight 2. 22 Job 22, operation 3: M9, 762–799. Job due 767; finishes 1217; weight 2. Job 22, operation 4: M4, 800–836. Job due 767; finishes 1217; weight 2. Job 22, operation 5: M1, 836–904. Job due 767; finishes 1217; weight 2. 22 Job 22, operation 6: M2, 909–977. Job due 767; finishes 1217; weight 2. 22 Job 22, operation 7: M0, 977–1038. Job due 767; finishes 1217; weight 2. 22 Job 22, operation 8: M8, 1056–1127. Job due 767; finishes 1217; weight 2. 22 Job 22, operation 9: M6, 1127–1217. Job due 767; finishes 1217; weight 2. 22 Job 23, operation 0: M6, 918–969. Job due 802; finishes 1747; weight 2. 23 Job 23, operation 1: M0, 1038–1137. Job due 802; finishes 1747; weight 2. 23 Job 23, operation 2: M5, 1275–1358. Job due 802; finishes 1747; weight 2. 23 Job 23, operation 3: M4, 1358–1445. Job due 802; finishes 1747; weight 2. 23 Job 23, operation 4: M3, 1445–1446. Job due 802; finishes 1747; weight 2. Job 23, operation 5: M9, 1446–1543. Job due 802; finishes 1747; weight 2. 23 Job 23, operation 6: M2, 1543–1561. Job due 802; finishes 1747; weight 2. Job 23, operation 7: M1, 1566–1641. Job due 802; finishes 1747; weight 2. 23 Job 23, operation 8: M7, 1641–1723. Job due 802; finishes 1747; weight 2. 23 Job 23, operation 9: M8, 1723–1747. Job due 802; finishes 1747; weight 2. Job 24, operation 0: M4, 916–945. Job due 648; finishes 1873; weight 1. Job 24, operation 1: M3, 1003–1021. Job due 648; finishes 1873; weight 1. Job 24, operation 2: M6, 1026–1103. Job due 648; finishes 1873; weight 1. 24 Job 24, operation 3: M2, 1261–1281. Job due 648; finishes 1873; weight 1. Job 24, operation 4: M8, 1299–1394. Job due 648; finishes 1873; weight 1. 24 Job 24, operation 5: M5, 1416–1459. Job due 648; finishes 1873; weight 1. Job 24, operation 6: M0, 1536–1610. Job due 648; finishes 1873; weight 1. 24 Job 24, operation 7: M9, 1695–1774. Job due 648; finishes 1873; weight 1. 24 Job 24, operation 8: M1, 1809–1869. Job due 648; finishes 1873; weight 1. 24 Job 24, operation 9: M7, 1869–1873. Job due 648; finishes 1873; weight 1. Job 25, operation 0: M3, 165–179. Job due 473; finishes 640; weight 1. Job 25, operation 1: M9, 182–212. Job due 473; finishes 640; weight 1. Job 25, operation 2: M4, 213–249. Job due 473; finishes 640; weight 1. Job 25, operation 3: M2, 275–294. Job due 473; finishes 640; weight 1. Job 25, operation 4: M5, 305–331. Job due 473; finishes 640; weight 1. Job 25, operation 5: M7, 331–381. Job due 473; finishes 640; weight 1. 25 Job 25, operation 6: M1, 432–485. Job due 473; finishes 640; weight 1. 25 Job 25, operation 7: M8, 498–590. Job due 473; finishes 640; weight 1. 25 Job 25, operation 8: M0, 596–626. Job due 473; finishes 640; weight 1. Job 25, operation 9: M6, 626–640. Job due 473; finishes 640; weight 1. Job 26, operation 0: M9, 458–519. Job due 633; finishes 1708; weight 1. 26 Job 26, operation 1: M7, 1235–1311. Job due 633; finishes 1708; weight 1. 26 Job 26, operation 2: M0, 1311–1392. Job due 633; finishes 1708; weight 1. 26 Job 26, operation 3: M8, 1394–1427. Job due 633; finishes 1708; weight 1. Job 26, operation 4: M3, 1446–1481. Job due 633; finishes 1708; weight 1. Job 26, operation 5: M6, 1481–1516. Job due 633; finishes 1708; weight 1. Job 26, operation 6: M4, 1522–1585. Job due 633; finishes 1708; weight 1. 26 Job 26, operation 7: M5, 1585–1621. Job due 633; finishes 1708; weight 1. Job 26, operation 8: M1, 1641–1697. Job due 633; finishes 1708; weight 1. 26 Job 26, operation 9: M2, 1697–1708. Job due 633; finishes 1708; weight 1. Job 27, operation 0: M5, 72–100. Job due 609; finishes 2081; weight 1. Job 27, operation 1: M2, 1561–1626. Job due 609; finishes 2081; weight 1. 27 Job 27, operation 2: M7, 1626–1634. Job due 609; finishes 2081; weight 1. Job 27, operation 3: M9, 1634–1638. Job due 609; finishes 2081; weight 1. Job 27, operation 4: M8, 1646–1714. Job due 609; finishes 2081; weight 1. 27 Job 27, operation 5: M4, 1744–1828. Job due 609; finishes 2081; weight 1. 27 Job 27, operation 6: M1, 1869–1926. Job due 609; finishes 2081; weight 1. 27 Job 27, operation 7: M3, 1926–1955. Job due 609; finishes 2081; weight 1. Job 27, operation 8: M6, 1955–2045. Job due 609; finishes 2081; weight 1. 27 Job 27, operation 9: M0, 2045–2081. Job due 609; finishes 2081; weight 1. Job 28, operation 0: M6, 640–671. Job due 709; finishes 2072; weight 1. Job 28, operation 1: M3, 842–873. Job due 709; finishes 2072; weight 1. Job 28, operation 2: M7, 910–955. Job due 709; finishes 2072; weight 1. 28 Job 28, operation 3: M9, 988–1079. Job due 709; finishes 2072; weight 1. 28 Job 28, operation 4: M2, 1626–1668. Job due 709; finishes 2072; weight 1. Job 28, operation 5: M5, 1668–1734. Job due 709; finishes 2072; weight 1. 28 Job 28, operation 6: M8, 1747–1841. Job due 709; finishes 2072; weight 1. 28 Job 28, operation 7: M1, 1926–2007. Job due 709; finishes 2072; weight 1. 28 Job 28, operation 8: M0, 2007–2018. Job due 709; finishes 2072; weight 1. Job 28, operation 9: M4, 2018–2072. Job due 709; finishes 2072; weight 1. 28 Job 29, operation 0: M8, 694–778. Job due 598; finishes 1809; weight 1. 29 Job 29, operation 1: M2, 1343–1411. Job due 598; finishes 1809; weight 1. 29 Job 29, operation 2: M7, 1423–1513. Job due 598; finishes 1809; weight 1. 29 Job 29, operation 3: M9, 1543–1564. Job due 598; finishes 1809; weight 1. Job 29, operation 4: M5, 1564–1577. Job due 598; finishes 1809; weight 1. Job 29, operation 5: M6, 1577–1618. Job due 598; finishes 1809; weight 1. Job 29, operation 6: M4, 1618–1647. Job due 598; finishes 1809; weight 1. Job 29, operation 7: M0, 1647–1680. Job due 598; finishes 1809; weight 1. Job 29, operation 8: M3, 1680–1688. Job due 598; finishes 1809; weight 1. Job 29, operation 9: M1, 1736–1809. Job due 598; finishes 1809; weight 1. 29 CP-SAT + large-neighborhood search Penalty 31,063 · finishes 2,037 0 200 400 600 800 1,000 1,200 1,400 1,600 1,800 2,000 2,200 M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 Job 0, operation 0: M9, 0–93. Job due 664; finishes 596; weight 4. 0 Job 0, operation 1: M0, 112–135. Job due 664; finishes 596; weight 4. Job 0, operation 2: M4, 146–211. Job due 664; finishes 596; weight 4. 0 Job 0, operation 3: M1, 211–233. Job due 664; finishes 596; weight 4. Job 0, operation 4: M8, 233–314. Job due 664; finishes 596; weight 4. 0 Job 0, operation 5: M7, 314–320. Job due 664; finishes 596; weight 4. Job 0, operation 6: M2, 338–399. Job due 664; finishes 596; weight 4. 0 Job 0, operation 7: M3, 419–477. Job due 664; finishes 596; weight 4. 0 Job 0, operation 8: M6, 494–516. Job due 664; finishes 596; weight 4. Job 0, operation 9: M5, 516–596. Job due 664; finishes 596; weight 4. 0 Job 1, operation 0: M0, 0–39. Job due 716; finishes 703; weight 4. Job 1, operation 1: M4, 45–96. Job due 716; finishes 703; weight 4. 1 Job 1, operation 2: M3, 117–191. Job due 716; finishes 703; weight 4. 1 Job 1, operation 3: M5, 191–235. Job due 716; finishes 703; weight 4. Job 1, operation 4: M6, 295–318. Job due 716; finishes 703; weight 4. Job 1, operation 5: M8, 318–385. Job due 716; finishes 703; weight 4. 1 Job 1, operation 6: M2, 399–425. Job due 716; finishes 703; weight 4. Job 1, operation 7: M9, 425–510. Job due 716; finishes 703; weight 4. 1 Job 1, operation 8: M1, 510–557. Job due 716; finishes 703; weight 4. 1 Job 1, operation 9: M7, 608–703. Job due 716; finishes 703; weight 4. 1 Job 2, operation 0: M8, 23–96. Job due 687; finishes 649; weight 4. 2 Job 2, operation 1: M2, 117–185. Job due 687; finishes 649; weight 4. 2 Job 2, operation 2: M0, 194–255. Job due 687; finishes 649; weight 4. 2 Job 2, operation 3: M1, 255–289. Job due 687; finishes 649; weight 4. Job 2, operation 4: M3, 356–419. Job due 687; finishes 649; weight 4. 2 Job 2, operation 5: M5, 419–487. Job due 687; finishes 649; weight 4. 2 Job 2, operation 6: M7, 487–518. Job due 687; finishes 649; weight 4. Job 2, operation 7: M9, 518–550. Job due 687; finishes 649; weight 4. Job 2, operation 8: M6, 550–582. Job due 687; finishes 649; weight 4. Job 2, operation 9: M4, 582–649. Job due 687; finishes 649; weight 4. 2 Job 3, operation 0: M6, 31–120. Job due 739; finishes 733; weight 4. 3 Job 3, operation 1: M8, 120–166. Job due 739; finishes 733; weight 4. 3 Job 3, operation 2: M2, 185–245. Job due 739; finishes 733; weight 4. 3 Job 3, operation 3: M5, 270–317. Job due 739; finishes 733; weight 4. 3 Job 3, operation 4: M7, 320–349. Job due 739; finishes 733; weight 4. Job 3, operation 5: M4, 349–414. Job due 739; finishes 733; weight 4. 3 Job 3, operation 6: M3, 477–527. Job due 739; finishes 733; weight 4. 3 Job 3, operation 7: M9, 550–606. Job due 739; finishes 733; weight 4. 3 Job 3, operation 8: M1, 606–657. Job due 739; finishes 733; weight 4. 3 Job 3, operation 9: M0, 657–733. Job due 739; finishes 733; weight 4. 3 Job 4, operation 0: M7, 0–86. Job due 702; finishes 720; weight 4. 4 Job 4, operation 1: M0, 86–112. Job due 702; finishes 720; weight 4. Job 4, operation 2: M1, 112–129. Job due 702; finishes 720; weight 4. Job 4, operation 3: M4, 129–146. Job due 702; finishes 720; weight 4. Job 4, operation 4: M8, 166–227. Job due 702; finishes 720; weight 4. 4 Job 4, operation 5: M5, 235–270. Job due 702; finishes 720; weight 4. Job 4, operation 6: M3, 271–356. Job due 702; finishes 720; weight 4. 4 Job 4, operation 7: M2, 425–524. Job due 702; finishes 720; weight 4. 4 Job 4, operation 8: M9, 606–705. Job due 702; finishes 720; weight 4. 4 Job 4, operation 9: M6, 705–720. Job due 702; finishes 720; weight 4. Job 5, operation 0: M8, 96–113. Job due 687; finishes 1017; weight 4. Job 5, operation 1: M0, 255–298. Job due 687; finishes 1017; weight 4. Job 5, operation 2: M7, 518–608. Job due 687; finishes 1017; weight 4. 5 Job 5, operation 3: M3, 612–699. Job due 687; finishes 1017; weight 4. 5 Job 5, operation 4: M6, 720–805. Job due 687; finishes 1017; weight 4. 5 Job 5, operation 5: M5, 805–847. Job due 687; finishes 1017; weight 4. Job 5, operation 6: M9, 847–858. Job due 687; finishes 1017; weight 4. Job 5, operation 7: M1, 858–868. Job due 687; finishes 1017; weight 4. Job 5, operation 8: M4, 868–965. Job due 687; finishes 1017; weight 4. 5 Job 5, operation 9: M2, 970–1017. Job due 687; finishes 1017; weight 4. 5 Job 6, operation 0: M7, 86–157. Job due 624; finishes 943; weight 2. 6 Job 6, operation 1: M3, 191–196. Job due 624; finishes 943; weight 2. Job 6, operation 2: M2, 245–287. Job due 624; finishes 943; weight 2. Job 6, operation 3: M6, 334–336. Job due 624; finishes 943; weight 2. Job 6, operation 4: M1, 336–391. Job due 624; finishes 943; weight 2. 6 Job 6, operation 5: M0, 501–589. Job due 624; finishes 943; weight 2. 6 Job 6, operation 6: M8, 589–622. Job due 624; finishes 943; weight 2. Job 6, operation 7: M5, 651–724. Job due 624; finishes 943; weight 2. 6 Job 6, operation 8: M4, 763–826. Job due 624; finishes 943; weight 2. 6 Job 6, operation 9: M9, 895–943. Job due 624; finishes 943; weight 2. 6 Job 7, operation 0: M6, 173–230. Job due 607; finishes 1473; weight 2. 7 Job 7, operation 1: M3, 929–986. Job due 607; finishes 1473; weight 2. 7 Job 7, operation 2: M5, 986–1044. Job due 607; finishes 1473; weight 2. 7 Job 7, operation 3: M2, 1138–1232. Job due 607; finishes 1473; weight 2. 7 Job 7, operation 4: M4, 1257–1269. Job due 607; finishes 1473; weight 2. Job 7, operation 5: M0, 1269–1283. Job due 607; finishes 1473; weight 2. Job 7, operation 6: M9, 1283–1346. Job due 607; finishes 1473; weight 2. 7 Job 7, operation 7: M8, 1346–1362. Job due 607; finishes 1473; weight 2. Job 7, operation 8: M1, 1377–1416. Job due 607; finishes 1473; weight 2. Job 7, operation 9: M7, 1416–1473. Job due 607; finishes 1473; weight 2. 7 Job 8, operation 0: M9, 258–347. Job due 653; finishes 970; weight 2. 8 Job 8, operation 1: M0, 395–435. Job due 653; finishes 970; weight 2. Job 8, operation 2: M6, 435–494. Job due 653; finishes 970; weight 2. 8 Job 8, operation 3: M5, 494–499. Job due 653; finishes 970; weight 2. Job 8, operation 4: M8, 622–681. Job due 653; finishes 970; weight 2. 8 Job 8, operation 5: M3, 699–731. Job due 653; finishes 970; weight 2. Job 8, operation 6: M1, 731–824. Job due 653; finishes 970; weight 2. 8 Job 8, operation 7: M4, 826–863. Job due 653; finishes 970; weight 2. Job 8, operation 8: M7, 868–878. Job due 653; finishes 970; weight 2. Job 8, operation 9: M2, 891–970. Job due 653; finishes 970; weight 2. 8 Job 9, operation 0: M3, 731–798. Job due 660; finishes 1377; weight 2. 9 Job 9, operation 1: M2, 849–891. Job due 660; finishes 1377; weight 2. Job 9, operation 2: M5, 891–953. Job due 660; finishes 1377; weight 2. 9 Job 9, operation 3: M4, 965–1015. Job due 660; finishes 1377; weight 2. 9 Job 9, operation 4: M0, 1016–1069. Job due 660; finishes 1377; weight 2. 9 Job 9, operation 5: M6, 1069–1080. Job due 660; finishes 1377; weight 2. Job 9, operation 6: M9, 1101–1132. Job due 660; finishes 1377; weight 2. Job 9, operation 7: M7, 1132–1200. Job due 660; finishes 1377; weight 2. 9 Job 9, operation 8: M8, 1253–1317. Job due 660; finishes 1377; weight 2. 9 Job 9, operation 9: M1, 1317–1377. Job due 660; finishes 1377; weight 2. 9 Job 10, operation 0: M5, 103–175. Job due 690; finishes 1243; weight 2. 10 Job 10, operation 1: M7, 439–487. Job due 690; finishes 1243; weight 2. 10 Job 10, operation 2: M6, 541–543. Job due 690; finishes 1243; weight 2. Job 10, operation 3: M1, 557–606. Job due 690; finishes 1243; weight 2. 10 Job 10, operation 4: M4, 729–763. Job due 690; finishes 1243; weight 2. Job 10, operation 5: M9, 763–783. Job due 690; finishes 1243; weight 2. Job 10, operation 6: M3, 849–929. Job due 690; finishes 1243; weight 2. 10 Job 10, operation 7: M2, 1017–1067. Job due 690; finishes 1243; weight 2. 10 Job 10, operation 8: M8, 1067–1158. Job due 690; finishes 1243; weight 2. 10 Job 10, operation 9: M0, 1158–1243. Job due 690; finishes 1243; weight 2. 10 Job 11, operation 0: M6, 120–173. Job due 703; finishes 1899; weight 2. 11 Job 11, operation 1: M9, 246–258. Job due 703; finishes 1899; weight 2. Job 11, operation 2: M0, 619–649. Job due 703; finishes 1899; weight 2. Job 11, operation 3: M2, 1421–1510. Job due 703; finishes 1899; weight 2. 11 Job 11, operation 4: M5, 1510–1573. Job due 703; finishes 1899; weight 2. 11 Job 11, operation 5: M4, 1573–1626. Job due 703; finishes 1899; weight 2. 11 Job 11, operation 6: M3, 1626–1713. Job due 703; finishes 1899; weight 2. 11 Job 11, operation 7: M1, 1713–1767. Job due 703; finishes 1899; weight 2. 11 Job 11, operation 8: M7, 1796–1821. Job due 703; finishes 1899; weight 2. Job 11, operation 9: M8, 1824–1899. Job due 703; finishes 1899; weight 2. 11 Job 12, operation 0: M0, 39–79. Job due 611; finishes 1346; weight 2. Job 12, operation 1: M3, 79–117. Job due 611; finishes 1346; weight 2. Job 12, operation 2: M4, 414–511. Job due 611; finishes 1346; weight 2. 12 Job 12, operation 3: M7, 787–868. Job due 611; finishes 1346; weight 2. 12 Job 12, operation 4: M2, 1067–1118. Job due 611; finishes 1346; weight 2. 12 Job 12, operation 5: M1, 1118–1145. Job due 611; finishes 1346; weight 2. Job 12, operation 6: M6, 1145–1167. Job due 611; finishes 1346; weight 2. Job 12, operation 7: M5, 1180–1250. Job due 611; finishes 1346; weight 2. 12 Job 12, operation 8: M9, 1267–1282. Job due 611; finishes 1346; weight 2. Job 12, operation 9: M8, 1317–1346. Job due 611; finishes 1346; weight 2. Job 13, operation 0: M4, 29–45. Job due 426; finishes 557; weight 2. Job 13, operation 1: M3, 62–70. Job due 426; finishes 557; weight 2. Job 13, operation 2: M1, 70–74. Job due 426; finishes 557; weight 2. Job 13, operation 3: M9, 181–216. Job due 426; finishes 557; weight 2. Job 13, operation 4: M6, 230–295. Job due 426; finishes 557; weight 2. 13 Job 13, operation 5: M0, 298–395. Job due 426; finishes 557; weight 2. 13 Job 13, operation 6: M5, 412–415. Job due 426; finishes 557; weight 2. Job 13, operation 7: M7, 415–439. Job due 426; finishes 557; weight 2. Job 13, operation 8: M8, 445–488. Job due 426; finishes 557; weight 2. Job 13, operation 9: M2, 524–557. Job due 426; finishes 557; weight 2. Job 14, operation 0: M4, 96–124. Job due 691; finishes 1039; weight 2. Job 14, operation 1: M1, 129–187. Job due 691; finishes 1039; weight 2. 14 Job 14, operation 2: M6, 336–419. Job due 691; finishes 1039; weight 2. 14 Job 14, operation 3: M0, 435–477. Job due 691; finishes 1039; weight 2. Job 14, operation 4: M3, 527–594. Job due 691; finishes 1039; weight 2. 14 Job 14, operation 5: M5, 596–651. Job due 691; finishes 1039; weight 2. 14 Job 14, operation 6: M2, 763–849. Job due 691; finishes 1039; weight 2. 14 Job 14, operation 7: M8, 903–910. Job due 691; finishes 1039; weight 2. Job 14, operation 8: M7, 910–920. Job due 691; finishes 1039; weight 2. Job 14, operation 9: M9, 943–1039. Job due 691; finishes 1039; weight 2. 14 Job 15, operation 0: M6, 318–334. Job due 650; finishes 1640; weight 2. Job 15, operation 1: M2, 674–763. Job due 650; finishes 1640; weight 2. 15 Job 15, operation 2: M1, 824–845. Job due 650; finishes 1640; weight 2. Job 15, operation 3: M3, 1064–1121. Job due 650; finishes 1640; weight 2. 15 Job 15, operation 4: M9, 1223–1267. Job due 650; finishes 1640; weight 2. Job 15, operation 5: M5, 1333–1430. Job due 650; finishes 1640; weight 2. 15 Job 15, operation 6: M8, 1433–1488. Job due 650; finishes 1640; weight 2. 15 Job 15, operation 7: M7, 1488–1575. Job due 650; finishes 1640; weight 2. 15 Job 15, operation 8: M0, 1575–1595. Job due 650; finishes 1640; weight 2. Job 15, operation 9: M4, 1626–1640. Job due 650; finishes 1640; weight 2. Job 16, operation 0: M7, 236–313. Job due 700; finishes 983; weight 2. 16 Job 16, operation 1: M8, 385–445. Job due 700; finishes 983; weight 2. 16 Job 16, operation 2: M0, 477–501. Job due 700; finishes 983; weight 2. Job 16, operation 3: M2, 557–610. Job due 700; finishes 983; weight 2. 16 Job 16, operation 4: M4, 649–729. Job due 700; finishes 983; weight 2. 16 Job 16, operation 5: M5, 729–803. Job due 700; finishes 983; weight 2. 16 Job 16, operation 6: M3, 803–849. Job due 700; finishes 983; weight 2. 16 Job 16, operation 7: M9, 858–895. Job due 700; finishes 983; weight 2. Job 16, operation 8: M6, 895–904. Job due 700; finishes 983; weight 2. Job 16, operation 9: M1, 904–983. Job due 700; finishes 983; weight 2. 16 Job 17, operation 0: M1, 0–56. Job due 668; finishes 1321; weight 2. 17 Job 17, operation 1: M0, 135–194. Job due 668; finishes 1321; weight 2. 17 Job 17, operation 2: M7, 208–236. Job due 668; finishes 1321; weight 2. Job 17, operation 3: M2, 306–338. Job due 668; finishes 1321; weight 2. Job 17, operation 4: M5, 343–412. Job due 668; finishes 1321; weight 2. 17 Job 17, operation 5: M6, 516–541. Job due 668; finishes 1321; weight 2. Job 17, operation 6: M9, 705–755. Job due 668; finishes 1321; weight 2. 17 Job 17, operation 7: M8, 975–1044. Job due 668; finishes 1321; weight 2. 17 Job 17, operation 8: M3, 1121–1195. Job due 668; finishes 1321; weight 2. 17 Job 17, operation 9: M4, 1269–1321. Job due 668; finishes 1321; weight 2. 17 Job 18, operation 0: M7, 703–787. Job due 678; finishes 1707; weight 2. 18 Job 18, operation 1: M5, 953–984. Job due 678; finishes 1707; weight 2. Job 18, operation 2: M2, 1300–1362. Job due 678; finishes 1707; weight 2. 18 Job 18, operation 3: M3, 1362–1389. Job due 678; finishes 1707; weight 2. Job 18, operation 4: M0, 1389–1452. Job due 678; finishes 1707; weight 2. 18 Job 18, operation 5: M1, 1452–1537. Job due 678; finishes 1707; weight 2. 18 Job 18, operation 6: M8, 1537–1601. Job due 678; finishes 1707; weight 2. 18 Job 18, operation 7: M9, 1601–1658. Job due 678; finishes 1707; weight 2. 18 Job 18, operation 8: M6, 1658–1664. Job due 678; finishes 1707; weight 2. Job 18, operation 9: M4, 1664–1707. Job due 678; finishes 1707; weight 2. Job 19, operation 0: M8, 0–23. Job due 698; finishes 1434; weight 2. Job 19, operation 1: M3, 23–24. Job due 698; finishes 1434; weight 2. Job 19, operation 2: M2, 24–52. Job due 698; finishes 1434; weight 2. Job 19, operation 3: M5, 52–103. Job due 698; finishes 1434; weight 2. 19 Job 19, operation 4: M0, 822–917. Job due 698; finishes 1434; weight 2. 19 Job 19, operation 5: M6, 917–992. Job due 698; finishes 1434; weight 2. 19 Job 19, operation 6: M1, 1023–1076. Job due 698; finishes 1434; weight 2. 19 Job 19, operation 7: M4, 1145–1173. Job due 698; finishes 1434; weight 2. Job 19, operation 8: M7, 1200–1295. Job due 698; finishes 1434; weight 2. 19 Job 19, operation 9: M9, 1346–1434. Job due 698; finishes 1434; weight 2. 19 Job 20, operation 0: M9, 93–181. Job due 754; finishes 1151; weight 2. 20 Job 20, operation 1: M5, 181–191. Job due 754; finishes 1151; weight 2. Job 20, operation 2: M3, 196–271. Job due 754; finishes 1151; weight 2. 20 Job 20, operation 3: M2, 610–674. Job due 754; finishes 1151; weight 2. 20 Job 20, operation 4: M6, 684–705. Job due 754; finishes 1151; weight 2. Job 20, operation 5: M8, 765–835. Job due 754; finishes 1151; weight 2. 20 Job 20, operation 6: M1, 868–902. Job due 754; finishes 1151; weight 2. Job 20, operation 7: M7, 920–1002. Job due 754; finishes 1151; weight 2. 20 Job 20, operation 8: M4, 1015–1109. Job due 754; finishes 1151; weight 2. 20 Job 20, operation 9: M0, 1109–1151. Job due 754; finishes 1151; weight 2. Job 21, operation 0: M0, 733–822. Job due 838; finishes 1586; weight 2. 21 Job 21, operation 1: M6, 822–891. Job due 838; finishes 1586; weight 2. 21 Job 21, operation 2: M8, 910–975. Job due 838; finishes 1586; weight 2. 21 Job 21, operation 3: M1, 983–1023. Job due 838; finishes 1586; weight 2. Job 21, operation 4: M7, 1047–1104. Job due 838; finishes 1586; weight 2. 21 Job 21, operation 5: M5, 1104–1180. Job due 838; finishes 1586; weight 2. 21 Job 21, operation 6: M3, 1195–1239. Job due 838; finishes 1586; weight 2. Job 21, operation 7: M2, 1362–1421. Job due 838; finishes 1586; weight 2. 21 Job 21, operation 8: M4, 1421–1512. Job due 838; finishes 1586; weight 2. 21 Job 21, operation 9: M9, 1531–1586. Job due 838; finishes 1586; weight 2. 21 Job 22, operation 0: M7, 157–208. Job due 767; finishes 1523; weight 2. 22 Job 22, operation 1: M5, 847–877. Job due 767; finishes 1523; weight 2. Job 22, operation 2: M3, 986–1064. Job due 767; finishes 1523; weight 2. 22 Job 22, operation 3: M9, 1064–1101. Job due 767; finishes 1523; weight 2. Job 22, operation 4: M4, 1109–1145. Job due 767; finishes 1523; weight 2. Job 22, operation 5: M1, 1145–1213. Job due 767; finishes 1523; weight 2. 22 Job 22, operation 6: M2, 1232–1300. Job due 767; finishes 1523; weight 2. 22 Job 22, operation 7: M0, 1300–1361. Job due 767; finishes 1523; weight 2. 22 Job 22, operation 8: M8, 1362–1433. Job due 767; finishes 1523; weight 2. 22 Job 22, operation 9: M6, 1433–1523. Job due 767; finishes 1523; weight 2. 22 Job 23, operation 0: M6, 633–684. Job due 802; finishes 1730; weight 2. 23 Job 23, operation 1: M0, 917–1016. Job due 802; finishes 1730; weight 2. 23 Job 23, operation 2: M5, 1250–1333. Job due 802; finishes 1730; weight 2. 23 Job 23, operation 3: M4, 1333–1420. Job due 802; finishes 1730; weight 2. 23 Job 23, operation 4: M3, 1420–1421. Job due 802; finishes 1730; weight 2. Job 23, operation 5: M9, 1434–1531. Job due 802; finishes 1730; weight 2. 23 Job 23, operation 6: M2, 1531–1549. Job due 802; finishes 1730; weight 2. Job 23, operation 7: M1, 1549–1624. Job due 802; finishes 1730; weight 2. 23 Job 23, operation 8: M7, 1624–1706. Job due 802; finishes 1730; weight 2. 23 Job 23, operation 9: M8, 1706–1730. Job due 802; finishes 1730; weight 2. Job 24, operation 0: M4, 0–29. Job due 648; finishes 1831; weight 1. Job 24, operation 1: M3, 594–612. Job due 648; finishes 1831; weight 1. Job 24, operation 2: M6, 992–1069. Job due 648; finishes 1831; weight 1. 24 Job 24, operation 3: M2, 1118–1138. Job due 648; finishes 1831; weight 1. Job 24, operation 4: M8, 1158–1253. Job due 648; finishes 1831; weight 1. 24 Job 24, operation 5: M5, 1430–1473. Job due 648; finishes 1831; weight 1. Job 24, operation 6: M0, 1595–1669. Job due 648; finishes 1831; weight 1. 24 Job 24, operation 7: M9, 1669–1748. Job due 648; finishes 1831; weight 1. 24 Job 24, operation 8: M1, 1767–1827. Job due 648; finishes 1831; weight 1. 24 Job 24, operation 9: M7, 1827–1831. Job due 648; finishes 1831; weight 1. Job 25, operation 0: M3, 0–14. Job due 473; finishes 633; weight 1. Job 25, operation 1: M9, 216–246. Job due 473; finishes 633; weight 1. Job 25, operation 2: M4, 246–282. Job due 473; finishes 633; weight 1. Job 25, operation 3: M2, 287–306. Job due 473; finishes 633; weight 1. Job 25, operation 4: M5, 317–343. Job due 473; finishes 633; weight 1. Job 25, operation 5: M7, 349–399. Job due 473; finishes 633; weight 1. 25 Job 25, operation 6: M1, 399–452. Job due 473; finishes 633; weight 1. 25 Job 25, operation 7: M8, 488–580. Job due 473; finishes 633; weight 1. 25 Job 25, operation 8: M0, 589–619. Job due 473; finishes 633; weight 1. Job 25, operation 9: M6, 619–633. Job due 473; finishes 633; weight 1. Job 26, operation 0: M9, 783–844. Job due 633; finishes 1975; weight 1. 26 Job 26, operation 1: M7, 1295–1371. Job due 633; finishes 1975; weight 1. 26 Job 26, operation 2: M0, 1488–1569. Job due 633; finishes 1975; weight 1. 26 Job 26, operation 3: M8, 1601–1634. Job due 633; finishes 1975; weight 1. Job 26, operation 4: M3, 1713–1748. Job due 633; finishes 1975; weight 1. Job 26, operation 5: M6, 1748–1783. Job due 633; finishes 1975; weight 1. Job 26, operation 6: M4, 1783–1846. Job due 633; finishes 1975; weight 1. 26 Job 26, operation 7: M5, 1846–1882. Job due 633; finishes 1975; weight 1. Job 26, operation 8: M1, 1908–1964. Job due 633; finishes 1975; weight 1. 26 Job 26, operation 9: M2, 1964–1975. Job due 633; finishes 1975; weight 1. Job 27, operation 0: M5, 0–28. Job due 609; finishes 1488; weight 1. Job 27, operation 1: M2, 52–117. Job due 609; finishes 1488; weight 1. 27 Job 27, operation 2: M7, 399–407. Job due 609; finishes 1488; weight 1. Job 27, operation 3: M9, 407–411. Job due 609; finishes 1488; weight 1. Job 27, operation 4: M8, 835–903. Job due 609; finishes 1488; weight 1. 27 Job 27, operation 5: M4, 1173–1257. Job due 609; finishes 1488; weight 1. 27 Job 27, operation 6: M1, 1257–1314. Job due 609; finishes 1488; weight 1. 27 Job 27, operation 7: M3, 1314–1343. Job due 609; finishes 1488; weight 1. Job 27, operation 8: M6, 1343–1433. Job due 609; finishes 1488; weight 1. 27 Job 27, operation 9: M0, 1452–1488. Job due 609; finishes 1488; weight 1. Job 28, operation 0: M6, 0–31. Job due 709; finishes 1973; weight 1. Job 28, operation 1: M3, 31–62. Job due 709; finishes 1973; weight 1. Job 28, operation 2: M7, 1002–1047. Job due 709; finishes 1973; weight 1. 28 Job 28, operation 3: M9, 1132–1223. Job due 709; finishes 1973; weight 1. 28 Job 28, operation 4: M2, 1549–1591. Job due 709; finishes 1973; weight 1. Job 28, operation 5: M5, 1591–1657. Job due 709; finishes 1973; weight 1. 28 Job 28, operation 6: M8, 1730–1824. Job due 709; finishes 1973; weight 1. 28 Job 28, operation 7: M1, 1827–1908. Job due 709; finishes 1973; weight 1. 28 Job 28, operation 8: M0, 1908–1919. Job due 709; finishes 1973; weight 1. Job 28, operation 9: M4, 1919–1973. Job due 709; finishes 1973; weight 1. 28 Job 29, operation 0: M8, 681–765. Job due 598; finishes 2037; weight 1. 29 Job 29, operation 1: M2, 1591–1659. Job due 598; finishes 2037; weight 1. 29 Job 29, operation 2: M7, 1706–1796. Job due 598; finishes 2037; weight 1. 29 Job 29, operation 3: M9, 1796–1817. Job due 598; finishes 2037; weight 1. Job 29, operation 4: M5, 1817–1830. Job due 598; finishes 2037; weight 1. Job 29, operation 5: M6, 1830–1871. Job due 598; finishes 2037; weight 1. Job 29, operation 6: M4, 1871–1900. Job due 598; finishes 2037; weight 1. Job 29, operation 7: M0, 1919–1952. Job due 598; finishes 2037; weight 1. Job 29, operation 8: M3, 1952–1960. Job due 598; finishes 2037; weight 1. Job 29, operation 9: M1, 1964–2037. Job due 598; finishes 2037; weight 1. 29 Simulated factory time (instance units)
Each row is one machine; each bar is one operation. Green marks jobs that finish on time; orange marks jobs that finish late. Labels identify jobs where space permits. These are the saved schedules for large_1, seed 0, with a requested 1,200-second computation budget. Schedule records · Original figure.

In the earlier 300-second V1–V2 comparison on the same large_1 input, total weighted tardiness fell from 31,807 to 30,579: a reduction of 1,228 weighted time units, or about 3.9%. That is a lower benchmark lateness score, not measured hours or dollars saved. Several changes went into V2 together, so this experiment cannot identify which change contributed most. Nor does it isolate the effect of Trackinizer or Sagent from the rest of the workflow.

Would it work on new inputs?

The revised solver eventually beat FrontierOR’s saved Gurobi solution values on all five public large inputs under both tested seeds. Those were feasible recorded schedules, not proven optima, and they had influenced development. We wanted to know whether the program could handle unfamiliar problems.

We obtained the scheduling researchers’ historical EGRASP executable and built the input conversion and independent checks needed for a comparison. An early test was uninformative: both programs achieved zero tardiness on eight of twelve synthetic problems. We tightened deadlines in the development generator to make the test more demanding.

We then froze V2 – the same source used in the development comparison – along with the generator settings, evaluation procedure and analysis before drawing thirty fresh problems. Each program ran three times per problem in the same emulated Linux environment, with one CPU quota, 512 MiB of memory and a 300-second external deadline. All 180 executions produced valid schedules. The opening chart compares each program’s three-run mean penalty.

This demonstrates reuse on thirty new inputs from the tested distribution. The comparison uses a historical executable released in 2014, associated with Bierwirth and Kuhpfahl’s 2017 paper; it does not establish a new scheduling state of the art. We did not give that baseline the same development effort, and the shared host was not fully isolated.

From one problem to the next

If your problem has the same scheduling formulation, you can start with the frozen C++ solver and test it against your own baseline. Changing the objective or constraints may require changing the program.

For a different problem, reuse the research process: give the scientist a precise objective, representative inputs and an evaluator that checks both validity and quality. You will need to adapt the input format, execution runner and validators to your domain. Preserve each candidate program with its results, then reserve fresh inputs for the final comparison. An operations specialist supplies the constraints that make a schedule usable; the same division of work can apply to a compiler optimization or a circuit design if you can run and independently check the candidate.

Beyond scheduling: what the delivery and cutting studies showed

The broader question led us to a separate campaign across 180 FrontierOR tasks, each needing its own solver. Of 180 selected outputs, 177 passed the feasibility checker. Review retained four gains over the references and a fifth, marginal result with an unresolved reference label. Those results cover one public small input per task; they do not establish the scheduling study’s reuse on fresh inputs. Two examples show what a researcher can learn from the resulting programs:

One task required thirty pickup-and-delivery requests, with time windows, capacity limits and last-in-first-out loading. The candidate served them with ten trucks; the released reference used thirty. Its code required every modeled truck to operate even though the problem allowed unused vehicles. At 10,000 cost units per operating truck, avoiding twenty departures accounted for about 99.4% of the improvement. The candidate found a legal plan outside the reference implementation’s restricted search. Ten trucks suffice for this input; the minimum fleet is unknown.

Cutting: a solution with a proof of optimality

Another task asked for guillotine cuts on a 40 × 40 sheet. The candidate produced 400 pieces of size 1 × 4, using the entire sheet, compared with the reference’s value of 1,592. Here each piece was worth its area. The candidate’s value of 1,600 therefore reached an upper bound: no plan could recover more area than the sheet contained. This instance had both a checked construction and a proof of optimality.

These are modeled benchmark outcomes; savings in operating businesses have not been measured.

For a problem you can specify and independently evaluate, an AI scientist can help build the specialist program you need. The starting materials are open: Sagent, Trackinizer, and our solver code, inputs, results and validation records. As in the Craftax study, the research produces a system that can run on its own. You set the objective and judge whether the evidence is sufficient.

To reproduce or adapt the supply-chain study, reach out to Venkateshwar Reddy Jambula.

Source records

Join us → Return to the blog