-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from rafaelmartinelli/first-version
v0.1.0
- Loading branch information
Showing
49 changed files
with
451 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,21 @@ | ||
# This file is machine-generated - editing it directly is not advised | ||
|
||
[[Libdl]] | ||
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" | ||
|
||
[[Printf]] | ||
deps = ["Unicode"] | ||
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" | ||
|
||
[[Unicode]] | ||
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" | ||
|
||
[[ZipFile]] | ||
deps = ["Libdl", "Printf", "Zlib_jll"] | ||
git-tree-sha1 = "c3a5637e27e914a7a445b8d0ad063d701931e9f7" | ||
uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" | ||
version = "0.9.3" | ||
|
||
[[Zlib_jll]] | ||
deps = ["Libdl"] | ||
uuid = "83775a58-1f1d-513f-b197-d71354ab007a" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,80 @@ | ||
# CFLPLib | ||
# CFLPLib.jl | ||
|
||
[![Stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://rafaelmartinelli.github.io/CFLPLib.jl/stable) | ||
[![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://rafaelmartinelli.github.io/CFLPLib.jl/dev) | ||
[![Build Status](https://github.com/rafaelmartinelli/CFLPLib.jl/workflows/CI/badge.svg)](https://github.com/rafaelmartinelli/CFLPLib.jl/actions) | ||
[![Coverage](https://codecov.io/gh/rafaelmartinelli/CFLPLib.jl/branch/master/graph/badge.svg)](https://codecov.io/gh/rafaelmartinelli/CFLPLib.jl) | ||
[![Coverage](https://codecov.io/gh/rafaelmartinelli/CFLPLib.jl/branch/main/graph/badge.svg)](https://codecov.io/gh/rafaelmartinelli/CFLPLib.jl) | ||
[![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) | ||
|
||
CFLPLib reads data files in `cflp` format for Capacitated Facility Location Problem (CFLP) instances. | ||
|
||
## Usage | ||
|
||
The main type used by the package is `CFLPData`, defined as follows: | ||
|
||
```julia | ||
struct CFLPData | ||
name ::String # Instance name | ||
facilities ::Vector{CFLPFacility} # Vector of Facilities | ||
customers ::Vector{CFLPCustomer} # Vector of Customers | ||
|
||
lb ::Float64 # Lower bound (-Inf if not known) | ||
ub ::Float64 # Upper bound ( Inf if not known) | ||
end | ||
``` | ||
|
||
Type `CFLPFacility` is defined as follows: | ||
|
||
```julia | ||
struct CFLPFacility | ||
id ::Int64 # Sequential facility ID | ||
capacity ::Int64 # Facility capacity | ||
fixed_cost ::Float64 # Fixed cost to open facility | ||
costs ::Vector{Float64} # List of customers costs for this facility | ||
end | ||
``` | ||
|
||
Type `CFLPCustomer` is defined as follows: | ||
|
||
```julia | ||
struct CFLPCustomer | ||
id ::Int64 # Sequential customer ID | ||
demand ::Int64 # Customer demand | ||
costs ::Vector{Float64} # List of facilities costs for this customer | ||
end | ||
``` | ||
So, `costs` are duplicated in both types. | ||
|
||
Some classical CFLP instances from the literature are preloaded. For example, to load CFLP instance `cap41`: | ||
|
||
```julia | ||
data = loadCFLP(:cap41) | ||
``` | ||
|
||
See the [full list](https://github.com/rafaelmartinelli/CFLPLib.jl/tree/main/data). | ||
|
||
CFLPLib also loads custom CFLP instances (following [ORLib format](http://people.brunel.ac.uk/~mastjjb/jeb/orlib/capinfo.html)): | ||
|
||
```julia | ||
data = loadCFLP("/path/to/your/CFLP/instance.txt") | ||
``` | ||
|
||
## Installation | ||
|
||
CFLPLib is *not* a registered Julia Package. | ||
You can install CFLPLib through the Julia package manager. | ||
Open Julia's interactive session (REPL) and type: | ||
|
||
```julia | ||
] add https://github.com/rafaelmartinelli/CFLPLib.jl | ||
``` | ||
|
||
## Related links | ||
|
||
- [ORLib's CFLP page](http://people.brunel.ac.uk/~mastjjb/jeb/orlib/capinfo.html) | ||
- [Sobolev Institute of Mathematics' CFLP Page](http://www.math.nsc.ru/AP/benchmarks/CFLP/cflp_tabl-eng.html) (this package does not read those instances) | ||
|
||
## Other packages | ||
|
||
- [KnapsackLib.jl](https://github.com/rafaelmartinelli/KnapsackLib.jl): Knapsack algorithms in Julia | ||
- [GAPLib.jl](https://github.com/rafaelmartinelli/GAPLib.jl): Generalized Assignment Problem Lib | ||
- [BPPLib.jl](https://github.com/rafaelmartinelli/BPPLib.jl): Bin Packing and Cutting Stock Lib | ||
- [CARPData.jl](https://github.com/rafaelmartinelli/CARPData.jl): Capacitated Arc Routing Problem Lib |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,12 @@ | ||
module CFLPLib | ||
|
||
# Write your package code here. | ||
export CFLPData, CFLPFacility, CFLPCustomer, loadCFLP | ||
|
||
const data_path = joinpath(pkgdir(CFLPLib), "data") | ||
|
||
using ZipFile | ||
|
||
include("Data.jl") | ||
include("Loader.jl") | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
struct CFLPFacility | ||
id::Int64 | ||
capacity::Int64 | ||
fixed_cost::Float64 | ||
costs::Vector{Float64} | ||
end | ||
|
||
function Base.show(io::IO, facility::CFLPFacility) | ||
print(io, "F($(facility.id))") | ||
end | ||
|
||
struct CFLPCustomer | ||
id::Int64 | ||
demand::Int64 | ||
costs::Vector{Float64} | ||
end | ||
|
||
function Base.show(io::IO, customer::CFLPCustomer) | ||
print(io, "C($(customer.id))") | ||
end | ||
|
||
struct CFLPData | ||
name::String | ||
facilities::Vector{CFLPFacility} | ||
customers::Vector{CFLPCustomer} | ||
|
||
lb::Float64 | ||
ub::Float64 | ||
end | ||
|
||
function Base.show(io::IO, data::CFLPData) | ||
print(io, "CFLP Data $(data.name)") | ||
print(io, " ($(length(data.facilities)) facilities,") | ||
print(io, " $(length(data.customers)) customers)") | ||
print(io, " [$(data.lb), $(data.ub)]") | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
function loadCFLP(instance::Symbol) | ||
file_name = joinpath(data_path, string(instance) * ".zip") | ||
if !isfile(file_name) | ||
println("File $(string(instance)) not found!") | ||
return nothing | ||
end | ||
|
||
name = splitext(basename(file_name))[1] | ||
file = ZipFile.Reader(file_name) | ||
values = parse.(Float64, split(read(file.files[1], String))) | ||
|
||
return load(values, name) | ||
end | ||
|
||
function loadCFLP(file_name::String) | ||
if !isfile(file_name) | ||
println("File $file_name not found!") | ||
return nothing | ||
end | ||
|
||
name = splitext(basename(file_name))[1] | ||
values = parse.(Float64, split(read(file_name, String))) | ||
|
||
return load(values, name) | ||
end | ||
|
||
function load(values::Array{Float64}, name::String) | ||
n_facilities = convert(Int64, values[1]) | ||
n_customers = convert(Int64, values[2]) | ||
|
||
counter = 3 | ||
|
||
capacities = convert.(Int64, values[counter:2:counter + 2 * n_facilities - 1]) | ||
fixed_costs = values[counter + 1:2:counter + 2 * n_facilities - 1] | ||
|
||
counter += 2 * n_facilities | ||
|
||
customers = CFLPCustomer[] | ||
for j in 1:n_customers | ||
push!(customers, CFLPCustomer(j, convert(Int64, values[counter]), values[counter + 1:counter + n_facilities])) | ||
counter += n_facilities + 1 | ||
end | ||
|
||
facilities = [ CFLPFacility(i, capacities[i], fixed_costs[i], [ c.costs[i] for c in customers ]) for i in 1:n_facilities ] | ||
|
||
return CFLPData(name, facilities, customers, -Inf, Inf) | ||
end |
Oops, something went wrong.