Loading...
Searching...
No Matches
FLP_Instance.h
1//
2// Created by henri on 03/11/22.
3//
4
5#ifndef IDOL_FLP_INSTANCE_H
6#define IDOL_FLP_INSTANCE_H
7
8#include <vector>
9#include <string>
10#include <optional>
11
12namespace idol::Problems::FLP {
13 class Instance;
14
31 Instance read_instance_2021_Cheng_et_al(const std::string& t_filename, double t_d, bool t_use_haversine = false, bool t_is_symetric = true);
32
33 Instance read_instance_1991_Cornuejols_et_al(const std::string& t_filename);
34
35 Instance generate_instance_1991_Cornuejols_et_al(unsigned int t_n_facilities, unsigned int t_n_customers, double t_ratio_capacity_over_demand);
36}
37
39 // For each facility
40 std::vector<double> m_fixed_costs;
41 std::vector<double> m_capacities;
42
43 // For each customer
44 std::vector<double> m_demands;
45 std::optional<std::vector<double>> m_per_unit_penalties;
46
47 // For each (facility, customer)
48 std::vector<std::vector<double>> m_per_unit_transportation_costs;
49public:
50 explicit Instance(unsigned int t_n_facilities, unsigned int t_n_customers);
51
52 [[nodiscard]] unsigned int n_facilities() const { return m_fixed_costs.size(); }
53 [[nodiscard]] unsigned int n_customers() const { return m_demands.size(); }
54
55 [[nodiscard]] virtual double fixed_cost(unsigned int t_i) const { return m_fixed_costs[t_i]; }
56 [[nodiscard]] virtual double capacity(unsigned int t_i) const { return m_capacities[t_i]; }
57 [[nodiscard]] virtual double demand(unsigned int t_j) const { return m_demands[t_j]; }
58 [[nodiscard]] virtual double per_unit_transportation_cost(unsigned int t_i, unsigned int t_j) const { return m_per_unit_transportation_costs[t_i][t_j]; }
59 [[nodiscard]] virtual bool has_penalties() const { return m_per_unit_penalties.has_value(); }
60 [[nodiscard]] virtual double per_unit_penalty(unsigned int t_j) const { return (*m_per_unit_penalties)[t_j]; }
61
62 void set_fixed_cost(unsigned int t_i, double t_value) { m_fixed_costs[t_i] = t_value; }
63 void set_capacity(unsigned int t_i, double t_value) { m_capacities[t_i] = t_value; }
64 void set_demand(unsigned int t_j, double t_value) { m_demands[t_j] = t_value; }
65 void set_per_unit_transportation_cost(unsigned int t_i, unsigned int t_j, double t_value) { m_per_unit_transportation_costs[t_i][t_j] = t_value; }
66 void set_per_unit_penalty(unsigned int t_j, double t_value);
67
68};
69
70namespace idol::Problems::FLP {
71 std::ostream& operator<<(std::ostream& t_os, const idol::Problems::FLP::Instance& t_instance);
72}
73
74#endif //IDOL_FLP_INSTANCE_H