Skip to content

Commit 78128bd

Browse files
committed
Allow user to specify product acquisition costs
1 parent 2f0228e commit 78128bd

File tree

15 files changed

+484
-557
lines changed

15 files changed

+484
-557
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file.
1414
## [Unreleased]
1515
### Added
1616
- Allow disposal at collection centers
17+
- Allow user to specify product acquisition costs
1718

1819
### Changed
1920
- Switch from Cbc/Clp to HiGHS

docs/make.jl

-2
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,3 @@ function make()
1515
)
1616
)
1717
end
18-
19-
make()

docs/src/format.md

+149-144
Large diffs are not rendered by default.

docs/src/model.md

+74-56
Original file line numberDiff line numberDiff line change
@@ -6,59 +6,61 @@ In this page, we describe the precise mathematical optimization model used by RE
66

77
### Sets
88

9-
Symbol | Description
10-
:-------|:------------
11-
$L$ | Set of locations holding the original material to be recycled
12-
$M$ | Set of materials recovered during the reverse manufacturing process
13-
$P$ | Set of potential plants to open
14-
$T = \{ 1, \ldots, t^{max} \}$ | Set of time periods
9+
| Symbol | Description |
10+
| :----------------------------- | :-------------------------------------------------------------------- |
11+
| $L$ | Set of collection centers holding the primary material to be recycled |
12+
| $M$ | Set of materials recovered during the reverse manufacturing process |
13+
| $P$ | Set of potential plants to open |
14+
| $T = \{ 1, \ldots, t^{max} \}$ | Set of time periods |
1515

1616
### Constants
1717

1818
#### Plants
1919

20-
Symbol | Description | Unit
21-
:-------|:------------|:---
22-
$c^\text{disp}_{pmt}$ | Cost of disposing one tonne of material $m$ at plant $p$ during time $t$ | \$/tonne/km
23-
$c^\text{exp}_{pt}$ | Cost of adding one tonne of capacity to plant $p$ at time $t$ | \$/tonne
24-
$c^\text{open}_{pt}$ | Cost of opening plant $p$ at time $t$, at minimum capacity | $
25-
$c^\text{f-base}_{pt}$ | Fixed cost of keeping plant $p$ open during time period $t$ | $
26-
$c^\text{f-exp}_{pt}$ | Increase in fixed cost for each additional tonne of capacity | \$/tonne
27-
$c^\text{var}_{pt}$ | Variable cost of processing one tonne of input at plant $p$ at time $t$ | \$/tonne
28-
$c^\text{store}_{pt}$ | Cost of storing one tonne of original material at plant $p$ at time $t$ | \$/tonne
29-
$m^\text{min}_p$ | Minimum capacity of plant $p$ | tonne
30-
$m^\text{max}_p$ | Maximum capacity of plant $p$ | tonne
31-
$m^\text{disp}_{pmt}$ | Maximum amount of material $m$ that plant $p$ can dispose of during time $t$ | tonne
32-
$m^\text{store}_p$ | Maximum amount of original material that plant $p$ can store for later processing. | tonne
20+
| Symbol | Description | Unit |
21+
| :---------------------- | :------------------------------------------------------------------------------------- | :---------- |
22+
| $c^\text{exp}_{pt}$ | Cost of adding one tonne of capacity to plant $p$ at time $t$ | \$/tonne |
23+
| $c^\text{f-base}_{pt}$ | Fixed cost of keeping plant $p$ open during time period $t$ | $ |
24+
| $c^\text{f-exp}_{pt}$ | Increase in fixed cost for each additional tonne of capacity | \$/tonne |
25+
| $c^\text{open}_{pt}$ | Cost of opening plant $p$ at time $t$, at minimum capacity | $ |
26+
| $c^\text{p-disp}_{pmt}$ | Cost of disposing recovered material $m$ at plant $p$ during time $t$ | \$/tonne/km |
27+
| $c^\text{store}_{pt}$ | Cost of storing primary material at plant $p$ at time $t$ | \$/tonne |
28+
| $c^\text{var}_{pt}$ | Variable cost of processing primary material at plant $p$ at time $t$ | \$/tonne |
29+
| $m^\text{max}_p$ | Maximum capacity of plant $p$ | tonne |
30+
| $m^\text{min}_p$ | Minimum capacity of plant $p$ | tonne |
31+
| $m^\text{p-disp}_{pmt}$ | Maximum amount of recovered material $m$ that plant $p$ can dispose of during time $t$ | tonne |
32+
| $m^\text{store}_p$ | Maximum amount of primary material that plant $p$ can store for later processing. | tonne |
3333

