Add new structs for instance

v0.1
Alinson S. Xavier 5 years ago
parent ce02888c92
commit 3c7214d419

@ -10,10 +10,10 @@ uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
version = "0.5.0" version = "0.5.0"
[[BinaryProvider]] [[BinaryProvider]]
deps = ["Libdl", "SHA"] deps = ["Libdl", "Logging", "SHA"]
git-tree-sha1 = "5b08ed6036d9d3f0ee6369410b830f8873d4024c" git-tree-sha1 = "428e9106b1ff27593cbd979afac9b45b82372b8c"
uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232" uuid = "b99e7846-7c00-51b0-8f62-c81ae34c0232"
version = "0.5.8" version = "0.5.9"
[[Bzip2_jll]] [[Bzip2_jll]]
deps = ["Libdl", "Pkg"] deps = ["Libdl", "Pkg"]
@ -29,15 +29,15 @@ version = "0.5.1"
[[Cbc]] [[Cbc]]
deps = ["BinaryProvider", "Libdl", "MathOptInterface", "MathProgBase", "SparseArrays", "Test"] deps = ["BinaryProvider", "Libdl", "MathOptInterface", "MathProgBase", "SparseArrays", "Test"]
git-tree-sha1 = "0d51c2d66fc22e5e3fc64b6092ba0f0b3839c8c1" git-tree-sha1 = "62d80f448b5d77b3f0a59cecf6197aad2a3aa280"
uuid = "9961bab8-2fa3-5c5a-9d89-47fab24efd76" uuid = "9961bab8-2fa3-5c5a-9d89-47fab24efd76"
version = "0.6.6" version = "0.6.7"
[[CodeTracking]] [[CodeTracking]]
deps = ["InteractiveUtils", "UUIDs"] deps = ["InteractiveUtils", "UUIDs"]
git-tree-sha1 = "0becdab7e6fbbcb7b88d8de5b72e5bb2f28239f3" git-tree-sha1 = "cab4da992adc0a64f63fa30d2db2fd8bec40cab4"
uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2"
version = "0.5.8" version = "0.5.11"
[[CodecBzip2]] [[CodecBzip2]]
deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"]
@ -71,9 +71,9 @@ version = "0.5.1"
[[DataStructures]] [[DataStructures]]
deps = ["InteractiveUtils", "OrderedCollections"] deps = ["InteractiveUtils", "OrderedCollections"]
git-tree-sha1 = "73eb18320fe3ba58790c8b8f6f89420f0a622773" git-tree-sha1 = "6166ecfaf2b8bbf2b68d791bc1d54501f345d314"
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
version = "0.17.11" version = "0.17.15"
[[Dates]] [[Dates]]
deps = ["Printf"] deps = ["Printf"]
@ -112,9 +112,9 @@ version = "0.5.0"
[[HTTP]] [[HTTP]]
deps = ["Base64", "Dates", "IniFile", "MbedTLS", "Sockets"] deps = ["Base64", "Dates", "IniFile", "MbedTLS", "Sockets"]
git-tree-sha1 = "cd60d9a575d3b70c026d7e714212fd4ecf86b4bb" git-tree-sha1 = "fe31f4ff144392ad8176f5c7c03cca6ba320271c"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
version = "0.8.13" version = "0.8.14"
[[IniFile]] [[IniFile]]
deps = ["Test"] deps = ["Test"]
@ -140,17 +140,18 @@ version = "0.2.0"
[[JuMP]] [[JuMP]]
deps = ["Calculus", "DataStructures", "ForwardDiff", "LinearAlgebra", "MathOptInterface", "MutableArithmetics", "NaNMath", "Random", "SparseArrays", "Statistics"] deps = ["Calculus", "DataStructures", "ForwardDiff", "LinearAlgebra", "MathOptInterface", "MutableArithmetics", "NaNMath", "Random", "SparseArrays", "Statistics"]
git-tree-sha1 = "8e87337fd19b6717fd9d5324bfab99848e363d9f" git-tree-sha1 = "84c1cf8bec4729b8b2ef4dfc4e1db1b892ad0d30"
uuid = "4076af6c-e467-56ae-b986-b466b2749572" uuid = "4076af6c-e467-56ae-b986-b466b2749572"
version = "0.21.1" version = "0.21.2"
[[JuliaInterpreter]] [[JuliaInterpreter]]
deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"]
git-tree-sha1 = "2eadbbde5534346cbb837c3a75b377cba477a06d" git-tree-sha1 = "dda48f397146fcd0b520c38a17a749e0f890ab84"
uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a"
version = "0.7.13" version = "0.7.14"
[[LibGit2]] [[LibGit2]]
deps = ["Printf"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
[[Libdl]] [[Libdl]]
@ -165,9 +166,9 @@ uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
[[LoweredCodeUtils]] [[LoweredCodeUtils]]
deps = ["JuliaInterpreter"] deps = ["JuliaInterpreter"]
git-tree-sha1 = "1c41621653250b2824b6e664ac5bd805558aeff9" git-tree-sha1 = "695206e7ec13cbec6e6ee4d19af7464e80f4d1ad"
uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b"
version = "0.4.3" version = "0.4.4"
[[Markdown]] [[Markdown]]
deps = ["Base64"] deps = ["Base64"]
@ -187,15 +188,15 @@ version = "0.7.8"
[[MbedTLS]] [[MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"]
git-tree-sha1 = "a9e2221f06b42f56052f43ad7edecb01d0ef5ab4" git-tree-sha1 = "426a6978b03a97ceb7ead77775a1da066343ec6e"
uuid = "739be429-bea8-5141-9913-cc70e7f3736d" uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
version = "1.0.1" version = "1.0.2"
[[MbedTLS_jll]] [[MbedTLS_jll]]
deps = ["Libdl", "Pkg"] deps = ["Libdl", "Pkg"]
git-tree-sha1 = "066a4467008745eed36dad973ceb66405785a621" git-tree-sha1 = "c83f5a1d038f034ad0549f9ee4d5fac3fb429e33"
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
version = "2.16.0+1" version = "2.16.0+2"
[[Mmap]] [[Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804" uuid = "a63ad114-7e13-5084-954f-fe012c677804"
@ -225,12 +226,12 @@ version = "1.1.0"
[[Parsers]] [[Parsers]]
deps = ["Dates", "Test"] deps = ["Dates", "Test"]
git-tree-sha1 = "75d07cb840c300084634b4991761886d0d762724" git-tree-sha1 = "f8f5d2d4b4b07342e5811d2b6428e45524e241df"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "1.0.1" version = "1.0.2"
[[Pkg]] [[Pkg]]
deps = ["Dates", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Test", "UUIDs"] deps = ["Dates", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
[[Printf]] [[Printf]]
@ -239,9 +240,9 @@ uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
[[ProgressBars]] [[ProgressBars]]
deps = ["Printf"] deps = ["Printf"]
git-tree-sha1 = "e66732bbdaad368cfc642cef1f639df5812dc818" git-tree-sha1 = "fec529e15cccf342087de2ccda1b0b9064cbbb53"
uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568"
version = "0.6.0" version = "0.7.1"
[[REPL]] [[REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets"] deps = ["InteractiveUtils", "Markdown", "Sockets"]
@ -253,9 +254,9 @@ uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
[[Revise]] [[Revise]]
deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "UUIDs", "Unicode"] deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "UUIDs", "Unicode"]
git-tree-sha1 = "3c04c929f8720c2fabb12534cd102a2356a7705c" git-tree-sha1 = "9e544fcbf1bcf394c01dca39c40f299a4d0f6441"
uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" uuid = "295af30f-e4ad-537b-8983-00126c2a3abe"
version = "2.5.4" version = "2.6.5"
[[Rotations]] [[Rotations]]
deps = ["LinearAlgebra", "StaticArrays", "Statistics"] deps = ["LinearAlgebra", "StaticArrays", "Statistics"]
@ -284,9 +285,9 @@ version = "0.10.0"
[[StaticArrays]] [[StaticArrays]]
deps = ["LinearAlgebra", "Random", "Statistics"] deps = ["LinearAlgebra", "Random", "Statistics"]
git-tree-sha1 = "5a3bcb6233adabde68ebc97be66e95dcb787424c" git-tree-sha1 = "5c06c0aeb81bef54aed4b3f446847905eb6cbda0"
uuid = "90137ffa-7385-5640-81b9-e52037218182" uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "0.12.1" version = "0.12.3"
[[Statistics]] [[Statistics]]
deps = ["LinearAlgebra", "SparseArrays"] deps = ["LinearAlgebra", "SparseArrays"]

@ -4,17 +4,59 @@
using Printf, JSON, JSONSchema using Printf, JSON, JSONSchema
import Base.getindex, Base.time import Base.getindex, Base.time
"""
mutable struct ReverseManufacturingInstance
Representation of an instance of the Facility Location for Reverse Manufacturing problem. struct Product
""" name::String
transportation_cost::Float64
end
struct CollectionCenter
name::String
latitude::Float64
longitude::Float64
product::Product
amount::Float64
end
struct DisposalEntry
product::Product
cost::Float64
limit::Float64
end
struct Plant
name::String
input::Product
output::Dict{Product, Float64}
latitude::Float64
longitude::Float64
variable_operating_cost::Float64
fixed_operating_cost::Float64
opening_cost::Float64
base_capacity::Float64
max_capacity::Float64
expansion_cost::Float64
disposal::Array{DisposalEntry}
end
struct Instance
products::Array{Product, 1}
collection_centers::Array{CollectionCenter, 1}
plants::Array{Plant, 1}
end
mutable struct ReverseManufacturingInstance mutable struct ReverseManufacturingInstance
json::Dict json::Dict
products::Dict products::Dict
plants::Dict plants::Dict
end end
function Base.show(io::IO, instance::ReverseManufacturingInstance) function Base.show(io::IO, instance::ReverseManufacturingInstance)
n_plants = length(instance["plants"]) n_plants = length(instance["plants"])
n_products = length(instance["products"]) n_products = length(instance["products"])
@ -23,34 +65,103 @@ function Base.show(io::IO, instance::ReverseManufacturingInstance)
print(io, "$n_products products") print(io, "$n_products products")
end end
"""
load(name::String)::ReverseManufacturingInstance
Loads an instance from the benchmark set. function load(path::String)::Instance
basedir = dirname(@__FILE__)
json = JSON.parsefile(path)
schema = Schema(JSON.parsefile("$basedir/schemas/input.json"))
validation_results = JSONSchema.validate(json, schema)
if validation_results !== nothing
println(validation_results)
throw("Invalid input file")
end
products = Product[]
collection_centers = CollectionCenter[]
plants = Plant[]
product_name_to_product = Dict{String, Product}()
# Create products
for (product_name, product_dict) in json["products"]
product = Product(product_name, product_dict["transportation cost"])
push!(products, product)
product_name_to_product[product_name] = product
# Create collection centers
if "initial amounts" in keys(product_dict)
for (center_name, center_dict) in product_dict["initial amounts"]
center = CollectionCenter(center_name,
center_dict["latitude"],
center_dict["longitude"],
product,
center_dict["amount"])
push!(collection_centers, center)
end
end
end
# Create plants
for (plant_name, plant_dict) in json["plants"]
input = product_name_to_product[plant_dict["input"]]
output = Dict()
Example # Plant outputs
======= if "outputs" in keys(plant_dict)
output = Dict(product_name_to_product[key] => value
for (key, value) in plant_dict["outputs"]
if value > 0)
end
julia> ReverseManufacturing.load("samples/s1.json") for (location_name, location_dict) in plant_dict["locations"]
disposal = DisposalEntry[]
""" # Plant disposal
function load(name::String) :: ReverseManufacturingInstance if "disposal" in keys(location_dict)
basedir = dirname(@__FILE__) for (product_name, disposal_dict) in location_dict["disposal"]
return ReverseManufacturing.readfile("$basedir/../instances/$name.json") push!(disposal, DisposalEntry(product_name_to_product[product_name],
end disposal_dict["cost"],
disposal_dict["limit"]))
end
end
base_capacity = Inf
max_capacity = Inf
expansion_cost = 0
""" if "base capacity" in keys(location_dict)
readfile(path::String)::ReverseManufacturingInstance base_capacity = location_dict["base capacity"]
end
Loads an instance from the given JSON file. if "max capacity" in keys(location_dict)
max_capacity = location_dict["max capacity"]
end
Example if "expansion cost" in keys(location_dict)
======= expansion_cost = location_dict["expansion cost"]
end
plant = Plant(location_name,
input,
output,
location_dict["latitude"],
location_dict["longitude"],
location_dict["variable operating cost"],
location_dict["fixed operating cost"],
location_dict["opening cost"],
base_capacity,
max_capacity,
expansion_cost,
disposal)
push!(plants, plant)
end
end
return Instance(products, collection_centers, plants)
end
julia> ReverseManufacturing.load("/home/user/instance.json")
"""
function readfile(path::String)::ReverseManufacturingInstance function readfile(path::String)::ReverseManufacturingInstance
basedir = dirname(@__FILE__) basedir = dirname(@__FILE__)
json = JSON.parsefile(path) json = JSON.parsefile(path)
@ -105,4 +216,5 @@ function readfile(path::String)::ReverseManufacturingInstance
return ReverseManufacturingInstance(json, products, plants) return ReverseManufacturingInstance(json, products, plants)
end end
export ReverseManufacturingInstance export ReverseManufacturingInstance

@ -4,15 +4,62 @@
using ReverseManufacturing using ReverseManufacturing
@testset "Instance" begin @testset "Instance" begin
instance = ReverseManufacturing.load("samples/s1") @testset "load" begin
plants, products = instance.plants, instance.products basedir = dirname(@__FILE__)
@test length(products) == 4 instance = ReverseManufacturing.load("$basedir/../instances/samples/s1.json")
@test sort(collect(keys(plants))) == ["F1", "F2", "F3", "F4"] centers = instance.collection_centers
@test plants["F1"]["input product"] == products["P1"] plants = instance.plants
products = instance.products
@test sort(collect(keys(products))) == ["P1", "P2", "P3", "P4"] plant_name_to_plant = Dict(p.name => p for p in plants)
@test products["P1"]["input plants"] == [plants["F1"]] product_name_to_product = Dict(p.name => p for p in products)
@test products["P1"]["transportation cost"] == 0.015
@test products["P1"]["initial amounts"]["C1"]["latitude"] == 7.0 p2 = product_name_to_product["P2"]
p3 = product_name_to_product["P3"]
@test length(centers) == 10
@test centers[1].name == "C1"
@test centers[1].latitude == 7
@test centers[1].latitude == 7
@test centers[1].longitude == 7
@test centers[1].amount == 934.56
@test centers[1].product.name == "P1"
@test length(plants) == 6
plant = plant_name_to_plant["L1"]
@test plant.name == "L1"
@test plant.input.name == "P1"
@test plant.latitude == 0
@test plant.longitude == 0
@test plant.opening_cost == 500
@test plant.fixed_operating_cost == 30
@test plant.variable_operating_cost == 30
@test plant.base_capacity == 250
@test plant.max_capacity == 1000
@test plant.expansion_cost == 1
@test length(plant.output) == 2
@test plant.output[p2] == 0.2
@test plant.output[p3] == 0.5
@test length(plant.disposal) == 2
@test plant.disposal[1].product.name == "P2"
@test plant.disposal[1].cost == -10
@test plant.disposal[1].limit == 1
plant = plant_name_to_plant["L3"]
@test plant.name == "L3"
@test plant.input.name == "P2"
@test plant.latitude == 25
@test plant.longitude == 65
@test plant.opening_cost == 3000
@test plant.fixed_operating_cost == 50
@test plant.variable_operating_cost == 50
@test plant.base_capacity == Inf
@test plant.max_capacity == Inf
@test plant.expansion_cost == 0
end
end end

@ -5,5 +5,5 @@ using Test
@testset "ReverseManufacturing" begin @testset "ReverseManufacturing" begin
include("instance_test.jl") include("instance_test.jl")
include("model_test.jl") #include("model_test.jl")
end end
Loading…
Cancel
Save