Supplementary Dataset and Experimental Artifacts for Counterfactual Recourse Explanation for Sustainable Job-Shop Scheduling with Discrete Speed Scaling
Fuente:
Zenodo
Enregistré dans:
| Auteurs principaux: | , , |
|---|---|
| Format: | Recurso digital |
| Langue: | anglais |
| Publié: |
Zenodo
2026
|
| Sujets: | |
| Accès en ligne: | |
| Tags: |
Ajouter un tag
Pas de tags, Soyez le premier à ajouter un tag!
|
| _version_ | 1866901621701607424 |
|---|---|
| author | Pérez, Christian Salido, Miguel A. Giret, Adriana |
| author_facet | Pérez, Christian Salido, Miguel A. Giret, Adriana |
| contents | <p>This repository accompanies the paper <strong>“</strong>Counterfactual Recourse Explanation for Sustainable Job Shop Scheduling with Discrete Speed Scaling” and provides:</p> <ul> <li> <p>a zipped data package with instances, baseline schedules, and recourse outputs (LCC + rescheduling); and</p> </li> <li> <p>a consolidated spreadsheet with Baseline + LCC + Rescheduling results.</p> </li> </ul> <h2> Erratum / Updated Table 1</h2> <p>During the preparation of this supplementary release, we detected an issue in the script used to generate Table 1 in an earlier draft of the paper. Specifically, the table aggregation incorrectly treated LCC as if it included Phase 2 fields, while in our pipeline, LCC corresponds to Phase 1 only (feasibility + minimal intervention cardinality).</p> <p>We therefore provide below a corrected Table 1, computed from the regenerated artifacts (using LCC = Phase 1 outputs and direct re-optimization = rescheduling outputs), reporting means over solve rate. This updated table is included here to support the ongoing paper revision and facilitate reviewer verification.</p> <table style="width: 85.9168%;"> <thead> <tr> <th style="width: 16.6302%;">Instance</th> <th style="width: 23.3484%;">Method</th> <th style="width: 11.2337%;">kstar</th> <th style="width: 16.7404%;">EC</th> <th style="width: 12.9958%;">MK</th> <th style="width: 19.0532%;">SolveRate</th> </tr> </thead> <tbody> <tr> <td style="width: 16.6302%;">5×5</td> <td style="width: 23.3484%;">re-optimization</td> <td style="width: 11.2337%;">17.97</td> <td style="width: 16.7404%;">1045.55</td> <td style="width: 12.9958%;">374.80</td> <td style="width: 19.0532%;">98.71%</td> </tr> <tr> <td style="width: 16.6302%;">5×5</td> <td style="width: 23.3484%;">LCC</td> <td style="width: 11.2337%;">2.57</td> <td style="width: 16.7404%;">1459.67</td> <td style="width: 12.9958%;">290.99</td> <td style="width: 19.0532%;">100.00%</td> </tr> <tr> <td style="width: 16.6302%;">10×10</td> <td style="width: 23.3484%;">re-optimization</td> <td style="width: 11.2337%;">48.34</td> <td style="width: 16.7404%;">5430.18</td> <td style="width: 12.9958%;">706.32</td> <td style="width: 19.0532%;">98.26%</td> </tr> <tr> <td style="width: 16.6302%;">10×10</td> <td style="width: 23.3484%;">LCC</td> <td style="width: 11.2337%;">9.09</td> <td style="width: 16.7404%;">6255.49</td> <td style="width: 12.9958%;">533.01</td> <td style="width: 19.0532%;">100.00%</td> </tr> <tr> <td style="width: 16.6302%;">15×15</td> <td style="width: 23.3484%;">re-optimization</td> <td style="width: 11.2337%;">62.70</td> <td style="width: 16.7404%;">14240.77</td> <td style="width: 12.9958%;">974.82</td> <td style="width: 19.0532%;">99.55%</td> </tr> <tr> <td style="width: 16.6302%;">15×15</td> <td style="width: 23.3484%;">LCC</td> <td style="width: 11.2337%;">20.64</td> <td style="width: 16.7404%;">14843.51</td> <td style="width: 12.9958%;">750.11</td> <td style="width: 19.0532%;">100.00%</td> </tr> </tbody> </table> <h2> Problem setting (what the data represents)</h2> <p>We consider an <strong>energy-aware Job Shop Scheduling Problem (JSP)</strong> with <strong>discrete speed scaling</strong>:</p> <ul> <li> <p>Each instance has <strong>J</strong> jobs and <strong>M</strong> machines, with <strong>J×M</strong> operations.</p> </li> <li> <p>Each operation can be executed at one of <strong>SPEED</strong> discrete speed modes, which affects:</p> <ul> <li> <p>processing time (duration)</p> </li> <li> <p>energy consumption</p> </li> </ul> </li> </ul> <p>Given a <strong>baseline schedule</strong> with:</p> <ul> <li> <p>baseline makespan <strong>MK0</strong></p> </li> <li> <p>baseline energy <strong>EC0</strong></p> </li> </ul> <p>We define a <strong>recourse query</strong> using two parameters:</p> <ul> <li> <p><strong>x_pct</strong>: required energy saving (e.g., <code>x_pct=10</code> means “save 10% energy”)</p> </li> <li> <p><strong>y_pct</strong>: allowed makespan increase (e.g., <code>y_pct=5</code> means “makespan can increase up to 5%”)</p> </li> </ul> <p>A recourse solution aims to change as few decisions as possible (<strong>sparse intervention</strong>, denoted by <strong>k*</strong> / <code>kstar</code>) while satisfying:</p> <ul> <li> <p><strong>Energy constraint:</strong><br><code>Energy ≤ (1 − x_pct/100) · EC0</code></p> </li> <li> <p><strong>Makespan constraint:</strong><br><code>Makespan ≤ (1 + y_pct/100) · MK0</code></p> </li> </ul> <h3> Pipeline in this release (LCC + Rescheduling)</h3> <ul> <li> <p><strong>LCC:</strong> find a feasible counterfactual and the <strong>minimum intervention cardinality</strong> <code>kstar</code></p> </li> <li> <p><strong>Rescheduling (paired with LCC feasible outputs):</strong> repair/ensure feasibility under the new speeds when needed</p> </li> </ul> <h2> ZIP package: <code>IGJSPInstances.zip</code></h2> <h3> High-level layout</h3> <p>Inside the zip, everything lives under <code>IGJSPInstances/</code> and is organized by <strong>distribution family + distribution seed</strong>:</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>IGJSPInstances/ exponential_0/ exponential_1/ exponential_2/ normal_0/ normal_1/ normal_2/ uniform_0/ uniform_1/ uniform_2/ solutions.pkl </code></div> </div> <p>Each <code><dist>_<seed>/</code> directory contains:</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code><dist>_<seed>/ instances/ solutions/ recourse/ </code></div> </div> <h2> ️ Instances (<code>instances/</code>)</h2> <p>Example filenames:</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>instances/ 5_5-0-3_0.dzn 10_10-0-3_7.dzn 15_15-0-3_3.dzn </code></div> </div> <p>What they contain (MiniZinc <code>.dzn</code>):</p> <ul> <li> <p><code>J, M, SPEED</code></p> </li> <li> <p><code>time[J, M, SPEED]</code> and <code>energy[J, M, SPEED]</code></p> </li> <li> <p>routing/precedence structures needed by the JSP model</p> </li> </ul> <p><strong>Note:</strong> in the provided instances, <code>SPEED=3</code> (three discrete modes). The <code>-0-3</code> token is a generator/config label present in filenames.</p> <h2> Baseline solutions (<code>solutions/</code>)</h2> <p>Organized by size folder (e.g., <code>5-5</code>, <code>10-10</code>, …):</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>solutions/ 5-5/ 5_5_exponential_0_0_cp-sat.json 10-10/ 10_10_exponential_0_7_cp-sat.json </code></div> </div> <p>These JSON files store the <strong>baseline schedule</strong> (e.g., start times and baseline speed choices, depending on the exporter).<br>The spreadsheet provides the computed <strong>MK0</strong> and <strong>EC0</strong> used throughout the experiments.</p> <h2> Recourse outputs (LCC + Rescheduling)</h2> <p>Recourse files are grouped by size folder (<strong>recourse is provided for square sizes only</strong>):</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>recourse/ phase1/ 5-5/ 10-10/ 15-15/ </code></div> </div> <p>Typical naming pattern:</p> <ul> <li> <p><strong>LCC output (legacy token <code>phase1</code>):</strong></p> <ul> <li> <p><code>J_M_<dist>_<distseed>_<instanceid>_x<X>_y<Y>_phase1_cp-sat.json</code></p> </li> </ul> </li> <li> <p><strong>Rescheduling output (paired with LCC feasible cases):</strong></p> <ul> <li> <p><code>J_M_<dist>_<distseed>_<instanceid>_x<X>_y<Y>_phase1_cp-sat_resch.json</code></p> </li> </ul> </li> </ul> <p>Key fields you will commonly see in recourse JSONs:</p> <ul> <li> <p><code>status</code> (e.g., <code>OPTIMAL_SOLUTION</code>, <code>NO_FEASIBLE</code>, …)</p> </li> <li> <p><code>kstar</code> (minimum intervention cardinality)</p> </li> <li> <p><code>changes</code> (actual number of changes in the returned solution; typically equals <code>kstar</code> when feasible)</p> </li> <li> <p><code>solution.delta</code> (binary matrix marking which operations were changed vs. baseline)</p> </li> <li> <p><code>time_s</code> (solver/runtime in seconds)</p> </li> </ul> <h2> What’s inside (coverage at a glance)</h2> <p>From the provided artifacts:</p> <h3>ZIP package</h3> <ul> <li> <p><strong>810 instances</strong> (<code>.dzn</code>) across <strong>9</strong> dist-seed folders and <strong>9</strong> size configurations</p> </li> <li> <p><strong>810 baseline solutions</strong> (<code>*_cp-sat.json</code>)</p> </li> <li> <p>Recourse (LCC + rescheduling) is provided for sizes:</p> <ul> <li> <p><strong>5×5, 10×10, 15×15</strong></p> </li> <li> <p><strong>10 instances each</strong> across all <strong>9</strong> dist-seed folders → <strong>270 recourse-enabled base instances</strong></p> </li> </ul> </li> </ul> <h3>Recourse queries</h3> <ul> <li> <p><code>x_pct ∈ {2, 5, 10, 15, 20}</code></p> </li> <li> <p><code>y_pct ∈ {2, 5, 10, 15, 20}</code></p> </li> <li> <p><strong>25 queries</strong> per base instance → <strong>6,750 total rows</strong> in the spreadsheet</p> </li> </ul> <h3>Feasibility (from the spreadsheet)</h3> <ul> <li> <p><strong>LCC feasible:</strong> <code>3,759 / 6,750 ≈ 55.7%</code></p> </li> <li> <p>For LCC-feasible cases, <strong>Rescheduling is available</strong> (same count: <strong>3,759</strong>)</p> </li> </ul> <h3> Representative explanation certificates</h3> <p>To facilitate reviewer verification, we include a small set of representative explanation certificates extracted from the regenerated resource artifacts. Each table reports one example per intervention cardinality k* for a given instance size (5×5, 10×10, 15×15).</p> <p><strong>Interpretation of the columns</strong></p> <ul> <li> <p><strong>Query (x, y)</strong>: recourse request where x is the required energy saving (%) and y is the allowed makespan increase (%) with respect to the baseline (EC0, MK0).</p> </li> <li> <p><strong>k*</strong>: minimum intervention cardinality returned by LCC (Phase 1), i.e., the smallest number of operations whose discrete speed mode must be changed to satisfy the query.</p> </li> <li> <p><strong>Modified operations (j, t): s0 → s*</strong>: the set of operation-level interventions, indicating for each job j and operation index t the baseline speed s0 and the counterfactual speed s*.</p> </li> <li> <p><strong>Δ EC (%)</strong> and <strong>Δ MK (%)</strong>: relative change in energy and makespan with respect to baseline (negative values indicate improvements vs. baseline).</p> </li> <li> <p><strong>Top-ranked (j, t)</strong>: the operation ranked as most influential under the certificate scoring used in the paper (energy contribution/impact).</p> </li> <li> <p><strong>Cum. energy (top-3)</strong>: cumulative share of energy explained by the top-3 ranked operations (higher values indicate more concentrated explanations).</p> </li> </ul> <table> <thead> <tr> <th>Instance</th> <th>Query (x,y)</th> <th>k*</th> <th>Modified operations (j,t): s0 → s*</th> <th>Δ EC (%)</th> <th>Δ MK (%)</th> <th>Top-ranked (j,t)</th> <th>Cum. energy (top-3)</th> </tr> </thead> <tbody> <tr> <td>5×5</td> <td>(5,2)</td> <td>1</td> <td>(3,2):1→3</td> <td>6,3</td> <td>1,5</td> <td>(3,2)</td> <td>100%</td> </tr> <tr> <td>5×5</td> <td>(10,2)</td> <td>2</td> <td>(1,5):1→3;(2,2):1→3</td> <td>11,0</td> <td>-6,1</td> <td>(1,5)</td> <td>100%</td> </tr> <tr> <td>5×5</td> <td>(15,2)</td> <td>3</td> <td>(3,3):1→2;(1,1):2→3;(5,5):1→3</td> <td>18,1</td> <td>1,9</td> <td>(3,3)</td> <td>100%</td> </tr> <tr> <td>5×5</td> <td>(20,2)</td> <td>4</td> <td>(1,4):1→3;(5,2):1→3;(4,4):1→2;(1,5):1→3</td> <td>21,3</td> <td>-3,1</td> <td>(1,4)</td> <td>76%</td> </tr> <tr> <td>5×5</td> <td>(20,15)</td> <td>5</td> <td>(2,2):1→3;(5,1):1→3;(4,4):1→3;(2,5):1→3;…</td> <td>20,3</td> <td>14,9</td> <td>(2,2)</td> <td>64%</td> </tr> <tr> <td>5×5</td> <td>(20,2)</td> <td>6</td> <td>(2,3):1→3;(3,1):1→3;(1,4):1→3;(5,2):2→3;…</td> <td>20,6</td> <td>1,2</td> <td>(2,3)</td> <td>66%</td> </tr> </tbody> </table> <table> <thead> <tr> <th>Instance</th> <th>Query (x,y)</th> <th>k*</th> <th>Modified operations (j,t): s0 → s*</th> <th>Δ EC (%)</th> <th>Δ MK (%)</th> <th>Top-ranked (j,t)</th> <th>Cum. energy (top-3)</th> </tr> </thead> <tbody> <tr> <td>10×10</td> <td>(2,2)</td> <td>2</td> <td>(9,6):1→3;(6,10):1→3</td> <td>2,7</td> <td>0,2</td> <td>(9,6)</td> <td>100%</td> </tr> <tr> <td>10×10</td> <td>(5,2)</td> <td>4</td> <td>(9,9):1→3;(10,7):1→3;(4,1):1→3;(3,2):1→3</td> <td>5,7</td> <td>-14,4</td> <td>(9,9)</td> <td>80%</td> </tr> <tr> <td>10×10</td> <td>(5,2)</td> <td>5</td> <td>(1,6):1→3;(9,5):1→3;(10,4):1→3;(10,1):2→3;…</td> <td>6,2</td> <td>2,0</td> <td>(1,6)</td> <td>64%</td> </tr> <tr> <td>10×10</td> <td>(10,2)</td> <td>8</td> <td>(1,3):1→3;(9,2):1→3;(4,2):1→3;(8,2):1→3;…</td> <td>10,2</td> <td>1,9</td> <td>(1,3)</td> <td>40%</td> </tr> <tr> <td>10×10</td> <td>(10,2)</td> <td>9</td> <td>(10,8):1→3;(10,7):1→3;(9,9):1→3;(9,2):1→3;…</td> <td>11,0</td> <td>2,0</td> <td>(10,8)</td> <td>36%</td> </tr> <tr> <td>10×10</td> <td>(10,2)</td> <td>10</td> <td>(8,10):1→3;(8,6):1→3;(10,4):1→3;(7,2):1→3;…</td> <td>10,2</td> <td>1,9</td> <td>(8,10)</td> <td>34%</td> </tr> <tr> <td>10×10</td> <td>(15,2)</td> <td>12</td> <td>(1,4):1→3;(4,4):1→3;(7,3):1→3;(1,5):1→3;…</td> <td>15,1</td> <td>1,7</td> <td>(1,4)</td> <td>27%</td> </tr> <tr> <td>10×10</td> <td>(15,2)</td> <td>13</td> <td>(6,3):1→3;(8,5):1→3;(1,9):1→3;(5,10):1→3;…</td> <td>16,0</td> <td>-11,3</td> <td>(6,3)</td> <td>26%</td> </tr> <tr> <td>10×10</td> <td>(15,2)</td> <td>14</td> <td>(7,8):1→3;(9,6):1→3;(1,10):1→3;(8,10):1→3;…</td> <td>15,6</td> <td>1,9</td> <td>(7,8)</td> <td>24%</td> </tr> <tr> <td>10×10</td> <td>(15,20)</td> <td>15</td> <td>(8,6):1→3;(10,4):1→3;(5,4):1→3;(8,10):1→3;…</td> <td>15,4</td> <td>19,9</td> <td>(8,10)</td> <td>23%</td> </tr> <tr> <td>10×10</td> <td>(20,2)</td> <td>16</td> <td>(7,8):1→3;(3,8):1→3;(9,8):1→3;(8,7):1→3;…</td> <td>20,4</td> <td>1,9</td> <td>(7,8)</td> <td>21%</td> </tr> <tr> <td>10×10</td> <td>(20,2)</td> <td>17</td> <td>(6,2):1→3;(2,8):1→3;(2,9):1→3;(1,1):1→3;…</td> <td>20,4</td> <td>2,0</td> <td>(6,2)</td> <td>21%</td> </tr> <tr> <td>10×10</td> <td>(20,2)</td> <td>18</td> <td>(1,3):1→3;(9,2):1→3;(4,2):1→3;(8,2):1→3;…</td> <td>20,7</td> <td>1,8</td> <td>(1,3)</td> <td>20%</td> </tr> <tr> <td>10×10</td> <td>(20,15)</td> <td>19</td> <td>(7,4):1→3;(10,7):1→3;(5,5):1→3;(1,4):1→3;…</td> <td>20,2</td> <td>14,9</td> <td>(7,4)</td> <td>19%</td> </tr> <tr> <td>10×10</td> <td>(20,15)</td> <td>20</td> <td>(8,10):1→3;(8,6):1→3;(10,4):1→3;(5,4):1→3;…</td> <td>20,0</td> <td>14,6</td> <td>(8,10)</td> <td>17%</td> </tr> </tbody> </table> <table> <thead> <tr> <th>Instance</th> <th>Query (x,y)</th> <th>k*</th> <th>Modified operations (j,t): s0 → s*</th> <th>Δ EC (%)</th> <th>Δ MK (%)</th> <th>Top-ranked (j,t)</th> <th>Cum. energy (top-3)</th> </tr> </thead> <tbody> <tr> <td>15×15</td> <td>(2,2)</td> <td>4</td> <td>(12,10):1→3;(14,14):1→3;(11,1):1→3;(13,11):1→3</td> <td>2,3</td> <td>-25,3</td> <td>(12,10)</td> <td>79%</td> </tr> <tr> <td>15×15</td> <td>(5,2)</td> <td>9</td> <td>(11,4):1→3;(14,8):1→3;(15,5):1→3;(12,2):1→3;…</td> <td>5,1</td> <td>-2,8</td> <td>(11,4)</td> <td>35%</td> </tr> <tr> <td>15×15</td> <td>(5,2)</td> <td>10</td> <td>(15,5):2→3;(15,14):1→3;(15,4):1→3;(15,7):1→3;…</td> <td>5,3</td> <td>2,0</td> <td>(15,5)</td> <td>31%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>18</td> <td>(13,4):1→3;(1,13):1→3;(7,8):1→3;(1,11):1→3;…</td> <td>10,1</td> <td>2,0</td> <td>(13,4)</td> <td>18%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>19</td> <td>(13,12):1→3;(15,6):1→3;(15,12):1→3;(8,13):1→3;…</td> <td>10,3</td> <td>2,0</td> <td>(13,12)</td> <td>17%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>20</td> <td>(9,3):1→3;(6,11):1→3;(12,14):1→3;(8,1):1→3;…</td> <td>10,4</td> <td>0,8</td> <td>(9,3)</td> <td>16%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>21</td> <td>(7,6):1→3;(5,11):1→3;(11,1):1→3;(11,12):1→3;…</td> <td>10,4</td> <td>1,9</td> <td>(7,6)</td> <td>15%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>28</td> <td>(13,4):1→3;(1,13):1→3;(7,8):1→3;(1,11):1→3;…</td> <td>15,0</td> <td>2,0</td> <td>(13,4)</td> <td>12%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>29</td> <td>(11,14):1→3;(6,11):1→3;(14,6):1→3;(11,5):1→3;…</td> <td>15,2</td> <td>1,9</td> <td>(11,14)</td> <td>12%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>30</td> <td>(7,8):1→3;(12,13):1→3;(14,10):1→3;(7,11):1→3;…</td> <td>15,0</td> <td>-9,9</td> <td>(7,8)</td> <td>11%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>31</td> <td>(10,12):1→3;(6,9):1→3;(3,6):1→3;(7,5):1→3;…</td> <td>15,3</td> <td>2,0</td> <td>(10,12)</td> <td>11%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>32</td> <td>(2,11):1→3;(4,10):1→3;(7,6):1→3;(5,11):1→3;…</td> <td>15,2</td> <td>1,9</td> <td>(2,11)</td> <td>11%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>39</td> <td>(15,11):1→3;(13,11):1→3;(5,1):1→3;(12,13):1→3;…</td> <td>20,1</td> <td>1,9</td> <td>(15,11)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>40</td> <td>(11,14):1→3;(6,11):1→3;(14,6):1→3;(11,5):1→3;…</td> <td>20,2</td> <td>1,8</td> <td>(11,14)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>41</td> <td>(3,13):1→3;(2,14):1→3;(7,5):1→3;(8,3):1→3;…</td> <td>20,4</td> <td>2,0</td> <td>(3,13)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>42</td> <td>(1,6):1→3;(6,12):1→3;(1,11):1→3;(13,15):1→3;…</td> <td>20,4</td> <td>1,8</td> <td>(1,6)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>43</td> <td>(10,12):1→3;(6,9):1→3;(3,6):1→3;(7,5):1→3;…</td> <td>20,3</td> <td>2,0</td> <td>(10,12)</td> <td>8%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>44</td> <td>(2,11):1→3;(4,10):1→3;(7,6):1→3;(5,11):1→3;…</td> <td>20,2</td> <td>1,9</td> <td>(2,11)</td> <td>8%</td> </tr> </tbody> </table> <h2> Spreadsheet: <code>data.xlsx</code></h2> <p><strong>Sheet:</strong> <code>Worksheet</code></p> <p>This file merges, per <code>(instance, x_pct, y_pct)</code>, the baseline metrics and the outputs of <strong>LCC / Rescheduling</strong>.</p> <h3> Quick interpretation of the main column groups</h3> <h4>Identifiers</h4> <ul> <li> <p><code>conf_key</code>: base instance ID in the form <code>J_M_dist_distSeed_instanceId</code></p> </li> <li> <p><code>instance</code>: query id in the form <code>..._xX_yY</code></p> </li> <li> <p><code>distribution, seed, numJobs, numMachines, speed_levels, conf_folder, exp_dir</code></p> </li> </ul> <h4>Baseline</h4> <ul> <li> <p><code>MK0</code>: baseline makespan</p> </li> <li> <p><code>EC0</code>: baseline energy</p> </li> <li> <p><code>baseline_objective</code>: <code>MK0 + EC0</code></p> </li> <li> <p><code>EC_min</code>: lower bound obtained by choosing per-operation minimal-energy speed (reference)</p> </li> <li> <p><code>x_max</code>: max achievable energy saving bound derived from <code>EC_min</code> vs. <code>EC0</code></p> </li> </ul> <h4>LCC (paper Phase 1)</h4> <ul> <li> <p><code>lcc_status, lcc_kstar, lcc_changes</code></p> </li> <li> <p><code>lcc_makespan, lcc_energy</code></p> </li> <li> <p><code>lcc_phase1_objective</code> (objective value when LCC is feasible)</p> </li> <li> <p><code>lcc_time_s</code></p> </li> </ul> <h4>Rescheduling (paired with LCC feasible cases)</h4> <ul> <li> <p><code>resch_status, resch_changes</code></p> </li> <li> <p><code>resch_makespan, resch_energy</code></p> </li> <li> <p><code>resch_phase1_objective</code></p> </li> <li> <p><code>resch_time_s</code></p> </li> </ul> <h2> Full column dictionary (LCC release)</h2> <div> <div> <table> <thead> <tr> <th>Column</th> <th>Meaning</th> </tr> </thead> <tbody> <tr> <td>conf_key</td> <td>Base instance key: <code>J_M_distribution_distSeed_instanceId</code></td> </tr> <tr> <td>exp_dir</td> <td>Folder name used in the zip (e.g., <code>exponential_0</code>)</td> </tr> <tr> <td>conf_folder</td> <td>Size folder used in results (e.g., <code>5-5</code>, <code>10-10</code>, <code>15-15</code>)</td> </tr> <tr> <td>instance</td> <td>Query key including the recourse parameters: <code>..._xX_yY</code></td> </tr> <tr> <td>distribution</td> <td>Distribution family (<code>uniform</code>, <code>normal</code>, <code>exponential</code>)</td> </tr> <tr> <td>seed</td> <td>Distribution seed (<code>0, 1, 2</code>)</td> </tr> <tr> <td>numJobs</td> <td><code>J</code></td> </tr> <tr> <td>numMachines</td> <td><code>M</code></td> </tr> <tr> <td>speed_levels</td> <td>Number of speed modes (<code>SPEED</code>)</td> </tr> <tr> <td>x_pct</td> <td>Target energy saving (%)</td> </tr> <tr> <td>y_pct</td> <td>Allowed makespan increase (%)</td> </tr> <tr> <td>MK0</td> <td>Baseline makespan</td> </tr> <tr> <td>EC0</td> <td>Baseline energy</td> </tr> <tr> <td>baseline_objective</td> <td><code>MK0 + EC0</code></td> </tr> <tr> <td>EC_min</td> <td>Per-operation minimum-energy bound (reference)</td> </tr> <tr> <td>x_max</td> <td>Bound on maximum achievable energy saving vs. baseline</td> </tr> <tr> <td>lcc_status</td> <td>LCC solve status</td> </tr> <tr> <td>lcc_kstar</td> <td>Minimum intervention cardinality found by LCC</td> </tr> <tr> <td>lcc_changes</td> <td>Number of changes in the LCC solution</td> </tr> <tr> <td>lcc_phase1_objective</td> <td>Objective for LCC solution (when feasible)</td> </tr> <tr> <td>lcc_makespan</td> <td>Makespan of LCC solution</td> </tr> <tr> <td>lcc_energy</td> <td>Energy of LCC solution</td> </tr> <tr> <td>lcc_time_s</td> <td>LCC runtime (seconds)</td> </tr> <tr> <td>resch_status</td> <td>Rescheduling solve status</td> </tr> <tr> <td>resch_changes</td> <td>Number of changes after rescheduling</td> </tr> <tr> <td>resch_phase1_objective</td> <td>Objective after rescheduling</td> </tr> <tr> <td>resch_makespan</td> <td>Makespan after rescheduling</td> </tr> <tr> <td>resch_energy</td> <td>Energy after rescheduling</td> </tr> <tr> <td>resch_time_s</td> <td>Rescheduling runtime (seconds)</td> </tr> <tr> <td>dist</td> <td>Parsed distribution family (redundant with <code>distribution</code>)</td> </tr> <tr> <td>dist_seed</td> <td>Parsed distribution seed (redundant with <code>seed</code>)</td> </tr> <tr> <td>inst_id</td> <td>Parsed instance id inside the dist/seed folder</td> </tr> <tr> <td>instance_idx</td> <td>Parsed instance index from instance (auxiliary)</td> </tr> </tbody> </table> </div> </div> <h2>✅ Practical notes</h2> <ul> <li> <p>If <code>lcc_status = NO_FEASIBLE</code>, the requested <code>(x_pct, y_pct)</code> is not reachable for that instance under the model constraints (often because <code>x_pct</code> exceeds practical bounds implied by <code>x_max</code>, or because the makespan limit is too tight).</p> </li> <li> <p><strong>kstar vs changes</strong></p> <ul> <li> <p><code>kstar</code> is the <strong>minimum number of interventions required</strong></p> </li> <li> <p><code>changes</code> is the <strong>actual number of interventions</strong> in the returned solution (expected to match <code>kstar</code> when feasible)</p> </li> </ul> </li> <li> <p>Objectives in the spreadsheet are consistently tracked as <strong>makespan + energy</strong> whenever a solution exists.</p> </li> </ul> |
| format | Recurso digital |
| id | zenodo_https___doi_org_10_5281_zenodo_18380961 |
| institution | Zenodo |
| language | eng |
| publishDate | 2026 |
| publisher | Zenodo |
| record_format | zenodo |
| spellingShingle | Supplementary Dataset and Experimental Artifacts for Counterfactual Recourse Explanation for Sustainable Job-Shop Scheduling with Discrete Speed Scaling Pérez, Christian Salido, Miguel A. Giret, Adriana Scheduling Sustainable OR-Tools Counterfactual Explanation AI <p>This repository accompanies the paper <strong>“</strong>Counterfactual Recourse Explanation for Sustainable Job Shop Scheduling with Discrete Speed Scaling” and provides:</p> <ul> <li> <p>a zipped data package with instances, baseline schedules, and recourse outputs (LCC + rescheduling); and</p> </li> <li> <p>a consolidated spreadsheet with Baseline + LCC + Rescheduling results.</p> </li> </ul> <h2> Erratum / Updated Table 1</h2> <p>During the preparation of this supplementary release, we detected an issue in the script used to generate Table 1 in an earlier draft of the paper. Specifically, the table aggregation incorrectly treated LCC as if it included Phase 2 fields, while in our pipeline, LCC corresponds to Phase 1 only (feasibility + minimal intervention cardinality).</p> <p>We therefore provide below a corrected Table 1, computed from the regenerated artifacts (using LCC = Phase 1 outputs and direct re-optimization = rescheduling outputs), reporting means over solve rate. This updated table is included here to support the ongoing paper revision and facilitate reviewer verification.</p> <table style="width: 85.9168%;"> <thead> <tr> <th style="width: 16.6302%;">Instance</th> <th style="width: 23.3484%;">Method</th> <th style="width: 11.2337%;">kstar</th> <th style="width: 16.7404%;">EC</th> <th style="width: 12.9958%;">MK</th> <th style="width: 19.0532%;">SolveRate</th> </tr> </thead> <tbody> <tr> <td style="width: 16.6302%;">5×5</td> <td style="width: 23.3484%;">re-optimization</td> <td style="width: 11.2337%;">17.97</td> <td style="width: 16.7404%;">1045.55</td> <td style="width: 12.9958%;">374.80</td> <td style="width: 19.0532%;">98.71%</td> </tr> <tr> <td style="width: 16.6302%;">5×5</td> <td style="width: 23.3484%;">LCC</td> <td style="width: 11.2337%;">2.57</td> <td style="width: 16.7404%;">1459.67</td> <td style="width: 12.9958%;">290.99</td> <td style="width: 19.0532%;">100.00%</td> </tr> <tr> <td style="width: 16.6302%;">10×10</td> <td style="width: 23.3484%;">re-optimization</td> <td style="width: 11.2337%;">48.34</td> <td style="width: 16.7404%;">5430.18</td> <td style="width: 12.9958%;">706.32</td> <td style="width: 19.0532%;">98.26%</td> </tr> <tr> <td style="width: 16.6302%;">10×10</td> <td style="width: 23.3484%;">LCC</td> <td style="width: 11.2337%;">9.09</td> <td style="width: 16.7404%;">6255.49</td> <td style="width: 12.9958%;">533.01</td> <td style="width: 19.0532%;">100.00%</td> </tr> <tr> <td style="width: 16.6302%;">15×15</td> <td style="width: 23.3484%;">re-optimization</td> <td style="width: 11.2337%;">62.70</td> <td style="width: 16.7404%;">14240.77</td> <td style="width: 12.9958%;">974.82</td> <td style="width: 19.0532%;">99.55%</td> </tr> <tr> <td style="width: 16.6302%;">15×15</td> <td style="width: 23.3484%;">LCC</td> <td style="width: 11.2337%;">20.64</td> <td style="width: 16.7404%;">14843.51</td> <td style="width: 12.9958%;">750.11</td> <td style="width: 19.0532%;">100.00%</td> </tr> </tbody> </table> <h2> Problem setting (what the data represents)</h2> <p>We consider an <strong>energy-aware Job Shop Scheduling Problem (JSP)</strong> with <strong>discrete speed scaling</strong>:</p> <ul> <li> <p>Each instance has <strong>J</strong> jobs and <strong>M</strong> machines, with <strong>J×M</strong> operations.</p> </li> <li> <p>Each operation can be executed at one of <strong>SPEED</strong> discrete speed modes, which affects:</p> <ul> <li> <p>processing time (duration)</p> </li> <li> <p>energy consumption</p> </li> </ul> </li> </ul> <p>Given a <strong>baseline schedule</strong> with:</p> <ul> <li> <p>baseline makespan <strong>MK0</strong></p> </li> <li> <p>baseline energy <strong>EC0</strong></p> </li> </ul> <p>We define a <strong>recourse query</strong> using two parameters:</p> <ul> <li> <p><strong>x_pct</strong>: required energy saving (e.g., <code>x_pct=10</code> means “save 10% energy”)</p> </li> <li> <p><strong>y_pct</strong>: allowed makespan increase (e.g., <code>y_pct=5</code> means “makespan can increase up to 5%”)</p> </li> </ul> <p>A recourse solution aims to change as few decisions as possible (<strong>sparse intervention</strong>, denoted by <strong>k*</strong> / <code>kstar</code>) while satisfying:</p> <ul> <li> <p><strong>Energy constraint:</strong><br><code>Energy ≤ (1 − x_pct/100) · EC0</code></p> </li> <li> <p><strong>Makespan constraint:</strong><br><code>Makespan ≤ (1 + y_pct/100) · MK0</code></p> </li> </ul> <h3> Pipeline in this release (LCC + Rescheduling)</h3> <ul> <li> <p><strong>LCC:</strong> find a feasible counterfactual and the <strong>minimum intervention cardinality</strong> <code>kstar</code></p> </li> <li> <p><strong>Rescheduling (paired with LCC feasible outputs):</strong> repair/ensure feasibility under the new speeds when needed</p> </li> </ul> <h2> ZIP package: <code>IGJSPInstances.zip</code></h2> <h3> High-level layout</h3> <p>Inside the zip, everything lives under <code>IGJSPInstances/</code> and is organized by <strong>distribution family + distribution seed</strong>:</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>IGJSPInstances/ exponential_0/ exponential_1/ exponential_2/ normal_0/ normal_1/ normal_2/ uniform_0/ uniform_1/ uniform_2/ solutions.pkl </code></div> </div> <p>Each <code><dist>_<seed>/</code> directory contains:</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code><dist>_<seed>/ instances/ solutions/ recourse/ </code></div> </div> <h2> ️ Instances (<code>instances/</code>)</h2> <p>Example filenames:</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>instances/ 5_5-0-3_0.dzn 10_10-0-3_7.dzn 15_15-0-3_3.dzn </code></div> </div> <p>What they contain (MiniZinc <code>.dzn</code>):</p> <ul> <li> <p><code>J, M, SPEED</code></p> </li> <li> <p><code>time[J, M, SPEED]</code> and <code>energy[J, M, SPEED]</code></p> </li> <li> <p>routing/precedence structures needed by the JSP model</p> </li> </ul> <p><strong>Note:</strong> in the provided instances, <code>SPEED=3</code> (three discrete modes). The <code>-0-3</code> token is a generator/config label present in filenames.</p> <h2> Baseline solutions (<code>solutions/</code>)</h2> <p>Organized by size folder (e.g., <code>5-5</code>, <code>10-10</code>, …):</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>solutions/ 5-5/ 5_5_exponential_0_0_cp-sat.json 10-10/ 10_10_exponential_0_7_cp-sat.json </code></div> </div> <p>These JSON files store the <strong>baseline schedule</strong> (e.g., start times and baseline speed choices, depending on the exporter).<br>The spreadsheet provides the computed <strong>MK0</strong> and <strong>EC0</strong> used throughout the experiments.</p> <h2> Recourse outputs (LCC + Rescheduling)</h2> <p>Recourse files are grouped by size folder (<strong>recourse is provided for square sizes only</strong>):</p> <div> <div> <div> <div> </div> </div> </div> <div dir="ltr"><code>recourse/ phase1/ 5-5/ 10-10/ 15-15/ </code></div> </div> <p>Typical naming pattern:</p> <ul> <li> <p><strong>LCC output (legacy token <code>phase1</code>):</strong></p> <ul> <li> <p><code>J_M_<dist>_<distseed>_<instanceid>_x<X>_y<Y>_phase1_cp-sat.json</code></p> </li> </ul> </li> <li> <p><strong>Rescheduling output (paired with LCC feasible cases):</strong></p> <ul> <li> <p><code>J_M_<dist>_<distseed>_<instanceid>_x<X>_y<Y>_phase1_cp-sat_resch.json</code></p> </li> </ul> </li> </ul> <p>Key fields you will commonly see in recourse JSONs:</p> <ul> <li> <p><code>status</code> (e.g., <code>OPTIMAL_SOLUTION</code>, <code>NO_FEASIBLE</code>, …)</p> </li> <li> <p><code>kstar</code> (minimum intervention cardinality)</p> </li> <li> <p><code>changes</code> (actual number of changes in the returned solution; typically equals <code>kstar</code> when feasible)</p> </li> <li> <p><code>solution.delta</code> (binary matrix marking which operations were changed vs. baseline)</p> </li> <li> <p><code>time_s</code> (solver/runtime in seconds)</p> </li> </ul> <h2> What’s inside (coverage at a glance)</h2> <p>From the provided artifacts:</p> <h3>ZIP package</h3> <ul> <li> <p><strong>810 instances</strong> (<code>.dzn</code>) across <strong>9</strong> dist-seed folders and <strong>9</strong> size configurations</p> </li> <li> <p><strong>810 baseline solutions</strong> (<code>*_cp-sat.json</code>)</p> </li> <li> <p>Recourse (LCC + rescheduling) is provided for sizes:</p> <ul> <li> <p><strong>5×5, 10×10, 15×15</strong></p> </li> <li> <p><strong>10 instances each</strong> across all <strong>9</strong> dist-seed folders → <strong>270 recourse-enabled base instances</strong></p> </li> </ul> </li> </ul> <h3>Recourse queries</h3> <ul> <li> <p><code>x_pct ∈ {2, 5, 10, 15, 20}</code></p> </li> <li> <p><code>y_pct ∈ {2, 5, 10, 15, 20}</code></p> </li> <li> <p><strong>25 queries</strong> per base instance → <strong>6,750 total rows</strong> in the spreadsheet</p> </li> </ul> <h3>Feasibility (from the spreadsheet)</h3> <ul> <li> <p><strong>LCC feasible:</strong> <code>3,759 / 6,750 ≈ 55.7%</code></p> </li> <li> <p>For LCC-feasible cases, <strong>Rescheduling is available</strong> (same count: <strong>3,759</strong>)</p> </li> </ul> <h3> Representative explanation certificates</h3> <p>To facilitate reviewer verification, we include a small set of representative explanation certificates extracted from the regenerated resource artifacts. Each table reports one example per intervention cardinality k* for a given instance size (5×5, 10×10, 15×15).</p> <p><strong>Interpretation of the columns</strong></p> <ul> <li> <p><strong>Query (x, y)</strong>: recourse request where x is the required energy saving (%) and y is the allowed makespan increase (%) with respect to the baseline (EC0, MK0).</p> </li> <li> <p><strong>k*</strong>: minimum intervention cardinality returned by LCC (Phase 1), i.e., the smallest number of operations whose discrete speed mode must be changed to satisfy the query.</p> </li> <li> <p><strong>Modified operations (j, t): s0 → s*</strong>: the set of operation-level interventions, indicating for each job j and operation index t the baseline speed s0 and the counterfactual speed s*.</p> </li> <li> <p><strong>Δ EC (%)</strong> and <strong>Δ MK (%)</strong>: relative change in energy and makespan with respect to baseline (negative values indicate improvements vs. baseline).</p> </li> <li> <p><strong>Top-ranked (j, t)</strong>: the operation ranked as most influential under the certificate scoring used in the paper (energy contribution/impact).</p> </li> <li> <p><strong>Cum. energy (top-3)</strong>: cumulative share of energy explained by the top-3 ranked operations (higher values indicate more concentrated explanations).</p> </li> </ul> <table> <thead> <tr> <th>Instance</th> <th>Query (x,y)</th> <th>k*</th> <th>Modified operations (j,t): s0 → s*</th> <th>Δ EC (%)</th> <th>Δ MK (%)</th> <th>Top-ranked (j,t)</th> <th>Cum. energy (top-3)</th> </tr> </thead> <tbody> <tr> <td>5×5</td> <td>(5,2)</td> <td>1</td> <td>(3,2):1→3</td> <td>6,3</td> <td>1,5</td> <td>(3,2)</td> <td>100%</td> </tr> <tr> <td>5×5</td> <td>(10,2)</td> <td>2</td> <td>(1,5):1→3;(2,2):1→3</td> <td>11,0</td> <td>-6,1</td> <td>(1,5)</td> <td>100%</td> </tr> <tr> <td>5×5</td> <td>(15,2)</td> <td>3</td> <td>(3,3):1→2;(1,1):2→3;(5,5):1→3</td> <td>18,1</td> <td>1,9</td> <td>(3,3)</td> <td>100%</td> </tr> <tr> <td>5×5</td> <td>(20,2)</td> <td>4</td> <td>(1,4):1→3;(5,2):1→3;(4,4):1→2;(1,5):1→3</td> <td>21,3</td> <td>-3,1</td> <td>(1,4)</td> <td>76%</td> </tr> <tr> <td>5×5</td> <td>(20,15)</td> <td>5</td> <td>(2,2):1→3;(5,1):1→3;(4,4):1→3;(2,5):1→3;…</td> <td>20,3</td> <td>14,9</td> <td>(2,2)</td> <td>64%</td> </tr> <tr> <td>5×5</td> <td>(20,2)</td> <td>6</td> <td>(2,3):1→3;(3,1):1→3;(1,4):1→3;(5,2):2→3;…</td> <td>20,6</td> <td>1,2</td> <td>(2,3)</td> <td>66%</td> </tr> </tbody> </table> <table> <thead> <tr> <th>Instance</th> <th>Query (x,y)</th> <th>k*</th> <th>Modified operations (j,t): s0 → s*</th> <th>Δ EC (%)</th> <th>Δ MK (%)</th> <th>Top-ranked (j,t)</th> <th>Cum. energy (top-3)</th> </tr> </thead> <tbody> <tr> <td>10×10</td> <td>(2,2)</td> <td>2</td> <td>(9,6):1→3;(6,10):1→3</td> <td>2,7</td> <td>0,2</td> <td>(9,6)</td> <td>100%</td> </tr> <tr> <td>10×10</td> <td>(5,2)</td> <td>4</td> <td>(9,9):1→3;(10,7):1→3;(4,1):1→3;(3,2):1→3</td> <td>5,7</td> <td>-14,4</td> <td>(9,9)</td> <td>80%</td> </tr> <tr> <td>10×10</td> <td>(5,2)</td> <td>5</td> <td>(1,6):1→3;(9,5):1→3;(10,4):1→3;(10,1):2→3;…</td> <td>6,2</td> <td>2,0</td> <td>(1,6)</td> <td>64%</td> </tr> <tr> <td>10×10</td> <td>(10,2)</td> <td>8</td> <td>(1,3):1→3;(9,2):1→3;(4,2):1→3;(8,2):1→3;…</td> <td>10,2</td> <td>1,9</td> <td>(1,3)</td> <td>40%</td> </tr> <tr> <td>10×10</td> <td>(10,2)</td> <td>9</td> <td>(10,8):1→3;(10,7):1→3;(9,9):1→3;(9,2):1→3;…</td> <td>11,0</td> <td>2,0</td> <td>(10,8)</td> <td>36%</td> </tr> <tr> <td>10×10</td> <td>(10,2)</td> <td>10</td> <td>(8,10):1→3;(8,6):1→3;(10,4):1→3;(7,2):1→3;…</td> <td>10,2</td> <td>1,9</td> <td>(8,10)</td> <td>34%</td> </tr> <tr> <td>10×10</td> <td>(15,2)</td> <td>12</td> <td>(1,4):1→3;(4,4):1→3;(7,3):1→3;(1,5):1→3;…</td> <td>15,1</td> <td>1,7</td> <td>(1,4)</td> <td>27%</td> </tr> <tr> <td>10×10</td> <td>(15,2)</td> <td>13</td> <td>(6,3):1→3;(8,5):1→3;(1,9):1→3;(5,10):1→3;…</td> <td>16,0</td> <td>-11,3</td> <td>(6,3)</td> <td>26%</td> </tr> <tr> <td>10×10</td> <td>(15,2)</td> <td>14</td> <td>(7,8):1→3;(9,6):1→3;(1,10):1→3;(8,10):1→3;…</td> <td>15,6</td> <td>1,9</td> <td>(7,8)</td> <td>24%</td> </tr> <tr> <td>10×10</td> <td>(15,20)</td> <td>15</td> <td>(8,6):1→3;(10,4):1→3;(5,4):1→3;(8,10):1→3;…</td> <td>15,4</td> <td>19,9</td> <td>(8,10)</td> <td>23%</td> </tr> <tr> <td>10×10</td> <td>(20,2)</td> <td>16</td> <td>(7,8):1→3;(3,8):1→3;(9,8):1→3;(8,7):1→3;…</td> <td>20,4</td> <td>1,9</td> <td>(7,8)</td> <td>21%</td> </tr> <tr> <td>10×10</td> <td>(20,2)</td> <td>17</td> <td>(6,2):1→3;(2,8):1→3;(2,9):1→3;(1,1):1→3;…</td> <td>20,4</td> <td>2,0</td> <td>(6,2)</td> <td>21%</td> </tr> <tr> <td>10×10</td> <td>(20,2)</td> <td>18</td> <td>(1,3):1→3;(9,2):1→3;(4,2):1→3;(8,2):1→3;…</td> <td>20,7</td> <td>1,8</td> <td>(1,3)</td> <td>20%</td> </tr> <tr> <td>10×10</td> <td>(20,15)</td> <td>19</td> <td>(7,4):1→3;(10,7):1→3;(5,5):1→3;(1,4):1→3;…</td> <td>20,2</td> <td>14,9</td> <td>(7,4)</td> <td>19%</td> </tr> <tr> <td>10×10</td> <td>(20,15)</td> <td>20</td> <td>(8,10):1→3;(8,6):1→3;(10,4):1→3;(5,4):1→3;…</td> <td>20,0</td> <td>14,6</td> <td>(8,10)</td> <td>17%</td> </tr> </tbody> </table> <table> <thead> <tr> <th>Instance</th> <th>Query (x,y)</th> <th>k*</th> <th>Modified operations (j,t): s0 → s*</th> <th>Δ EC (%)</th> <th>Δ MK (%)</th> <th>Top-ranked (j,t)</th> <th>Cum. energy (top-3)</th> </tr> </thead> <tbody> <tr> <td>15×15</td> <td>(2,2)</td> <td>4</td> <td>(12,10):1→3;(14,14):1→3;(11,1):1→3;(13,11):1→3</td> <td>2,3</td> <td>-25,3</td> <td>(12,10)</td> <td>79%</td> </tr> <tr> <td>15×15</td> <td>(5,2)</td> <td>9</td> <td>(11,4):1→3;(14,8):1→3;(15,5):1→3;(12,2):1→3;…</td> <td>5,1</td> <td>-2,8</td> <td>(11,4)</td> <td>35%</td> </tr> <tr> <td>15×15</td> <td>(5,2)</td> <td>10</td> <td>(15,5):2→3;(15,14):1→3;(15,4):1→3;(15,7):1→3;…</td> <td>5,3</td> <td>2,0</td> <td>(15,5)</td> <td>31%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>18</td> <td>(13,4):1→3;(1,13):1→3;(7,8):1→3;(1,11):1→3;…</td> <td>10,1</td> <td>2,0</td> <td>(13,4)</td> <td>18%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>19</td> <td>(13,12):1→3;(15,6):1→3;(15,12):1→3;(8,13):1→3;…</td> <td>10,3</td> <td>2,0</td> <td>(13,12)</td> <td>17%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>20</td> <td>(9,3):1→3;(6,11):1→3;(12,14):1→3;(8,1):1→3;…</td> <td>10,4</td> <td>0,8</td> <td>(9,3)</td> <td>16%</td> </tr> <tr> <td>15×15</td> <td>(10,2)</td> <td>21</td> <td>(7,6):1→3;(5,11):1→3;(11,1):1→3;(11,12):1→3;…</td> <td>10,4</td> <td>1,9</td> <td>(7,6)</td> <td>15%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>28</td> <td>(13,4):1→3;(1,13):1→3;(7,8):1→3;(1,11):1→3;…</td> <td>15,0</td> <td>2,0</td> <td>(13,4)</td> <td>12%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>29</td> <td>(11,14):1→3;(6,11):1→3;(14,6):1→3;(11,5):1→3;…</td> <td>15,2</td> <td>1,9</td> <td>(11,14)</td> <td>12%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>30</td> <td>(7,8):1→3;(12,13):1→3;(14,10):1→3;(7,11):1→3;…</td> <td>15,0</td> <td>-9,9</td> <td>(7,8)</td> <td>11%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>31</td> <td>(10,12):1→3;(6,9):1→3;(3,6):1→3;(7,5):1→3;…</td> <td>15,3</td> <td>2,0</td> <td>(10,12)</td> <td>11%</td> </tr> <tr> <td>15×15</td> <td>(15,2)</td> <td>32</td> <td>(2,11):1→3;(4,10):1→3;(7,6):1→3;(5,11):1→3;…</td> <td>15,2</td> <td>1,9</td> <td>(2,11)</td> <td>11%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>39</td> <td>(15,11):1→3;(13,11):1→3;(5,1):1→3;(12,13):1→3;…</td> <td>20,1</td> <td>1,9</td> <td>(15,11)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>40</td> <td>(11,14):1→3;(6,11):1→3;(14,6):1→3;(11,5):1→3;…</td> <td>20,2</td> <td>1,8</td> <td>(11,14)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>41</td> <td>(3,13):1→3;(2,14):1→3;(7,5):1→3;(8,3):1→3;…</td> <td>20,4</td> <td>2,0</td> <td>(3,13)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>42</td> <td>(1,6):1→3;(6,12):1→3;(1,11):1→3;(13,15):1→3;…</td> <td>20,4</td> <td>1,8</td> <td>(1,6)</td> <td>9%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>43</td> <td>(10,12):1→3;(6,9):1→3;(3,6):1→3;(7,5):1→3;…</td> <td>20,3</td> <td>2,0</td> <td>(10,12)</td> <td>8%</td> </tr> <tr> <td>15×15</td> <td>(20,2)</td> <td>44</td> <td>(2,11):1→3;(4,10):1→3;(7,6):1→3;(5,11):1→3;…</td> <td>20,2</td> <td>1,9</td> <td>(2,11)</td> <td>8%</td> </tr> </tbody> </table> <h2> Spreadsheet: <code>data.xlsx</code></h2> <p><strong>Sheet:</strong> <code>Worksheet</code></p> <p>This file merges, per <code>(instance, x_pct, y_pct)</code>, the baseline metrics and the outputs of <strong>LCC / Rescheduling</strong>.</p> <h3> Quick interpretation of the main column groups</h3> <h4>Identifiers</h4> <ul> <li> <p><code>conf_key</code>: base instance ID in the form <code>J_M_dist_distSeed_instanceId</code></p> </li> <li> <p><code>instance</code>: query id in the form <code>..._xX_yY</code></p> </li> <li> <p><code>distribution, seed, numJobs, numMachines, speed_levels, conf_folder, exp_dir</code></p> </li> </ul> <h4>Baseline</h4> <ul> <li> <p><code>MK0</code>: baseline makespan</p> </li> <li> <p><code>EC0</code>: baseline energy</p> </li> <li> <p><code>baseline_objective</code>: <code>MK0 + EC0</code></p> </li> <li> <p><code>EC_min</code>: lower bound obtained by choosing per-operation minimal-energy speed (reference)</p> </li> <li> <p><code>x_max</code>: max achievable energy saving bound derived from <code>EC_min</code> vs. <code>EC0</code></p> </li> </ul> <h4>LCC (paper Phase 1)</h4> <ul> <li> <p><code>lcc_status, lcc_kstar, lcc_changes</code></p> </li> <li> <p><code>lcc_makespan, lcc_energy</code></p> </li> <li> <p><code>lcc_phase1_objective</code> (objective value when LCC is feasible)</p> </li> <li> <p><code>lcc_time_s</code></p> </li> </ul> <h4>Rescheduling (paired with LCC feasible cases)</h4> <ul> <li> <p><code>resch_status, resch_changes</code></p> </li> <li> <p><code>resch_makespan, resch_energy</code></p> </li> <li> <p><code>resch_phase1_objective</code></p> </li> <li> <p><code>resch_time_s</code></p> </li> </ul> <h2> Full column dictionary (LCC release)</h2> <div> <div> <table> <thead> <tr> <th>Column</th> <th>Meaning</th> </tr> </thead> <tbody> <tr> <td>conf_key</td> <td>Base instance key: <code>J_M_distribution_distSeed_instanceId</code></td> </tr> <tr> <td>exp_dir</td> <td>Folder name used in the zip (e.g., <code>exponential_0</code>)</td> </tr> <tr> <td>conf_folder</td> <td>Size folder used in results (e.g., <code>5-5</code>, <code>10-10</code>, <code>15-15</code>)</td> </tr> <tr> <td>instance</td> <td>Query key including the recourse parameters: <code>..._xX_yY</code></td> </tr> <tr> <td>distribution</td> <td>Distribution family (<code>uniform</code>, <code>normal</code>, <code>exponential</code>)</td> </tr> <tr> <td>seed</td> <td>Distribution seed (<code>0, 1, 2</code>)</td> </tr> <tr> <td>numJobs</td> <td><code>J</code></td> </tr> <tr> <td>numMachines</td> <td><code>M</code></td> </tr> <tr> <td>speed_levels</td> <td>Number of speed modes (<code>SPEED</code>)</td> </tr> <tr> <td>x_pct</td> <td>Target energy saving (%)</td> </tr> <tr> <td>y_pct</td> <td>Allowed makespan increase (%)</td> </tr> <tr> <td>MK0</td> <td>Baseline makespan</td> </tr> <tr> <td>EC0</td> <td>Baseline energy</td> </tr> <tr> <td>baseline_objective</td> <td><code>MK0 + EC0</code></td> </tr> <tr> <td>EC_min</td> <td>Per-operation minimum-energy bound (reference)</td> </tr> <tr> <td>x_max</td> <td>Bound on maximum achievable energy saving vs. baseline</td> </tr> <tr> <td>lcc_status</td> <td>LCC solve status</td> </tr> <tr> <td>lcc_kstar</td> <td>Minimum intervention cardinality found by LCC</td> </tr> <tr> <td>lcc_changes</td> <td>Number of changes in the LCC solution</td> </tr> <tr> <td>lcc_phase1_objective</td> <td>Objective for LCC solution (when feasible)</td> </tr> <tr> <td>lcc_makespan</td> <td>Makespan of LCC solution</td> </tr> <tr> <td>lcc_energy</td> <td>Energy of LCC solution</td> </tr> <tr> <td>lcc_time_s</td> <td>LCC runtime (seconds)</td> </tr> <tr> <td>resch_status</td> <td>Rescheduling solve status</td> </tr> <tr> <td>resch_changes</td> <td>Number of changes after rescheduling</td> </tr> <tr> <td>resch_phase1_objective</td> <td>Objective after rescheduling</td> </tr> <tr> <td>resch_makespan</td> <td>Makespan after rescheduling</td> </tr> <tr> <td>resch_energy</td> <td>Energy after rescheduling</td> </tr> <tr> <td>resch_time_s</td> <td>Rescheduling runtime (seconds)</td> </tr> <tr> <td>dist</td> <td>Parsed distribution family (redundant with <code>distribution</code>)</td> </tr> <tr> <td>dist_seed</td> <td>Parsed distribution seed (redundant with <code>seed</code>)</td> </tr> <tr> <td>inst_id</td> <td>Parsed instance id inside the dist/seed folder</td> </tr> <tr> <td>instance_idx</td> <td>Parsed instance index from instance (auxiliary)</td> </tr> </tbody> </table> </div> </div> <h2>✅ Practical notes</h2> <ul> <li> <p>If <code>lcc_status = NO_FEASIBLE</code>, the requested <code>(x_pct, y_pct)</code> is not reachable for that instance under the model constraints (often because <code>x_pct</code> exceeds practical bounds implied by <code>x_max</code>, or because the makespan limit is too tight).</p> </li> <li> <p><strong>kstar vs changes</strong></p> <ul> <li> <p><code>kstar</code> is the <strong>minimum number of interventions required</strong></p> </li> <li> <p><code>changes</code> is the <strong>actual number of interventions</strong> in the returned solution (expected to match <code>kstar</code> when feasible)</p> </li> </ul> </li> <li> <p>Objectives in the spreadsheet are consistently tracked as <strong>makespan + energy</strong> whenever a solution exists.</p> </li> </ul> |
| title | Supplementary Dataset and Experimental Artifacts for Counterfactual Recourse Explanation for Sustainable Job-Shop Scheduling with Discrete Speed Scaling |
| topic | Scheduling Sustainable OR-Tools Counterfactual Explanation AI |
| url | https://doi.org/10.5281/zenodo.18380961 |