3434
#### Products
3535

36-
Symbol | Description | Unit
37-
:-------|:------------|:---
38-
$\alpha_{pm}$ | Amount of material $m$ recovered by plant $t$ for each tonne of original material | tonne/tonne
39-
$m^\text{initial}_{lt}$ | Amount of original material to be recycled at location $l$ during time $t$ | tonne
36+
| Symbol | Description | Unit |
37+
| :---------------------- | :------------------------------------------------------------------------------------------------------- | :---------- |
38+
| $\alpha_{pm}$ | Amount of material $m$ recovered by plant $t$ for each tonne of primary material | tonne/tonne |
39+
| $c^\text{acq}_{lt}$ | Cost of acquiring primary material at collection center $l$ during time $t$ | \$/tonne |
40+
| $c^\text{c-disp}_{lt}$ | Cost of disposing primary material at collection center $l$ during time $t$ | \$/tonne |
41+
| $m^\text{c-disp}_{t}$ | Maximum amount of primary material that can be disposed of across all collection centers during time $t$ | tonne |
42+
| $m^\text{initial}_{lt}$ | Amount of primary material available to be recycled at collection center $l$ during time $t$ | tonne |
4043

4144
#### Transportation
4245

43-
Symbol | Description | Unit
44-
:-------|:------------|:---
45-
$c^\text{tr}_{t}$ | Transportation cost during time $t$ | \$/tonne/km
46-
$d_{lp}$ | Distance between plant $p$ and location $l$ | km
47-
46+
| Symbol | Description | Unit |
47+
| :---------------- | :--------------------------------------------------- | :---------- |
48+
| $c^\text{tr}_{t}$ | Cost to transport primary material during time $t$ | \$/tonne/km |
49+
| $d_{lp}$ | Distance between plant $p$ and collection center $l$ | km |
4850

4951
### Decision variables
5052

51-
Symbol | Description | Unit
52-
:-------|:------------|:---
53-
$q_{mpt}$ | Amount of material $m$ recovered by plant $p$ during time $t$ | tonne
54-
$u_{pt}$ | Binary variable that equals 1 if plant $p$ starts operating at time $t$ | Boolean
55-
$w_{pt}$ | Extra capacity (amount above the minimum) added to plant $p$ during time $t$ | tonne
56-
$x_{pt}$ | Binary variable that equals 1 if plant $p$ is operational at time $t$ | Boolean
57-
$y_{lpt}$ | Amount of product sent from location $l$ to plant $p$ during time $t$ | tonne
58-
$z^{\text{disp}}_{mpt}$ | Amount of material $m$ disposed of by plant $p$ during time $t$ | tonne
59-
$z^{\text{store}}_{pt}$ | Amount of original material in storage at plant $p$ by the end of time period $t$ | tonne
60-
$z^{\text{proc}}_{mpt}$ | Amount of original material processed by plant $p$ during time period $t$ | tonne
61-
53+
| Symbol | Description | Unit |
54+
| :------------------------ | :-------------------------------------------------------------------------------------- | :------ |
55+
| $q_{mpt}$ | Amount of material $m$ recovered by plant $p$ during time $t$ | tonne |
56+
| $u_{pt}$ | Binary variable that equals 1 if plant $p$ starts operating at time $t$ | Boolean |
57+
| $w_{pt}$ | Extra capacity (amount above the minimum) added to plant $p$ during time $t$ | tonne |
58+
| $x_{pt}$ | Binary variable that equals 1 if plant $p$ is operational at time $t$ | Boolean |
59+
| $y_{lpt}$ | Amount of primary material sent from collection center $l$ to plant $p$ during time $t$ | tonne |
60+
| $z^{\text{p-disp}}_{mpt}$ | Amount of recovered material $m$ disposed of by plant $p$ during time $t$ | tonne |
61+
| $z^{\text{c-disp}}_{lt}$ | Amount of primary material disposed of at collection center $l$ during time $t$ | tonne |
62+
| $z^{\text{store}}_{pt}$ | Amount of primary material in storage at plant $p$ by the end of time period $t$ | tonne |
63+
| $z^{\text{proc}}_{mpt}$ | Amount of primary material processed by plant $p$ during time period $t$ | tonne |
6264

