diff --git a/Project.toml b/Project.toml index 93c35a0..640b4d4 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,8 @@ authors = ["Alinson S. Xavier "] version = "0.1.0" [deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Geodesy = "0ef565a4-170c-5f04-8de2-149903a85f3d" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" JuMP = "4076af6c-e467-56ae-b986-b466b2749572" diff --git a/src/RELOG.jl b/src/RELOG.jl index 5cd3bcc..9ba3bb1 100644 --- a/src/RELOG.jl +++ b/src/RELOG.jl @@ -5,5 +5,8 @@ include("instance/parse.jl") include("model/jumpext.jl") include("model/dist.jl") include("model/build.jl") +include("reports/plants.jl") +include("reports/transportation.jl") +include("reports/centers.jl") end # module RELOG diff --git a/src/model/build.jl b/src/model/build.jl index fa0ec0c..99154ab 100644 --- a/src/model/build.jl +++ b/src/model/build.jl @@ -6,14 +6,15 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false products = instance.products plants = instance.plants T = 1:instance.time_horizon + model.ext[:instance] = instance # Transportation edges # ------------------------------------------------------------------------- # Connectivity - E = [] - E_in = Dict(src => [] for src in plants ∪ centers) - E_out = Dict(src => [] for src in plants ∪ centers) + model.ext[:E] = E = [] + model.ext[:E_in] = E_in = Dict(src => [] for src in plants ∪ centers) + model.ext[:E_out] = E_out = Dict(src => [] for src in plants ∪ centers) function push_edge!(src, dst, m) push!(E, (src, dst, m)) @@ -28,7 +29,7 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false # Plant to plant for p2 in plants p1 != p2 || continue - m ∉ keys(p2.input_mix) || continue + m ∈ keys(p2.input_mix) || continue push_edge!(p1, p2, m) end @@ -57,7 +58,7 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false end # Distances - distances = Dict() + model.ext[:distances] = distances = Dict() for (p1, p2, m) in E d = _calculate_distance(p1.latitude, p1.longitude, p2.latitude, p2.longitude) distances[p1, p2, m] = d @@ -86,9 +87,6 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false for p in plants, m in keys(p.output), t in T z_prod[p.name, m.name, t] = @variable(model, lower_bound = 0) end - for c in centers, m in c.outputs, t in T - z_prod[c.name, m.name, t] = @variable(model, lower_bound = 0) - end # Amount of product m disposed at plant/center p at time T z_disp = _init(model, :z_disp) diff --git a/src/reports/centers.jl b/src/reports/centers.jl new file mode 100644 index 0000000..bbff8c4 --- /dev/null +++ b/src/reports/centers.jl @@ -0,0 +1,47 @@ +# RELOG: Reverse Logistics Optimization +# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. + +using DataFrames +using CSV + +function centers_report(model)::DataFrame + df = DataFrame() + df."center" = String[] + df."year" = Int[] + df."input product" = String[] + df."input amount (tonne)" = Float64[] + + centers = model.ext[:instance].centers + T = 1:model.ext[:instance].time_horizon + + for c in centers, t in T + input_name = (c.input === nothing) ? "" : c.input.name + input = round(value(model[:z_input][c.name, t]), digits = 3) + push!(df, [c.name, t, input_name, input]) + end + return df +end + +function center_outputs_report(model)::DataFrame + df = DataFrame() + df."center" = String[] + df."output product" = String[] + df."year" = Int[] + df."amount collected (tonne)" = Float64[] + df."amount disposed (tonne)" = Float64[] + + centers = model.ext[:instance].centers + T = 1:model.ext[:instance].time_horizon + + for c in centers, m in c.outputs, t in T + collected = round(value(model[:z_collected][c.name, m.name, t]), digits = 3) + disposed = round(value(model[:z_disp][c.name, m.name, t]), digits = 3) + push!(df, [c.name, m.name, t, collected, disposed]) + end + return df +end + +write_centers_report(solution, filename) = CSV.write(filename, centers_report(solution)) +write_center_outputs_report(solution, filename) = + CSV.write(filename, center_outputs_report(solution)) diff --git a/src/reports/plants.jl b/src/reports/plants.jl new file mode 100644 index 0000000..68cd9c7 --- /dev/null +++ b/src/reports/plants.jl @@ -0,0 +1,49 @@ +# RELOG: Reverse Logistics Optimization +# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. + +using DataFrames +using CSV + +function plants_report(model)::DataFrame + df = DataFrame() + df."plant" = String[] + df."year" = Int[] + df."operational?" = Bool[] + df."input amount (tonne)" = Float64[] + + plants = model.ext[:instance].plants + T = 1:model.ext[:instance].time_horizon + + for p in plants, t in T + operational = JuMP.value(model[:x][p.name, t]) > 0.5 + input = value(model[:z_input][p.name, t]) + operational || continue + push!(df, [p.name, t, operational, input]) + end + return df +end + +function plant_outputs_report(model)::DataFrame + df = DataFrame() + df."plant" = String[] + df."output product" = String[] + df."year" = Int[] + df."amount produced (tonne)" = Float64[] + df."amount disposed (tonne)" = Float64[] + + plants = model.ext[:instance].plants + T = 1:model.ext[:instance].time_horizon + + for p in plants, m in keys(p.output), t in T + produced = JuMP.value(model[:z_prod][p.name, m.name, t]) + disposed = JuMP.value(model[:z_disp][p.name, m.name, t]) + produced > 1e-3 || continue + push!(df, [p.name, m.name, t, produced, disposed]) + end + return df +end + +write_plants_report(solution, filename) = CSV.write(filename, plants_report(solution)) +write_plant_outputs_report(solution, filename) = + CSV.write(filename, plant_outputs_report(solution)) diff --git a/src/reports/transportation.jl b/src/reports/transportation.jl new file mode 100644 index 0000000..99cee0f --- /dev/null +++ b/src/reports/transportation.jl @@ -0,0 +1,31 @@ +# RELOG: Reverse Logistics Optimization +# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. + +using DataFrames +using CSV + +function transportation_report(model)::DataFrame + df = DataFrame() + df."source" = String[] + df."destination" = String[] + df."product" = String[] + df."year" = Int[] + df."amount sent (tonne)" = Float64[] + df."distance (km)" = Float64[] + + E = model.ext[:E] + distances = model.ext[:distances] + T = 1:model.ext[:instance].time_horizon + + for (p1, p2, m) in E, t in T + amount = value(model[:y][p1.name, p2.name, m.name, t]) + amount > 1e-3 || continue + distance = distances[p1, p2, m] + push!(df, [p1.name, p2.name, m.name, t, amount, distance]) + end + return df +end + +write_transportation_report(solution, filename) = + CSV.write(filename, transportation_report(solution)) diff --git a/test/fixtures/boat_example.ipynb b/test/fixtures/boat_example.ipynb index 28e3d61..769462f 100644 --- a/test/fixtures/boat_example.ipynb +++ b/test/fixtures/boat_example.ipynb @@ -2,51 +2,59 @@ "cells": [ { "cell_type": "code", - "execution_count": 12, + "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", + "# cities_a = {\n", + "# \"Chicago\": [41.881832, -87.623177],\n", + "# \"New York City\": [40.712776, -74.005974],\n", + "# \"Los Angeles\": [34.052235, -118.243683],\n", + "# \"Houston\": [29.760427, -95.369804],\n", + "# \"Phoenix\": [33.448376, -112.074036],\n", + "# \"Philadelphia\": [39.952583, -75.165222],\n", + "# \"San Antonio\": [29.424122, -98.493629],\n", + "# \"San Diego\": [32.715736, -117.161087],\n", + "# \"Dallas\": [32.776664, -96.796988],\n", + "# \"San Jose\": [37.338208, -121.886329],\n", + "# \"Austin\": [30.267153, -97.743061],\n", + "# \"Jacksonville\": [30.332184, -81.655651],\n", + "# \"Fort Worth\": [32.755488, -97.330766],\n", + "# \"Columbus\": [39.961176, -82.998794],\n", + "# \"Charlotte\": [35.227087, -80.843127],\n", + "# \"Indianapolis\": [39.768403, -86.158068],\n", + "# \"San Francisco\": [37.774929, -122.419416],\n", + "# \"Seattle\": [47.606209, -122.332071],\n", + "# \"Denver\": [39.739236, -104.990251],\n", + "# \"Washington D.C.\": [38.907192, -77.036871],\n", + "# \"Nashville\": [36.162664, -86.781602],\n", + "# \"Detroit\": [42.331427, -83.045754],\n", + "# \"Oklahoma City\": [35.467560, -97.516428],\n", + "# \"Portland\": [45.505106, -122.675026],\n", + "# \"Las Vegas\": [36.169941, -115.139830],\n", + "# }\n", + "\n", + "# cities_b = {\n", + "# \"Chicago\": [41.881832, -87.623177],\n", + "# \"Phoenix\": [33.448376, -112.074036],\n", + "# \"Dallas\": [32.776664, -96.796988],\n", + "# \"San Jose\": [37.338208, -121.886329],\n", + "# \"Seattle\": [47.606209, -122.332071],\n", + "# \"Las Vegas\": [36.169941, -115.139830],\n", + "# }\n", + "\n", "cities_a = {\n", " \"Chicago\": [41.881832, -87.623177],\n", - " \"New York City\": [40.712776, -74.005974],\n", - " \"Los Angeles\": [34.052235, -118.243683],\n", - " \"Houston\": [29.760427, -95.369804],\n", - " \"Phoenix\": [33.448376, -112.074036],\n", - " \"Philadelphia\": [39.952583, -75.165222],\n", - " \"San Antonio\": [29.424122, -98.493629],\n", - " \"San Diego\": [32.715736, -117.161087],\n", - " \"Dallas\": [32.776664, -96.796988],\n", - " \"San Jose\": [37.338208, -121.886329],\n", - " \"Austin\": [30.267153, -97.743061],\n", - " \"Jacksonville\": [30.332184, -81.655651],\n", - " \"Fort Worth\": [32.755488, -97.330766],\n", - " \"Columbus\": [39.961176, -82.998794],\n", - " \"Charlotte\": [35.227087, -80.843127],\n", - " \"Indianapolis\": [39.768403, -86.158068],\n", - " \"San Francisco\": [37.774929, -122.419416],\n", - " \"Seattle\": [47.606209, -122.332071],\n", - " \"Denver\": [39.739236, -104.990251],\n", - " \"Washington D.C.\": [38.907192, -77.036871],\n", - " \"Nashville\": [36.162664, -86.781602],\n", - " \"Detroit\": [42.331427, -83.045754],\n", - " \"Oklahoma City\": [35.467560, -97.516428],\n", - " \"Portland\": [45.505106, -122.675026],\n", - " \"Las Vegas\": [36.169941, -115.139830],\n", "}\n", "\n", "cities_b = {\n", " \"Chicago\": [41.881832, -87.623177],\n", - " \"Phoenix\": [33.448376, -112.074036],\n", - " \"Dallas\": [32.776664, -96.796988],\n", - " \"San Jose\": [37.338208, -121.886329],\n", - " \"Seattle\": [47.606209, -122.332071],\n", - " \"Las Vegas\": [36.169941, -115.139830],\n", "}\n", "\n", "parameters = {\n", - " \"time horizon (years)\": 10,\n", + " \"time horizon (years)\": 1,\n", " \"building period (years)\": [1],\n", " \"distance metric\": \"Euclidean\",\n", "}\n", @@ -54,24 +62,24 @@ "nail_factory = {\n", " \"input\": None,\n", " \"outputs\": [\"Nail\"],\n", - " \"fixed output (tonne)\": {\"Nail\": 1},\n", + " \"fixed output (tonne)\": {\"Nail\": 5},\n", " \"variable output (tonne/tonne)\": {\"Nail\": 0},\n", " \"revenue ($/tonne)\": None,\n", " \"collection cost ($/tonne)\": {\"Nail\": 1000},\n", " \"operating cost ($)\": 0,\n", - " \"disposal limit (tonne)\": {\"Nail\": None},\n", + " \"disposal limit (tonne)\": {\"Nail\": 0},\n", " \"disposal cost ($/tonne)\": {\"Nail\": 0},\n", "}\n", "\n", "forest = {\n", " \"input\": None,\n", " \"outputs\": [\"Wood\"],\n", - " \"fixed output (tonne)\": {\"Wood\": 100},\n", + " \"fixed output (tonne)\": {\"Wood\": 95},\n", " \"variable output (tonne/tonne)\": {\"Wood\": 0},\n", " \"revenue ($/tonne)\": None,\n", " \"collection cost ($/tonne)\": {\"Wood\": 250},\n", " \"operating cost ($)\": 0,\n", - " \"disposal limit (tonne)\": {\"Wood\": None},\n", + " \"disposal limit (tonne)\": {\"Wood\": 0},\n", " \"disposal cost ($/tonne)\": {\"Wood\": 0},\n", "}\n", "\n", @@ -80,7 +88,7 @@ " \"outputs\": [\"UsedBoat\"],\n", " \"fixed output (tonne)\": {\"UsedBoat\": 0},\n", " \"variable output (tonne/tonne)\": {\"UsedBoat\": [0.10, 0.25, 0.10]},\n", - " \"revenue ($/tonne)\": 3_000,\n", + " \"revenue ($/tonne)\": 300_000,\n", " \"collection cost ($/tonne)\": {\"UsedBoat\": 100},\n", " \"operating cost ($)\": 125_000,\n", " \"disposal limit (tonne)\": {\"UsedBoat\": 0},\n", @@ -115,7 +123,7 @@ " },\n", " \"capacities\": [\n", " {\n", - " \"size (tonne)\": 50,\n", + " \"size (tonne)\": 200,\n", " \"opening cost ($)\": 10_000,\n", " \"fixed operating cost ($)\": 1_000,\n", " \"variable operating cost ($/tonne)\": 5,\n", @@ -144,7 +152,7 @@ " \"Nail\": 0,\n", " \"Wood\": 0,\n", " },\n", - " \"disposal limit (tonne)\": {\"Nail\": None, \"Wood\": None},\n", + " \"disposal limit (tonne)\": {\"Nail\": 0, \"Wood\": 0},\n", " \"capacities\": [\n", " {\n", " \"size (tonne)\": 50,\n", @@ -166,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ @@ -199,8 +207,10 @@ " \"longitude (deg)\": city_location[1],\n", " }\n", " for (city_name, city_location) in cities_a.items()\n", - " },\n", - " \"plants\": {\n", + " }\n", + " ,\n", + " \"plants\":\n", + " {\n", " f\"BoatFactory ({city_name})\": {\n", " **boat_factory,\n", " \"latitude (deg)\": city_location[0],\n", @@ -209,7 +219,7 @@ " for (city_name, city_location) in cities_a.items()\n", " } | {\n", " f\"RecyclingPlant ({city_name})\": {\n", - " **boat_factory,\n", + " **recycling_plant,\n", " \"latitude (deg)\": city_location[0],\n", " \"longitude (deg)\": city_location[1],\n", " }\n", diff --git a/test/fixtures/boat_example.json b/test/fixtures/boat_example.json index e326138..4a2fdfc 100644 --- a/test/fixtures/boat_example.json +++ b/test/fixtures/boat_example.json @@ -1,6 +1,6 @@ { "parameters": { - "time horizon (years)": 10, + "time horizon (years)": 1, "building period (years)": [ 1 ], @@ -43,3049 +43,82 @@ "Nail" ], "fixed output (tonne)": { - "Nail": 1 - }, - "variable output (tonne/tonne)": { - "Nail": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Nail": 1000 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Nail": null - }, - "disposal cost ($/tonne)": { - "Nail": 0 - }, - "latitude (deg)": 41.881832, - "longitude (deg)": -87.623177 - }, - "NailFactory (Phoenix)": { - "input": null, - "outputs": [ - "Nail" - ], - "fixed output (tonne)": { - "Nail": 1 - }, - "variable output (tonne/tonne)": { - "Nail": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Nail": 1000 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Nail": null - }, - "disposal cost ($/tonne)": { - "Nail": 0 - }, - "latitude (deg)": 33.448376, - "longitude (deg)": -112.074036 - }, - "NailFactory (Dallas)": { - "input": null, - "outputs": [ - "Nail" - ], - "fixed output (tonne)": { - "Nail": 1 - }, - "variable output (tonne/tonne)": { - "Nail": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Nail": 1000 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Nail": null - }, - "disposal cost ($/tonne)": { - "Nail": 0 - }, - "latitude (deg)": 32.776664, - "longitude (deg)": -96.796988 - }, - "NailFactory (San Jose)": { - "input": null, - "outputs": [ - "Nail" - ], - "fixed output (tonne)": { - "Nail": 1 - }, - "variable output (tonne/tonne)": { - "Nail": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Nail": 1000 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Nail": null - }, - "disposal cost ($/tonne)": { - "Nail": 0 - }, - "latitude (deg)": 37.338208, - "longitude (deg)": -121.886329 - }, - "NailFactory (Seattle)": { - "input": null, - "outputs": [ - "Nail" - ], - "fixed output (tonne)": { - "Nail": 1 - }, - "variable output (tonne/tonne)": { - "Nail": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Nail": 1000 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Nail": null - }, - "disposal cost ($/tonne)": { - "Nail": 0 - }, - "latitude (deg)": 47.606209, - "longitude (deg)": -122.332071 - }, - "NailFactory (Las Vegas)": { - "input": null, - "outputs": [ - "Nail" - ], - "fixed output (tonne)": { - "Nail": 1 - }, - "variable output (tonne/tonne)": { - "Nail": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Nail": 1000 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Nail": null - }, - "disposal cost ($/tonne)": { - "Nail": 0 - }, - "latitude (deg)": 36.169941, - "longitude (deg)": -115.13983 - }, - "Forest (Chicago)": { - "input": null, - "outputs": [ - "Wood" - ], - "fixed output (tonne)": { - "Wood": 100 - }, - "variable output (tonne/tonne)": { - "Wood": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Wood": 250 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Wood": null - }, - "disposal cost ($/tonne)": { - "Wood": 0 - }, - "latitude (deg)": 41.881832, - "longitude (deg)": -87.623177 - }, - "Forest (Phoenix)": { - "input": null, - "outputs": [ - "Wood" - ], - "fixed output (tonne)": { - "Wood": 100 - }, - "variable output (tonne/tonne)": { - "Wood": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Wood": 250 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Wood": null - }, - "disposal cost ($/tonne)": { - "Wood": 0 - }, - "latitude (deg)": 33.448376, - "longitude (deg)": -112.074036 - }, - "Forest (Dallas)": { - "input": null, - "outputs": [ - "Wood" - ], - "fixed output (tonne)": { - "Wood": 100 - }, - "variable output (tonne/tonne)": { - "Wood": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Wood": 250 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Wood": null - }, - "disposal cost ($/tonne)": { - "Wood": 0 - }, - "latitude (deg)": 32.776664, - "longitude (deg)": -96.796988 - }, - "Forest (San Jose)": { - "input": null, - "outputs": [ - "Wood" - ], - "fixed output (tonne)": { - "Wood": 100 - }, - "variable output (tonne/tonne)": { - "Wood": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Wood": 250 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Wood": null - }, - "disposal cost ($/tonne)": { - "Wood": 0 - }, - "latitude (deg)": 37.338208, - "longitude (deg)": -121.886329 - }, - "Forest (Seattle)": { - "input": null, - "outputs": [ - "Wood" - ], - "fixed output (tonne)": { - "Wood": 100 - }, - "variable output (tonne/tonne)": { - "Wood": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Wood": 250 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Wood": null - }, - "disposal cost ($/tonne)": { - "Wood": 0 - }, - "latitude (deg)": 47.606209, - "longitude (deg)": -122.332071 - }, - "Forest (Las Vegas)": { - "input": null, - "outputs": [ - "Wood" - ], - "fixed output (tonne)": { - "Wood": 100 - }, - "variable output (tonne/tonne)": { - "Wood": 0 - }, - "revenue ($/tonne)": null, - "collection cost ($/tonne)": { - "Wood": 250 - }, - "operating cost ($)": 0, - "disposal limit (tonne)": { - "Wood": null - }, - "disposal cost ($/tonne)": { - "Wood": 0 - }, - "latitude (deg)": 36.169941, - "longitude (deg)": -115.13983 - }, - "Retail (Chicago)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 41.881832, - "longitude (deg)": -87.623177 - }, - "Retail (New York City)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 40.712776, - "longitude (deg)": -74.005974 - }, - "Retail (Los Angeles)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 34.052235, - "longitude (deg)": -118.243683 - }, - "Retail (Houston)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 29.760427, - "longitude (deg)": -95.369804 - }, - "Retail (Phoenix)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 33.448376, - "longitude (deg)": -112.074036 - }, - "Retail (Philadelphia)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 39.952583, - "longitude (deg)": -75.165222 - }, - "Retail (San Antonio)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 29.424122, - "longitude (deg)": -98.493629 - }, - "Retail (San Diego)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 32.715736, - "longitude (deg)": -117.161087 - }, - "Retail (Dallas)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 32.776664, - "longitude (deg)": -96.796988 - }, - "Retail (San Jose)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 37.338208, - "longitude (deg)": -121.886329 - }, - "Retail (Austin)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 30.267153, - "longitude (deg)": -97.743061 - }, - "Retail (Jacksonville)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 30.332184, - "longitude (deg)": -81.655651 - }, - "Retail (Fort Worth)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 32.755488, - "longitude (deg)": -97.330766 - }, - "Retail (Columbus)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 39.961176, - "longitude (deg)": -82.998794 - }, - "Retail (Charlotte)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 35.227087, - "longitude (deg)": -80.843127 - }, - "Retail (Indianapolis)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 39.768403, - "longitude (deg)": -86.158068 - }, - "Retail (San Francisco)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 37.774929, - "longitude (deg)": -122.419416 - }, - "Retail (Seattle)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 47.606209, - "longitude (deg)": -122.332071 - }, - "Retail (Denver)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 39.739236, - "longitude (deg)": -104.990251 - }, - "Retail (Washington D.C.)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 38.907192, - "longitude (deg)": -77.036871 - }, - "Retail (Nashville)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 36.162664, - "longitude (deg)": -86.781602 - }, - "Retail (Detroit)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 42.331427, - "longitude (deg)": -83.045754 - }, - "Retail (Oklahoma City)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 35.46756, - "longitude (deg)": -97.516428 - }, - "Retail (Portland)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 45.505106, - "longitude (deg)": -122.675026 - }, - "Retail (Las Vegas)": { - "input": "NewBoat", - "outputs": [ - "UsedBoat" - ], - "fixed output (tonne)": { - "UsedBoat": 0 - }, - "variable output (tonne/tonne)": { - "UsedBoat": [ - 0.1, - 0.25, - 0.1 - ] - }, - "revenue ($/tonne)": 3000, - "collection cost ($/tonne)": { - "UsedBoat": 100 - }, - "operating cost ($)": 125000, - "disposal limit (tonne)": { - "UsedBoat": 0 - }, - "disposal cost ($/tonne)": { - "UsedBoat": 0 - }, - "latitude (deg)": 36.169941, - "longitude (deg)": -115.13983 - } - }, - "plants": { - "BoatFactory (Chicago)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 41.881832, - "longitude (deg)": -87.623177 - }, - "BoatFactory (New York City)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 40.712776, - "longitude (deg)": -74.005974 - }, - "BoatFactory (Los Angeles)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 34.052235, - "longitude (deg)": -118.243683 - }, - "BoatFactory (Houston)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 29.760427, - "longitude (deg)": -95.369804 - }, - "BoatFactory (Phoenix)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 33.448376, - "longitude (deg)": -112.074036 - }, - "BoatFactory (Philadelphia)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.952583, - "longitude (deg)": -75.165222 - }, - "BoatFactory (San Antonio)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 29.424122, - "longitude (deg)": -98.493629 - }, - "BoatFactory (San Diego)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 32.715736, - "longitude (deg)": -117.161087 - }, - "BoatFactory (Dallas)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 32.776664, - "longitude (deg)": -96.796988 - }, - "BoatFactory (San Jose)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 37.338208, - "longitude (deg)": -121.886329 - }, - "BoatFactory (Austin)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 30.267153, - "longitude (deg)": -97.743061 - }, - "BoatFactory (Jacksonville)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 30.332184, - "longitude (deg)": -81.655651 - }, - "BoatFactory (Fort Worth)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 32.755488, - "longitude (deg)": -97.330766 - }, - "BoatFactory (Columbus)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.961176, - "longitude (deg)": -82.998794 - }, - "BoatFactory (Charlotte)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 35.227087, - "longitude (deg)": -80.843127 - }, - "BoatFactory (Indianapolis)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.768403, - "longitude (deg)": -86.158068 - }, - "BoatFactory (San Francisco)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 37.774929, - "longitude (deg)": -122.419416 - }, - "BoatFactory (Seattle)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 47.606209, - "longitude (deg)": -122.332071 - }, - "BoatFactory (Denver)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.739236, - "longitude (deg)": -104.990251 - }, - "BoatFactory (Washington D.C.)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 38.907192, - "longitude (deg)": -77.036871 - }, - "BoatFactory (Nashville)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 36.162664, - "longitude (deg)": -86.781602 - }, - "BoatFactory (Detroit)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 42.331427, - "longitude (deg)": -83.045754 - }, - "BoatFactory (Oklahoma City)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 35.46756, - "longitude (deg)": -97.516428 - }, - "BoatFactory (Portland)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 45.505106, - "longitude (deg)": -122.675026 - }, - "BoatFactory (Las Vegas)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 36.169941, - "longitude (deg)": -115.13983 - }, - "RecyclingPlant (Chicago)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 41.881832, - "longitude (deg)": -87.623177 - }, - "RecyclingPlant (New York City)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 40.712776, - "longitude (deg)": -74.005974 - }, - "RecyclingPlant (Los Angeles)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 34.052235, - "longitude (deg)": -118.243683 - }, - "RecyclingPlant (Houston)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 29.760427, - "longitude (deg)": -95.369804 - }, - "RecyclingPlant (Phoenix)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 33.448376, - "longitude (deg)": -112.074036 - }, - "RecyclingPlant (Philadelphia)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.952583, - "longitude (deg)": -75.165222 - }, - "RecyclingPlant (San Antonio)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 29.424122, - "longitude (deg)": -98.493629 - }, - "RecyclingPlant (San Diego)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 32.715736, - "longitude (deg)": -117.161087 - }, - "RecyclingPlant (Dallas)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 32.776664, - "longitude (deg)": -96.796988 - }, - "RecyclingPlant (San Jose)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 37.338208, - "longitude (deg)": -121.886329 - }, - "RecyclingPlant (Austin)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 30.267153, - "longitude (deg)": -97.743061 - }, - "RecyclingPlant (Jacksonville)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 30.332184, - "longitude (deg)": -81.655651 - }, - "RecyclingPlant (Fort Worth)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 32.755488, - "longitude (deg)": -97.330766 - }, - "RecyclingPlant (Columbus)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.961176, - "longitude (deg)": -82.998794 - }, - "RecyclingPlant (Charlotte)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 35.227087, - "longitude (deg)": -80.843127 - }, - "RecyclingPlant (Indianapolis)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.768403, - "longitude (deg)": -86.158068 - }, - "RecyclingPlant (San Francisco)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 37.774929, - "longitude (deg)": -122.419416 - }, - "RecyclingPlant (Seattle)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 47.606209, - "longitude (deg)": -122.332071 - }, - "RecyclingPlant (Denver)": { - "input mix (%)": { - "Wood": 95, "Nail": 5 }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 + "variable output (tonne/tonne)": { + "Nail": 0 }, - "disposal cost ($/tonne)": { - "NewBoat": 0 + "revenue ($/tonne)": null, + "collection cost ($/tonne)": { + "Nail": 1000 }, + "operating cost ($)": 0, "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 39.739236, - "longitude (deg)": -104.990251 - }, - "RecyclingPlant (Washington D.C.)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 + "Nail": 0 }, "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 + "Nail": 0 }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 38.907192, - "longitude (deg)": -77.036871 + "latitude (deg)": 41.881832, + "longitude (deg)": -87.623177 }, - "RecyclingPlant (Nashville)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 + "Forest (Chicago)": { + "input": null, + "outputs": [ + "Wood" + ], + "fixed output (tonne)": { + "Wood": 95 }, - "processing emissions (tonne)": { - "CO2": 5 + "variable output (tonne/tonne)": { + "Wood": 0 }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 + "revenue ($/tonne)": null, + "collection cost ($/tonne)": { + "Wood": 250 }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 + "operating cost ($)": 0, + "disposal limit (tonne)": { + "Wood": 0 }, "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 + "Wood": 0 }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 36.162664, - "longitude (deg)": -86.781602 + "latitude (deg)": 41.881832, + "longitude (deg)": -87.623177 }, - "RecyclingPlant (Detroit)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 + "Retail (Chicago)": { + "input": "NewBoat", + "outputs": [ + "UsedBoat" + ], + "fixed output (tonne)": { + "UsedBoat": 0 }, - "processing emissions (tonne)": { - "CO2": 5 + "variable output (tonne/tonne)": { + "UsedBoat": [ + 0.1, + 0.25, + 0.1 + ] }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 + "revenue ($/tonne)": 300000, + "collection cost ($/tonne)": { + "UsedBoat": 100 }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 + "operating cost ($)": 125000, + "disposal limit (tonne)": { + "UsedBoat": 0 }, "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 + "UsedBoat": 0 }, - "capacities": [ - { - "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 42.331427, - "longitude (deg)": -83.045754 - }, - "RecyclingPlant (Oklahoma City)": { + "latitude (deg)": 41.881832, + "longitude (deg)": -87.623177 + } + }, + "plants": { + "BoatFactory (Chicago)": { "input mix (%)": { "Wood": 95, "Nail": 5 @@ -3112,7 +145,7 @@ }, "capacities": [ { - "size (tonne)": 50, + "size (tonne)": 200, "opening cost ($)": 10000, "fixed operating cost ($)": 1000, "variable operating cost ($/tonne)": 5 @@ -3125,94 +158,51 @@ } ], "initial capacity (tonne)": 0, - "latitude (deg)": 35.46756, - "longitude (deg)": -97.516428 + "latitude (deg)": 41.881832, + "longitude (deg)": -87.623177 }, - "RecyclingPlant (Portland)": { + "RecyclingPlant (Chicago)": { "input mix (%)": { - "Wood": 95, - "Nail": 5 + "UsedBoat": 100 }, "output (tonne)": { - "NewBoat": 1.0 + "Nail": 0.025, + "Wood": 0.475 }, "processing emissions (tonne)": { "CO2": 5 }, "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 + "UsedBoat": 0 }, "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 + "UsedBoat": 0 }, "disposal cost ($/tonne)": { - "NewBoat": 0 + "Nail": 0, + "Wood": 0 }, "disposal limit (tonne)": { - "NewBoat": 0 + "Nail": 0, + "Wood": 0 }, "capacities": [ { "size (tonne)": 50, - "opening cost ($)": 10000, - "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 + "opening cost ($)": 5000, + "fixed operating cost ($)": 500, + "variable operating cost ($/tonne)": 2.5 }, { "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 - } - ], - "initial capacity (tonne)": 0, - "latitude (deg)": 45.505106, - "longitude (deg)": -122.675026 - }, - "RecyclingPlant (Las Vegas)": { - "input mix (%)": { - "Wood": 95, - "Nail": 5 - }, - "output (tonne)": { - "NewBoat": 1.0 - }, - "processing emissions (tonne)": { - "CO2": 5 - }, - "storage cost ($/tonne)": { - "Wood": 500, - "Nail": 200 - }, - "storage limit (tonne)": { - "Wood": 5, - "Nail": 1 - }, - "disposal cost ($/tonne)": { - "NewBoat": 0 - }, - "disposal limit (tonne)": { - "NewBoat": 0 - }, - "capacities": [ - { - "size (tonne)": 50, "opening cost ($)": 10000, "fixed operating cost ($)": 1000, - "variable operating cost ($/tonne)": 5 - }, - { - "size (tonne)": 500, - "opening cost ($)": 20000, - "fixed operating cost ($)": 2000, - "variable operating cost ($/tonne)": 5 + "variable operating cost ($/tonne)": 2.5 } ], "initial capacity (tonne)": 0, - "latitude (deg)": 36.169941, - "longitude (deg)": -115.13983 + "latitude (deg)": 41.881832, + "longitude (deg)": -87.623177 } } } \ No newline at end of file diff --git a/test/src/RELOGT.jl b/test/src/RELOGT.jl index 53a92ad..465485c 100644 --- a/test/src/RELOGT.jl +++ b/test/src/RELOGT.jl @@ -7,6 +7,7 @@ using JuliaFormatter include("instance/parse_test.jl") include("model/build_test.jl") include("model/dist_test.jl") +include("reports_test.jl") basedir = dirname(@__FILE__) @@ -18,9 +19,9 @@ function runtests() @testset "RELOG" begin instance_parse_test_1() instance_parse_test_2() - model_build_test_1() - model_build_test_2() + model_build_test() model_dist_test() + report_tests() end end diff --git a/test/src/model/build_test.jl b/test/src/model/build_test.jl index 85764e0..b95f7a3 100644 --- a/test/src/model/build_test.jl +++ b/test/src/model/build_test.jl @@ -3,7 +3,7 @@ using Test using HiGHS using JuMP -function model_build_test_1() +function model_build_test() instance = RELOG.parsefile(fixture("simple.json")) model = RELOG.build_model(instance, optimizer = HiGHS.Optimizer, variable_names = true) y = model[:y] @@ -110,10 +110,3 @@ function model_build_test_1() "eq_disposal_limit[C1,P2,1] : z_disp[C1,P2,1] ≤ 0" @test ("C1", "P3", 1) ∉ keys(model[:eq_disposal_limit]) end - - -function model_build_test_2() - instance = RELOG.parsefile(fixture("boat_example.json")) - model = RELOG.build_model(instance, optimizer = HiGHS.Optimizer) - optimize!(model) -end diff --git a/test/src/reports_test.jl b/test/src/reports_test.jl new file mode 100644 index 0000000..504e479 --- /dev/null +++ b/test/src/reports_test.jl @@ -0,0 +1,12 @@ +function report_tests() + # Load and solve the boat example + instance = RELOG.parsefile(fixture("boat_example.json")) + model = RELOG.build_model(instance, optimizer = HiGHS.Optimizer, variable_names = true) + optimize!(model) + write_to_file(model, "tmp/model.lp") + RELOG.write_plants_report(model, "tmp/plants.csv") + RELOG.write_plant_outputs_report(model, "tmp/plant_outputs.csv") + RELOG.write_centers_report(model, "tmp/centers.csv") + RELOG.write_center_outputs_report(model, "tmp/center_outputs.csv") + RELOG.write_transportation_report(model, "tmp/transportation.csv") +end