Skip to content

Commit

Permalink
Merge pull request #1 from rafaelmartinelli/first-version
Browse files Browse the repository at this point in the history
v0.1.0
  • Loading branch information
rafaelmartinelli authored May 17, 2021
2 parents 3f12403 + 9c4faba commit cb59a3f
Show file tree
Hide file tree
Showing 49 changed files with 451 additions and 10 deletions.
8 changes: 5 additions & 3 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
name: CI
on:
- push
- pull_request
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened]
jobs:
test:
name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }}
Expand All @@ -11,7 +14,6 @@ jobs:
matrix:
version:
- '1.6'
- 'nightly'
os:
- ubuntu-latest
arch:
Expand Down
19 changes: 19 additions & 0 deletions Manifest.toml
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"
3 changes: 3 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ uuid = "3771e204-432d-45a9-9661-5d0025a53671"
authors = ["Rafael Martinelli"]
version = "0.1.0"

[deps]
ZipFile = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea"

[compat]
julia = "1.6"

Expand Down
82 changes: 78 additions & 4 deletions README.md
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 added data/cap101.zip
Binary file not shown.
Binary file added data/cap102.zip
Binary file not shown.
Binary file added data/cap103.zip
Binary file not shown.
Binary file added data/cap104.zip
Binary file not shown.
Binary file added data/cap111.zip
Binary file not shown.
Binary file added data/cap112.zip
Binary file not shown.
Binary file added data/cap113.zip
Binary file not shown.
Binary file added data/cap114.zip
Binary file not shown.
Binary file added data/cap121.zip
Binary file not shown.
Binary file added data/cap122.zip
Binary file not shown.
Binary file added data/cap123.zip
Binary file not shown.
Binary file added data/cap124.zip
Binary file not shown.
Binary file added data/cap131.zip
Binary file not shown.
Binary file added data/cap132.zip
Binary file not shown.
Binary file added data/cap133.zip
Binary file not shown.
Binary file added data/cap134.zip
Binary file not shown.
Binary file added data/cap41.zip
Binary file not shown.
Binary file added data/cap42.zip
Binary file not shown.
Binary file added data/cap43.zip
Binary file not shown.
Binary file added data/cap44.zip
Binary file not shown.
Binary file added data/cap51.zip
Binary file not shown.
Binary file added data/cap61.zip
Binary file not shown.
Binary file added data/cap62.zip
Binary file not shown.
Binary file added data/cap63.zip
Binary file not shown.
Binary file added data/cap64.zip
Binary file not shown.
Binary file added data/cap71.zip
Binary file not shown.
Binary file added data/cap72.zip
Binary file not shown.
Binary file added data/cap73.zip
Binary file not shown.
Binary file added data/cap74.zip
Binary file not shown.
Binary file added data/cap81.zip
Binary file not shown.
Binary file added data/cap82.zip
Binary file not shown.
Binary file added data/cap83.zip
Binary file not shown.
Binary file added data/cap84.zip
Binary file not shown.
Binary file added data/cap91.zip
Binary file not shown.
Binary file added data/cap92.zip
Binary file not shown.
Binary file added data/cap93.zip
Binary file not shown.
Binary file added data/cap94.zip
Binary file not shown.
Binary file added data/capa.zip
Binary file not shown.
Binary file added data/capb.zip
Binary file not shown.
Binary file added data/capc.zip
Binary file not shown.
9 changes: 8 additions & 1 deletion src/CFLPLib.jl
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
36 changes: 36 additions & 0 deletions src/Data.jl
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
47 changes: 47 additions & 0 deletions src/Loader.jl
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
Loading

0 comments on commit cb59a3f

Please sign in to comment.