6365
### Objective function
6466

@@ -73,37 +75,52 @@ RELOG minimizes the overall capital, production and transportation costs:
7375
\sum_{i=1}^t c^\text{f-exp}_{pt} w_{pi} +
7476
c^{\text{exp}}_{pt} w_{pt}
7577
\right] + \\
76-
&
78+
&
7779
\sum_{t \in T} \sum_{p \in P} \left[
7880
c^{\text{store}}_{pt} z^{\text{store}}_{pt} +
7981
c^{\text{proc}}_{pt} z^{\text{proc}}_{pt}
8082
\right] + \\
8183
&
8284
\sum_{t \in T} \sum_{l \in L} \sum_{p \in P}
83-
c^{\text{tr}}_t d_{lp} y_{lpt}
85+
c^{\text{tr}}_t d_{lp} y_{lpt} +
8486
\\
8587
&
86-
\sum_{t \in T} \sum_{p \in P} \sum_{m \in M} c^{\text{disp}}_{pmt} z_{pmt}
88+
\sum_{t \in T} \sum_{p \in P} \sum_{m \in M} c^{\text{p-disp}}_{pmt} z_{pmt} +
89+
\\
90+
&
91+
\sum_{t \in T} \sum_{l \in L} c^\text{acq}_{lt} \left(
92+
m^\text{initial}_{lt} - z^{\text{c-disp}}_{lt}
93+
\right) + c^\text{c-disp}_{lt} z^{\text{c-disp}}_{lt}
8794
\end{align*}
8895
```
8996

9097
In the first line, we have (i) opening costs, if plant starts operating at time $t$, (ii) fixed operating costs, if plant is operational, (iii) additional fixed operating costs coming from expansion performed in all previous time periods up to the current one, and finally (iv) the expansion costs during the current time period.
9198
In the second line, we have storage and variable processing costs.
9299
In the third line, we have transportation costs.
93-
In the fourth line, we have the disposal costs.
100+
In the fourth line, we have disposal costs at the plants.
101+
In the fifth line, we have acquisition and disposal cost at the collection centers.
94102

95103
### Constraints
96104

97-
* All original materials must be sent to a plant:
105+
- All primary material must either be sent to a plant for processing or disposed of at the collection center:
98106

99107
```math
100108
\begin{align*}
101-
& \sum_{p \in P} y_{lpt} = m^\text{initial}_{lt}
109+
& \sum_{p \in P} y_{lpt} + z^{\text{c-disp}}_{lt} = m^\text{initial}_{lt}
102110
& \forall l \in L, t \in T
103111
\end{align*}
104112
```
105113

106-
* Amount received equals amount processed plus stored. Furthermore, all original material should be processed by the end of the simulation.
114+
- There is a limit on how much primary material can be disposed of at the collection centers:
115+
116+
```math
117+
\begin{align*}
118+
& \sum_{l \in L} z^{\text{c-disp}}_{lt} \leq m^\text{c-disp}_{t}
119+
& t \in T
120+
\end{align*}
121+
```
122+
123+
- Amount received equals amount processed plus stored. Furthermore, all primary material should be processed by the end of the simulation.
107124

108125
```math
109126
\begin{align*}
@@ -117,7 +134,7 @@ In the fourth line, we have the disposal costs.
117134
\end{align*}
118135
```
119136

120-
* Plants have a limited processing capacity. Furthermore, if a plant is closed, it has zero processing capacity:
137+
- Plants have a limited processing capacity. Furthermore, if a plant is closed, it has zero processing capacity:
121138

122139
```math
123140
\begin{align*}
@@ -126,7 +143,7 @@ In the fourth line, we have the disposal costs.
126143
\end{align*}
127144
```
128145

129-
* Plants have limited storage capacity. Furthermore, if a plant is closed, is has zero storage capacity:
146+
- Plants have limited storage capacity. Furthermore, if a plant is closed, is has zero storage capacity:
130147

131148
```math
132149
\begin{align*}
@@ -135,7 +152,7 @@ In the fourth line, we have the disposal costs.
135152
\end{align*}
136153
```
137154

138-
* Plants can only be expanded up to their maximum capacity. Furthermore, if a plant is closed, it cannot be expanded:
155+
- Plants can only be expanded up to their maximum capacity. Furthermore, if a plant is closed, it cannot be expanded:
139156

140157
```math
141158
\begin{align*}
@@ -144,7 +161,7 @@ In the fourth line, we have the disposal costs.
144161
\end{align*}
145162
```
146163

147-
* Amount of recovered material is proportional to amount processed:
164+
- Amount of recovered material is proportional to amount processed:
148165

149166
```math
150167
\begin{align*}
@@ -153,16 +170,16 @@ In the fourth line, we have the disposal costs.
153170
\end{align*}
154171
```
155172

156-
* Because we only consider a single type of plant, all recovered material must be immediately disposed of. In RELOG's full model, recovered materials may be sent to another plant for further processing.
173+
- Because we only consider a single type of plant, all recovered material must be immediately disposed of. In RELOG's full model, recovered materials may be sent to another plant for further processing.
157174

158175
```math
159176
\begin{align*}
160-
& q_{mpt} = z_{mpt}
177+
& q_{mpt} = z^{\text{p-disp}}_{mpt}
161178
& \forall m \in M, p \in P, t \in T
162179
\end{align*}
163180
```
164181

165-
* A plant is operational at time $t$ if it was operational at time $t-1$ or it was built at time $t$. This constraint also prevents a plant from being built multiple times.
182+
- A plant is operational at time $t$ if it was operational at time $t-1$ or it was built at time $t$. This constraint also prevents a plant from being built multiple times.
166183

167184
```math
168185
\begin{align*}
@@ -173,8 +190,7 @@ In the fourth line, we have the disposal costs.
173190
\end{align*}
174191
```
175192

176-
177-
* Variable bounds:
193+
- Variable bounds:
178194

179195
```math
180196
\begin{align*}
@@ -188,9 +204,11 @@ In the fourth line, we have the disposal costs.
188204
& \forall p \in P, t \in T \\
189205
& y_{lpt} \geq 0
190206
& \forall l \in L, p \in P, t \in T \\
207+
& z^{\text{c-disp}}_{lt} \geq 0
208+
& l \in L, t \in T \\
191209
& z^{\text{store}}_{pt} \geq 0
192210
& p \in P, t \in T \\
193-
& z^{\text{disp}}_{mpt}, z^{\text{proc}}_{mpt} \geq 0
211+
& z^{\text{p-disp}}_{mpt}, z^{\text{proc}}_{mpt} \geq 0
194212
& \forall m \in M, p \in P, t \in T
195213
\end{align*}
196214
```

relog-web/src/casebuilder/ProductBlock.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,17 @@ const ProductBlock = (props) => {
118118
/>
119119

120120
<h1 style={{ display: nCenters == 0 ? "none" : "block" }}>
121-
Disposal
121+
Acquisition & disposal
122122
</h1>
123123
<div style={{ display: nCenters == 0 ? "none" : "block" }}>
124+
<TextInputRow
125+
label="Acquisition cost"
126+
unit="$/tonne"
127+
tooltip="Cost of acquiring one tonne of this product at a collection center."
128+
value={props.value["acquisition cost ($/tonne)"]}
129+
onChange={(v) => onChange("acquisition cost ($/tonne)", v)}
130+
validate="floatList"
131+
/>
124132
<TextInputRow
125133
label="Disposal cost"
126134
unit="$/tonne"

relog-web/src/casebuilder/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export const defaultProduct = {
22
"initial amounts": {},
3+
"acquisition cost ($/tonne)": "0",
34
"disposal cost ($/tonne)": "0",
45
"disposal limit (tonne)": "0",
56
"disposal limit (%)": "",

relog-web/src/casebuilder/export.js

+16-11
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,14 @@ export const exportProduct = (original, parameters) => {
139139
);
140140

141141
// Copy cost time series (with inflation)
142-
["disposal cost ($/tonne)", "transportation cost ($/km/tonne)"].forEach(
143-
(key) => {
144-
const v = exportValue(original[key], T, R);
145-
if (v.length > 0) result[key] = v;
146-
}
147-
);
142+
[
143+
"disposal cost ($/tonne)",
144+
"acquisition cost ($/tonne)",
145+
"transportation cost ($/km/tonne)",
146+
].forEach((key) => {
147+
const v = exportValue(original[key], T, R);
148+
if (v.length > 0) result[key] = v;
149+
});
148150

149151
// Copy dictionaries
150152
["transportation emissions (tonne/km/tonne)"].forEach((key) => {
@@ -344,16 +346,19 @@ export const importProduct = (original) => {
344346
const [R, T] = computeInflationAndTimeHorizon(original, [
345347
"transportation cost ($/km/tonne)",
346348
"disposal cost ($/tonne)",
349+
"acquisition cost ($/tonne)",
347350
]);
348351
parameters["inflation rate (%)"] = String((R - 1) * 100);
349352
parameters["time horizon (years)"] = String(T);
350353

351354
// Import cost lists
352-
["transportation cost ($/km/tonne)", "disposal cost ($/tonne)"].forEach(
353-
(key) => {
354-
prod[key] = importList(original[key], R);
355-
}
356-
);
355+
[
356+
"transportation cost ($/km/tonne)",
357+
"disposal cost ($/tonne)",
358+
"acquisition cost ($/tonne)",
359+
].forEach((key) => {
360+
prod[key] = importList(original[key], R);
361+
});
357362

358363
// Import dicts
359364
["transportation emissions (tonne/km/tonne)"].forEach((key) => {

relog-web/src/casebuilder/export.test.js

+6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const sampleProductsOriginal = [
2727
"amount (tonne)": [100, 200, 300],
2828
},
2929
},
30+
"acquisition cost ($/tonne)": "4",
3031
"disposal cost ($/tonne)": "50",
3132
"disposal limit (tonne)": "30",
3233
"disposal limit (%)": "",
@@ -57,6 +58,7 @@ const sampleProductsOriginal = [
5758
"amount (tonne)": [100, 200, 300],
5859
},
5960
},
61+
"acquisition cost ($/tonne)": "4",
6062
"disposal cost ($/tonne)": "50",
6163
"disposal limit (tonne)": "",
6264
"disposal limit (%)": "10",
@@ -87,6 +89,7 @@ const sampleProductsOriginal = [
8789
"amount (tonne)": [100, 200, 300],
8890
},
8991
},
92+
"acquisition cost ($/tonne)": "4",
9093
"disposal cost ($/tonne)": "50",
9194
"disposal limit (tonne)": "",
9295
"disposal limit (%)": "",
@@ -118,6 +121,7 @@ const sampleProductsExported = [
118121
"amount (tonne)": [100, 200, 300],
119122
},
120123
},
124+
"acquisition cost ($/tonne)": [4, 8, 16],
121125
"disposal cost ($/tonne)": [50, 100, 200],
122126
"disposal limit (tonne)": [30, 30, 30],
123127
"transportation cost ($/km/tonne)": [0, 0, 0],
@@ -145,6 +149,7 @@ const sampleProductsExported = [
145149
"amount (tonne)": [100, 200, 300],
146150
},
147151
},
152+
"acquisition cost ($/tonne)": [4, 4, 4],
148153
"disposal cost ($/tonne)": [50, 50, 50],
149154
"disposal limit (tonne)": [30, 60, 90],
150155
"transportation cost ($/km/tonne)": [5, 5, 5],
@@ -172,6 +177,7 @@ const sampleProductsExported = [
172177
"amount (tonne)": [100, 200, 300],
173178
},
174179
},
180+
"acquisition cost ($/tonne)": [4, 4, 4],
175181
"disposal cost ($/tonne)": [50, 50, 50],
176182
"transportation cost ($/km/tonne)": [5, 5, 5],
177183
},

0 commit comments

Comments
 (0)