Modeling with Material/Operating Modes#
The follow example follows ‘Multiscale MILP’ and ‘Material and Emission Streams’
From ‘Multiscale MILP’#
Solar and Wind consumption is kept unbounded to refrain from adding unnecessary constraints
# !pip install energiapy # uncomment and run to install Energia, if not in environment
from energia import *
m = Model("design_scheduling")
m.scales = TemporalScales([1, 4], ["y", "q"])
m.usd = Currency()
m.gwp = Environ()
m.declare(Resource, ["power", "wind", "solar"])
m.solar.consume == True
m.wind.consume == True
m.power.release.prep(180) >= [0.6, 0.7, 0.8, 0.3]
⚖ Initiated solar balance in (l0, y) ⏱ 0.0001 s
⚖ Initiated wind balance in (l0, y) ⏱ 0.0001 s
⚖ Initiated power balance in (l0, q) ⏱ 0.0001 s
🔗 Bound [≥] power release in (l0, q) ⏱ 0.0007 s
Materials and Impact of Consumption#
Materials are declared and the Global Warming Potential arising from their consumption is set
m.declare(
Material,
[
"lir",
"lib",
"steel",
"concrete",
"glass",
"si_mono",
"si_poly",
],
)
m.usd.spend(m.steel.consume) == 670
m.gwp.emit(m.steel.consume) == 2121.152427
m.gwp.emit(m.lir.consume) == 9600
m.gwp.emit(m.lib.consume) == 2800
m.gwp.emit(m.concrete.consume) == 120.0378
m.gwp.emit(m.glass.consume) == 1118.5
m.gwp.emit(m.si_mono.consume) == 122239.1
m.gwp.emit(m.si_poly.consume) == 98646.7
⚖ Initiated steel balance in (l0, y) ⏱ 0.0001 s
🔗 Bound [=] usd spend in (l0, y) ⏱ 0.0002 s
🔗 Bound [=] gwp emit in (l0, y) ⏱ 0.0002 s
⚖ Initiated lir balance in (l0, y) ⏱ 0.0001 s
🔗 Bound [=] gwp emit in (l0, y) ⏱ 0.0002 s
⚖ Initiated lib balance in (l0, y) ⏱ 0.0001 s
🔗 Bound [=] gwp emit in (l0, y) ⏱ 0.0003 s
⚖ Initiated concrete balance in (l0, y) ⏱ 0.0001 s
🔗 Bound [=] gwp emit in (l0, y) ⏱ 0.0003 s
⚖ Initiated glass balance in (l0, y) ⏱ 0.0001 s
🔗 Bound [=] gwp emit in (l0, y) ⏱ 0.0003 s
⚖ Initiated si_mono balance in (l0, y) ⏱ 0.0002 s
🔗 Bound [=] gwp emit in (l0, y) ⏱ 0.0003 s
⚖ Initiated si_poly balance in (l0, y) ⏱ 0.0001 s
🔗 Bound [=] gwp emit in (l0, y) ⏱ 0.0003 s
Processes and Material Requirements#
Let us consider the windfarm (WF) process
m.wf = Process()
m.wf.capacity.x <= 100
m.wf.capacity.x >= 10
m.wf.operate.prep(norm=True) <= [0.9, 0.8, 0.5, 0.7]
🔗 Bound [≤] wf capacity in (l0, y) ⏱ 0.0003 s
🔗 Bound [≥] wf capacity in (l0, y) ⏱ 0.0002 s
🔗 Bound [≤] wf operate in (l0, q) ⏱ 0.0003 s
Material Modes#
These represent a ‘recipe’ of constructing a process on a per unit basis
m.wf.construction == [
-109.9 * m.steel - 398.7 * m.concrete,
-249.605 * m.steel - 12.4 * m.concrete,
]
η_PWL(wf, _y0)
For example, the above equation, generates two material modes This indicates two discrete options for building a WF:
Use -109.9 steel + 398.7 concrete
Use -249.605 steel + 12.4 concrete
All units are of the form:
\(\frac{\text{Unit of Material}}{\text{Unit of basis Resource of Process}}\)
Modes Generation#
Modes are generated internally and can be accessed using the naming scheme is “_ + name of period set + nth of mode of period set”. It is easier to access them from the Conversion for which they were made.
m.wf.construction.modes
_y0
Referring to Modes#
Other parameters can now be provided such that it corresponds to the modes generated for ‘construction’ In the example below, the efficiency of WF depends on the Material Mode adopted:
m.wf(m.power) == {
m.wf.construction.modes[0]: -2.857 * m.wind,
m.wf.construction.modes[1]: -2.3255 * m.wind,
}
η_PWL(wf, _y0)
The material modes are also set on the Model and can be accessed directly for more complex interactions.
The statement below, provides costing as a function of the choice of Modes.
m.usd.spend(m.wf.capacity, m.wf.construction.modes) == [
1292000 + 29200,
3192734 + 101498,
]
m.usd.show(True)
🧭 Mapped modes for spend (usd, l0, y, capacity, wf, _y0) ⟺ (usd, l0, y, capacity, wf) ⏱ 0.0004 s
🧭 Mapped modes for capacity (wf, l0, y, _y0) ⟺ (wf, l0, y) ⏱ 0.0002 s
🔗 Bound [=] usd spend in (l0, y) ⏱ 0.0021 s
Nevertheless, it is not compulsory to map all parameters individually to Modes.
m.usd.spend(m.wf.operate) == 49
m.operate.show()
🧭 Mapped time for operate (wf, l0, q) ⟺ (wf, l0, y) ⏱ 0.0002 s
🔗 Bound [=] usd spend in (l0, y) ⏱ 0.0004 s
Note that the Streams resulting from both construction and production will be added once the process is located later.
m.pv = Process()
m.pv.construction == [-70 * m.glass - 7 * m.si_mono, -70 * m.glass - 7 * m.si_poly]
m.pv(m.power) == {
m.pv.construction.modes[0]: -5 * m.solar,
m.pv.construction.modes[1]: -6.67 * m.solar,
}
m.pv.capacity.x <= 100
m.pv.capacity.x >= 10
m.pv.operate.prep(norm=True) <= [0.6, 0.8, 0.9, 0.7]
m.usd.spend(m.pv.capacity) == 567000 + 872046
m.usd.spend(m.pv.operate) == 90000
🔗 Bound [≤] pv capacity in (l0, y) ⏱ 0.0004 s
🔗 Bound [≥] pv capacity in (l0, y) ⏱ 0.0002 s
🔗 Bound [≤] pv operate in (l0, q) ⏱ 0.0004 s
🔗 Bound [=] usd spend in (l0, y) ⏱ 0.0004 s
🧭 Mapped time for operate (pv, l0, q) ⟺ (pv, l0, y) ⏱ 0.0003 s
🔗 Bound [=] usd spend in (l0, y) ⏱ 0.0004 s
Remaining Operations#
Storages can have Material requirements as well. Note that unless explicitly assigned to Charging or Discharging Processes, all values assigned to Storages scale with the inventory capacity (invcapacity)
m.lii = Storage()
m.lii(m.power) == 0.9
m.lii.construction == [
-0.137 * m.lib - 1.165 * m.steel,
-0.137 * m.lir - 1.165 * m.steel,
]
m.lii.capacity.x <= 100
m.lii.capacity.x >= 10
m.usd.spend(m.lii.capacity) == 1302182 + 41432
m.usd.spend(m.lii.inventory) == 2000
🔗 Bound [≤] lii.stored invcapacity in (l0, y) ⏱ 0.0003 s
🔗 Bound [≥] lii.stored invcapacity in (l0, y) ⏱ 0.0002 s
🔗 Bound [=] usd spend in (l0, y) ⏱ 0.0004 s
🔗 Bound [=] usd spend in (l0, y) ⏱ 0.0004 s
Constraints Generated#
Lets take a gander at the mode-based constraints generated
m.wf.construction.modes.show()
Locate and Optimize!#
The model first optimizes for cost and them for emissions (both minimization).
m.network.locate(m.wf, m.pv, m.lii)
m.usd.spend.opt()
m.gwp.emit.opt()
💡 Assumed wf capacity unbounded in (l0, y) ⏱ 0.0001 s
💡 Assumed wf operate bounded by capacity in (l0, q) ⏱ 0.0001 s
⚖ Updated power balance with produce(power, l0, q, operate, wf) ⏱ 0.0001 s
🧭 Mapped modes for produce (power, l0, q, operate, wf, _y0[0]) ⟺ (power, l0, q, operate, wf) ⏱ 0.0008 s
🧭 Mapped time for operate (wf, l0, q, _y0[0]) ⟺ (wf, l0, y, _y0[0]) ⏱ 0.0002 s
🧭 Mapped modes for operate (wf, l0, y, _y0[0]) ⟺ (wf, l0, y) ⏱ 0.0019 s
🧭 Mapped time for operate (wf, l0, q, _y0[0]) ⟺ (wf, l0, y, _y0[0]) ⏱ 0.0035 s
🧭 Mapped modes for operate (wf, l0, q, _y0[0]) ⟺ (wf, l0, q) ⏱ 0.0001 s
🔗 Bound [=] power produce in (l0, q) ⏱ 0.0060 s
⚖ Updated wind balance with expend(wind, l0, y, operate, wf) ⏱ 0.0001 s
🧭 Mapped modes for expend (wind, l0, y, operate, wf, _y0[0]) ⟺ (wind, l0, y, operate, wf) ⏱ 0.0006 s
🔗 Bound [=] wind expend in (l0, y) ⏱ 0.0012 s
🧭 Mapped modes for produce (power, l0, q, operate, wf, _y0[1]) ⟺ (power, l0, q, operate, wf) ⏱ 0.0002 s
🧭 Mapped time for operate (wf, l0, q, _y0[1]) ⟺ (wf, l0, y, _y0[1]) ⏱ 0.0002 s
🧭 Mapped modes for operate (wf, l0, y, _y0[1]) ⟺ (wf, l0, y) ⏱ 0.0001 s
🧭 Mapped time for operate (wf, l0, q, _y0[1]) ⟺ (wf, l0, y, _y0[1]) ⏱ 0.0012 s
🧭 Mapped modes for operate (wf, l0, q, _y0[1]) ⟺ (wf, l0, q) ⏱ 0.0002 s
🔗 Bound [=] power produce in (l0, q) ⏱ 0.0032 s
🧭 Mapped modes for expend (wind, l0, y, operate, wf, _y0[1]) ⟺ (wind, l0, y, operate, wf) ⏱ 0.0001 s
🔗 Bound [=] wind expend in (l0, y) ⏱ 0.0009 s
🏭 Operating streams introduced for wf in l0 ⏱ 0.0129 s
⚖ Updated steel balance with use(steel, l0, y, capacity, wf) ⏱ 0.0001 s
🧭 Mapped modes for use (steel, l0, y, capacity, wf, _y0[0]) ⟺ (steel, l0, y, capacity, wf) ⏱ 0.0007 s
🔗 Bound [=] steel use in (l0, y) ⏱ 0.0017 s
⚖ Updated concrete balance with use(concrete, l0, y, capacity, wf) ⏱ 0.0001 s
🧭 Mapped modes for use (concrete, l0, y, capacity, wf, _y0[0]) ⟺ (concrete, l0, y, capacity, wf) ⏱ 0.0007 s
🔗 Bound [=] concrete use in (l0, y) ⏱ 0.0015 s
🧭 Mapped modes for use (steel, l0, y, capacity, wf, _y0[1]) ⟺ (steel, l0, y, capacity, wf) ⏱ 0.0001 s
🔗 Bound [=] steel use in (l0, y) ⏱ 0.0011 s
🧭 Mapped modes for use (concrete, l0, y, capacity, wf, _y0[1]) ⟺ (concrete, l0, y, capacity, wf) ⏱ 0.0001 s
🔗 Bound [=] concrete use in (l0, y) ⏱ 0.0010 s
🏗 Construction streams introduced for wf in l0 ⏱ 0.0066 s
🌍 Located wf in l0 ⏱ 0.0213 s
💡 Assumed pv capacity unbounded in (l0, y) ⏱ 0.0001 s
💡 Assumed pv operate bounded by capacity in (l0, q) ⏱ 0.0001 s
⚖ Updated power balance with produce(power, l0, q, operate, pv) ⏱ 0.0001 s
🧭 Mapped modes for produce (power, l0, q, operate, pv, _y1[0]) ⟺ (power, l0, q, operate, pv) ⏱ 0.0007 s
🧭 Mapped time for operate (pv, l0, q, _y1[0]) ⟺ (pv, l0, y, _y1[0]) ⏱ 0.0002 s
🧭 Mapped modes for operate (pv, l0, y, _y1[0]) ⟺ (pv, l0, y) ⏱ 0.0001 s
🧭 Mapped time for operate (pv, l0, q, _y1[0]) ⟺ (pv, l0, y, _y1[0]) ⏱ 0.0011 s
🧭 Mapped modes for operate (pv, l0, q, _y1[0]) ⟺ (pv, l0, q) ⏱ 0.0002 s
🔗 Bound [=] power produce in (l0, q) ⏱ 0.0034 s
⚖ Updated solar balance with expend(solar, l0, y, operate, pv) ⏱ 0.0001 s
🧭 Mapped modes for expend (solar, l0, y, operate, pv, _y1[0]) ⟺ (solar, l0, y, operate, pv) ⏱ 0.0007 s
🔗 Bound [=] solar expend in (l0, y) ⏱ 0.0014 s
🧭 Mapped modes for produce (power, l0, q, operate, pv, _y1[1]) ⟺ (power, l0, q, operate, pv) ⏱ 0.0002 s
🧭 Mapped time for operate (pv, l0, q, _y1[1]) ⟺ (pv, l0, y, _y1[1]) ⏱ 0.0002 s
🧭 Mapped modes for operate (pv, l0, y, _y1[1]) ⟺ (pv, l0, y) ⏱ 0.0001 s
🧭 Mapped time for operate (pv, l0, q, _y1[1]) ⟺ (pv, l0, y, _y1[1]) ⏱ 0.0016 s
🧭 Mapped modes for operate (pv, l0, q, _y1[1]) ⟺ (pv, l0, q) ⏱ 0.0002 s
🔗 Bound [=] power produce in (l0, q) ⏱ 0.0037 s
🧭 Mapped modes for expend (solar, l0, y, operate, pv, _y1[1]) ⟺ (solar, l0, y, operate, pv) ⏱ 0.0001 s
🔗 Bound [=] solar expend in (l0, y) ⏱ 0.0010 s
🏭 Operating streams introduced for pv in l0 ⏱ 0.0110 s
⚖ Updated glass balance with use(glass, l0, y, capacity, pv) ⏱ 0.0001 s
🧭 Mapped modes for use (glass, l0, y, capacity, pv, _y1[0]) ⟺ (glass, l0, y, capacity, pv) ⏱ 0.0008 s
🧭 Mapped modes for capacity (pv, l0, y, _y1[0]) ⟺ (pv, l0, y) ⏱ 0.0001 s
🔗 Bound [=] glass use in (l0, y) ⏱ 0.0024 s
⚖ Updated si_mono balance with use(si_mono, l0, y, capacity, pv) ⏱ 0.0001 s
🧭 Mapped modes for use (si_mono, l0, y, capacity, pv, _y1[0]) ⟺ (si_mono, l0, y, capacity, pv) ⏱ 0.0008 s
🔗 Bound [=] si_mono use in (l0, y) ⏱ 0.0015 s
🧭 Mapped modes for use (glass, l0, y, capacity, pv, _y1[1]) ⟺ (glass, l0, y, capacity, pv) ⏱ 0.0001 s
🧭 Mapped modes for capacity (pv, l0, y, _y1[1]) ⟺ (pv, l0, y) ⏱ 0.0001 s
🔗 Bound [=] glass use in (l0, y) ⏱ 0.0017 s
⚖ Updated si_poly balance with use(si_poly, l0, y, capacity, pv) ⏱ 0.0001 s
🧭 Mapped modes for use (si_poly, l0, y, capacity, pv, _y1[1]) ⟺ (si_poly, l0, y, capacity, pv) ⏱ 0.0009 s
🔗 Bound [=] si_poly use in (l0, y) ⏱ 0.0018 s
🏗 Construction streams introduced for pv in l0 ⏱ 0.0090 s
🌍 Located pv in l0 ⏱ 0.0212 s
💡 Assumed lii capacity unbounded in (l0, y) ⏱ 0.0001 s
🧭 Mapped time for inventory (lii.stored, l0, q) ⟺ (lii.stored, l0, y) ⏱ 0.0002 s
⚖ Initiated lii.stored balance in (l0, q) ⏱ 0.0003 s
🔗 Bound [≤] lii.stored inventory in (l0, q) ⏱ 0.0015 s
💡 Assumed lii inventory bounded by capacity in (l0, q) ⏱ 0.0018 s
💡 Assumed lii.charge capacity unbounded in (l0, y) ⏱ 0.0004 s
🔗 Bound [≤] lii.charge operate in (l0, y) ⏱ 0.0004 s
💡 Assumed lii.charge operate bounded by capacity in (l0, y) ⏱ 0.0007 s
🧭 Mapped time for operate (lii.charge, l0, q) ⟺ (lii.charge, l0, y) ⏱ 0.0001 s
⚖ Updated lii.stored balance with produce(lii.stored, l0, q, operate, lii.charge) ⏱ 0.0001 s
🔗 Bound [=] lii.stored produce in (l0, q) ⏱ 0.0009 s
⚖ Updated power balance with expend(power, l0, q, operate, lii.charge) ⏱ 0.0001 s
🔗 Bound [=] power expend in (l0, q) ⏱ 0.0009 s
🏭 Operating streams introduced for lii.charge in l0 ⏱ 0.0032 s
🏗 Construction streams introduced for lii.charge in l0 ⏱ 0.0000 s
🌍 Located lii.charge in l0 ⏱ 0.0052 s
💡 Assumed lii.discharge capacity unbounded in (l0, y) ⏱ 0.0004 s
🔗 Bound [≤] lii.discharge operate in (l0, y) ⏱ 0.0005 s
💡 Assumed lii.discharge operate bounded by capacity in (l0, y) ⏱ 0.0008 s
🧭 Mapped time for operate (lii.discharge, l0, q) ⟺ (lii.discharge, l0, y) ⏱ 0.0003 s
⚖ Updated power balance with produce(power, l0, q, operate, lii.discharge) ⏱ 0.0001 s
🔗 Bound [=] power produce in (l0, q) ⏱ 0.0009 s
⚖ Updated lii.stored balance with expend(lii.stored, l0, q, operate, lii.discharge) ⏱ 0.0001 s
🔗 Bound [=] lii.stored expend in (l0, q) ⏱ 0.0012 s
🏭 Operating streams introduced for lii.discharge in l0 ⏱ 0.0037 s
🏗 Construction streams introduced for lii.discharge in l0 ⏱ 0.0000 s
🌍 Located lii.discharge in l0 ⏱ 0.0058 s
⚖ Updated lib balance with use(lib, l0, y, invcapacity, lii.stored) ⏱ 0.0001 s
🧭 Mapped modes for use (lib, l0, y, invcapacity, lii.stored, _y2[0]) ⟺ (lib, l0, y, invcapacity, lii.stored) ⏱ 0.0009 s
🧭 Mapped modes for invcapacity (lii.stored, l0, y, _y2[0]) ⟺ (lii.stored, l0, y) ⏱ 0.0001 s
🔗 Bound [=] lib use in (l0, y) ⏱ 0.0025 s
⚖ Updated steel balance with use(steel, l0, y, invcapacity, lii.stored) ⏱ 0.0001 s
🧭 Mapped modes for use (steel, l0, y, invcapacity, lii.stored, _y2[0]) ⟺ (steel, l0, y, invcapacity, lii.stored) ⏱ 0.0009 s
🔗 Bound [=] steel use in (l0, y) ⏱ 0.0021 s
⚖ Updated lir balance with use(lir, l0, y, invcapacity, lii.stored) ⏱ 0.0001 s
🧭 Mapped modes for use (lir, l0, y, invcapacity, lii.stored, _y2[1]) ⟺ (lir, l0, y, invcapacity, lii.stored) ⏱ 0.0010 s
🧭 Mapped modes for invcapacity (lii.stored, l0, y, _y2[1]) ⟺ (lii.stored, l0, y) ⏱ 0.0001 s
🔗 Bound [=] lir use in (l0, y) ⏱ 0.0028 s
🧭 Mapped modes for use (steel, l0, y, invcapacity, lii.stored, _y2[1]) ⟺ (steel, l0, y, invcapacity, lii.stored) ⏱ 0.0001 s
🔗 Bound [=] steel use in (l0, y) ⏱ 0.0012 s
🏗 Construction streams introduced for lii in l0 ⏱ 0.0101 s
🌍 Located lii in l0 ⏱ 0.0241 s
🧭 Mapped samples for spend (usd, l0, y, consume, steel) ⟺ (usd, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for spend (usd, l0, y, capacity, wf) ⟺ (usd, l0, y) ⏱ 0.0002 s
🧭 Mapped samples for spend (usd, l0, y, operate, wf) ⟺ (usd, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for spend (usd, l0, y, capacity, pv) ⟺ (usd, l0, y) ⏱ 0.0002 s
🧭 Mapped samples for spend (usd, l0, y, operate, pv) ⟺ (usd, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for spend (usd, l0, y, invcapacity, lii.stored) ⟺ (usd, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for spend (usd, l0, y, inventory, lii.stored) ⟺ (usd, l0, y) ⏱ 0.0002 s
📝 Generated Program(design_scheduling).mps ⏱ 0.0062 s
Set parameter Username
Academic license - for non-commercial use only - expires 2026-08-01
Read MPS format model from file Program(design_scheduling).mps
Reading time = 0.00 seconds
PROGRAM(DESIGN_SCHEDULING): 146 rows, 155 columns, 369 nonzeros
📝 Generated gurobipy model. See .formulation ⏱ 0.0101 s
Gurobi Optimizer version 12.0.3 build v12.0.3rc0 (win64 - Windows 11.0 (26100.2))
CPU model: 13th Gen Intel(R) Core(TM) i7-13700, instruction set [SSE2|AVX|AVX2]
Thread count: 16 physical cores, 24 logical processors, using up to 24 threads
Optimize a model with 146 rows, 155 columns and 369 nonzeros
Model fingerprint: 0x0e5433e1
Variable types: 152 continuous, 3 integer (3 binary)
Coefficient statistics:
Matrix range [1e-01, 3e+06]
Objective range [1e+00, 1e+00]
Bounds range [1e+00, 1e+00]
RHS range [7e+01, 2e+02]
Presolve removed 135 rows and 144 columns
Presolve time: 0.00s
Presolved: 11 rows, 11 columns, 32 nonzeros
Variable types: 11 continuous, 0 integer (0 binary)
Root relaxation: objective 3.374395e+08, 10 iterations, 0.00 seconds (0.00 work units)
Nodes | Current Node | Objective Bounds | Work
Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time
* 0 0 0 3.374395e+08 3.3744e+08 0.00% - 0s
Explored 1 nodes (10 simplex iterations) in 0.01 seconds (0.00 work units)
Thread count was 24 (of 24 available processors)
Solution count 1: 3.3744e+08
Optimal solution found (tolerance 1.00e-04)
Best objective 3.374395259804e+08, best bound 3.374395259804e+08, gap 0.0000%
📝 Generated Solution object for Program(design_scheduling). See .solution ⏱ 0.0009 s
✅ Program(design_scheduling) optimized using gurobi. Display using .output() ⏱ 0.0213 s
🧭 Mapped samples for emit (gwp, l0, y, consume, steel) ⟺ (gwp, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for emit (gwp, l0, y, consume, lir) ⟺ (gwp, l0, y) ⏱ 0.0002 s
🧭 Mapped samples for emit (gwp, l0, y, consume, lib) ⟺ (gwp, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for emit (gwp, l0, y, consume, concrete) ⟺ (gwp, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for emit (gwp, l0, y, consume, glass) ⟺ (gwp, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for emit (gwp, l0, y, consume, si_mono) ⟺ (gwp, l0, y) ⏱ 0.0001 s
🧭 Mapped samples for emit (gwp, l0, y, consume, si_poly) ⟺ (gwp, l0, y) ⏱ 0.0001 s
📝 Generated Program(design_scheduling).mps ⏱ 0.0058 s
Warning: row name O0 in column section at line 528 not defined.
Read MPS format model from file Program(design_scheduling).mps
Reading time = 0.00 seconds
PROGRAM(DESIGN_SCHEDULING): 147 rows, 156 columns, 377 nonzeros
📝 Generated gurobipy model. See .formulation ⏱ 0.0079 s
Gurobi Optimizer version 12.0.3 build v12.0.3rc0 (win64 - Windows 11.0 (26100.2))
CPU model: 13th Gen Intel(R) Core(TM) i7-13700, instruction set [SSE2|AVX|AVX2]
Thread count: 16 physical cores, 24 logical processors, using up to 24 threads
Optimize a model with 147 rows, 156 columns and 377 nonzeros
Model fingerprint: 0xc4ffb22f
Variable types: 153 continuous, 3 integer (3 binary)
Coefficient statistics:
Matrix range [1e-01, 3e+06]
Objective range [1e+00, 1e+00]
Bounds range [1e+00, 1e+00]
RHS range [7e+01, 2e+02]
Presolve removed 142 rows and 150 columns
Presolve time: 0.00s
Presolved: 5 rows, 6 columns, 18 nonzeros
Variable types: 6 continuous, 0 integer (0 binary)
Root relaxation: objective 9.794116e+07, 2 iterations, 0.00 seconds (0.00 work units)
Nodes | Current Node | Objective Bounds | Work
Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time
* 0 0 0 9.794116e+07 9.7941e+07 0.00% - 0s
Explored 1 nodes (2 simplex iterations) in 0.00 seconds (0.00 work units)
Thread count was 24 (of 24 available processors)
Solution count 1: 9.79412e+07
Optimal solution found (tolerance 1.00e-04)
Best objective 9.794116189200e+07, best bound 9.794116189200e+07, gap 0.0000%
📝 Generated Solution object for Program(design_scheduling). See .solution ⏱ 0.0010 s
✅ Program(design_scheduling) optimized using gurobi. Display using .output() ⏱ 0.0184 s
Comparing the solution#
The choice of material mode for PV changes based on the object, which highlights the trade-off between the two options!
m.capacity.output(compare=True)
m.show()
Mathematical Program for Program(design_scheduling)
Index Sets
Objective
s.t.
Balance Constraint Sets
Binds Constraint Sets
Calculations Constraint Sets
Mapping Constraint Sets
Function Sets