7 Commits

10 changed files with 67 additions and 5 deletions

28
.zenodo.json Normal file
View File

@@ -0,0 +1,28 @@
{
"creators": [
{
"orcid": "0000-0002-5022-9802",
"affiliation": "Argonne National Laboratory",
"name": "Santos Xavier, Alinson"
},
{
"orcid": "0000-0002-3426-9425",
"affiliation": "Argonne National Laboratory",
"name": "Iloeje, Chukwunwike"
},
{
"affiliation": "Argonne National Laboratory",
"name": "Atkins, John"
},
{
"affiliation": "Argonne National Laboratory",
"name": "Sun, Kyle"
},
{
"affiliation": "Argonne National Laboratory",
"name": "Gallier, Audrey"
}
],
"title": "RELOG: Reverse Logistics Optimization",
"description": "<b>RELOG</b> is a supply chain optimization package focusing on reverse logistics and reverse manufacturing. For example, the package can be used to determine where to build recycling plants, what sizes should they have and which customers should be served by which plants. The package supports customized reverse logistics pipelines, with multiple types of plants, multiple types of product and multiple time periods."
}

View File

@@ -11,6 +11,22 @@ All notable changes to this project will be documented in this file.
[semver]: https://semver.org/spec/v2.0.0.html
[pkjjl]: https://pkgdocs.julialang.org/v1/compatibility/#compat-pre-1.0
## [0.7.1] -- 2023-03-08
### Added
- Core: Add `write_reports` function
### Changed
- Web UI: Disable usage of heuristic method
### Fixed
- Core: Prevent plants from sending products to themselves
- Core: Enforce constraint that, if plant is closed, storage cannot be used
- Web UI: Fix parsing bug in disposal limit
## [0.7.0] -- 2023-02-23
### Added

View File

@@ -1,7 +1,7 @@
name = "RELOG"
uuid = "a2afcdf7-cf04-4913-85f9-c0d81ddf2008"
authors = ["Alinson S Xavier <axavier@anl.gov>"]
version = "0.7.0"
version = "0.7.1"
[deps]
CRC = "44b605c4-b955-5f2b-9b6d-d2bd01d3d205"

View File

@@ -235,7 +235,7 @@ const InputPage = () => {
"disposal limit (tonne)",
].forEach((key) => {
newData.plants[plantName][key] = { ...newData.plants[plantName][key] };
newData.plants[plantName][key][productName] = 0;
newData.plants[plantName][key][productName] = "0";
});
save(newData);
return newData;

View File

@@ -277,7 +277,7 @@ export const exportPlant = (original, parameters) => {
const v = exportValueAcf(dispCost, origDict);
if (v) {
resDict.disposal[dispName] = { "cost ($/tonne)": v };
const limit = original["disposal limit (tonne)"][dispName];
const limit = String(original["disposal limit (tonne)"][dispName]);
if (limit.length > 0) {
resDict.disposal[dispName]["limit (tonne)"] = exportValue(
limit,

View File

@@ -213,7 +213,7 @@ const samplePlantsOriginal = [
},
"disposal limit (tonne)": {
"Hydrogen gas": "10",
"Carbon dioxide": "",
"Carbon dioxide": 0,
Tar: "",
},
"emissions (tonne/tonne)": {
@@ -406,6 +406,7 @@ const samplePlantsExported = [
},
"Carbon dioxide": {
"cost ($/tonne)": [0, 0, 0],
"limit (tonne)": [0, 0, 0],
},
Tar: {
"cost ($/tonne)": [200, 400, 800],
@@ -439,6 +440,7 @@ const samplePlantsExported = [
},
"Carbon dioxide": {
"cost ($/tonne)": [0, 0, 0],
"limit (tonne)": [0, 0, 0],
},
Tar: {
"cost ($/tonne)": [100, 200.0, 400],

View File

@@ -44,6 +44,7 @@ function build_graph(instance::Instance)::Graph
# Build arcs from collection centers to plants, and from one plant to another
for source in [collection_shipping_nodes; plant_shipping_nodes]
for dest in process_nodes_by_input_product[source.product]
source.location != dest.location || continue
distance = _calculate_distance(
source.location.latitude,
source.location.longitude,

View File

@@ -237,6 +237,12 @@ function create_process_node_constraints!(model::JuMP.Model)
model[:capacity][n, t] <= n.location.sizes[2].capacity * model[:is_open][n, t]
)
# If plant is closed, storage cannot be used
@constraint(
model,
model[:store][n, t] <= n.location.storage_limit * model[:is_open][n, t]
)
# If plant is open, capacity is greater than base
@constraint(
model,

View File

@@ -12,3 +12,13 @@ function write(solution::AbstractDict, filename::AbstractString)
JSON.print(file, solution, 2)
end
end
function write_reports(solution::AbstractDict, basename::AbstractString)
RELOG.write_products_report(solution, "$(basename)_products.csv")
RELOG.write_plants_report(solution, "$(basename)_plants.csv")
RELOG.write_plant_outputs_report(solution, "$(basename)_plant_outputs.csv")
RELOG.write_plant_emissions_report(solution, "$(basename)_plant_emissions.csv")
RELOG.write_transportation_report(solution, "$(basename)_tr.csv")
RELOG.write_transportation_emissions_report(solution, "$(basename)_tr_emissions.csv")
return
end

View File

@@ -14,7 +14,6 @@ function solve(root, filename)
)
ref_solution, ref_model = RELOG.solve(
ref_file,
heuristic = true,
optimizer = optimizer,
lp_optimizer = HiGHS.Optimizer,
return_model = true,