This problem represents the optimal planning of COVID-19 vaccine supply chain between Vaccine Storage Units and Vaccination Centers. The goal of the problem is to minimize the total costs, including storage, transportation costs and extra transportation costs due to different supply conditions of each vaccine.
| Vaccine Supply Chain |
|---|
As it can be seen in the above visual, Vaccine Supply Chain is very huge and it is quite important. However, in this optimization problem, only the supply chain between vaccine storages and local vaccination centers has been illustrated simply.
First, vaccines that are supplied from factories arrive to the Vaccine Stroge Units(VSU). After arriving to the VSU, according to the demand of each Vaccine Center (VC), vaccines are transferred to the VCs. However, there are vaccines that remain after this process due to the stock and demand of each vaccine. In this case, there are holding costs for both VSUs and VCs to store the vaccines. All vaccine types' stocks at Vaccine Stroge Units (VSU), their demands at Vaccination Centers (VC), and their extra costs due to their stroge requirements are provided.
In the problem, three vaccines with different characteristics are studied. In particular, the vaccines of AstraZeneca, Moderna and Pfizer are considered. Each vaccine type has different holding requirements, deep freezers (−70 °C) are required for Pfizer and regular freezers (−20 °C) for Moderna vaccines, while simple refrigeration is enough for AstraZeneca. As each vaccine has different requirements for supplying, extra supply chain cost for each vaccine was determined. Pfizer has the highest cost as its transportation expenses are higher, and Moderna has the second highest price while AstraZeneca has the least price. Moreover, the capacity of holding the vaccines at both VSUs and VCs was determined randomly by generating the random number of refrigerations for each type of vaccine. Then these numbers are multiplied by 100, because it has been assumed that each freezer could keep 100 units. In this problem, each VSU and VC have each type of refrigeration technologies. Therefore, there is no zero capacity. However, as the problem is continous linear problem, this situation also can be examined when the associated data provided.
In this problem, there are 3 types of vaccines, five Vaccine Stroge Units and 13 Vaccination Centers, each with a known demand for each vaccine. Vaccination centers' demand can be supplied from five VSUs. There are known costs associated with transporting each type of vaccine, from a VSU to a VC.
-Shipping distance between VSUs and VCs are given in the following table:
| Distance between VSUs and VCs | VC1 | VC2 | VC3 | VC4 | VC5 | VC6 | VC7 | VC8 | VC9 | VC10 | VC11 | VC12 | VC13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VSU1 | 3.29 | 3.32 | 3.13 | 3.16 | 3.14 | 3.58 | 5.58 | 8.72 | 9.13 | 3.95 | 7.79 | 7.11 | 4.27 |
| VSU2 | 4.13 | 5.69 | 8.67 | 7.9 | 7.71 | 5.47 | 5.72 | 6.32 | 4.28 | 8.31 | 9.55 | 3.25 | 1.44 |
| VSU3 | 2.49 | 6.80 | 2.76 | 8.59 | 4.72 | 2.38 | 7.50 | 4.34 | 7.19 | 5.36 | 5.16 | 8.37 | 8.81 |
| VSU4 | 6.36 | 4.65 | 8.22 | 7.16 | 8.55 | 2.47 | 7.69 | 2.45 | 6.77 | 1.03 | 5.33 | 1.31 | 6.25 |
| VSU5 | 3.21 | 3.43 | 6.13 | 2.39 | 8.74 | 6.68 | 4.00 | 4.19 | 8.95 | 7.29 | 6.16 | 4.93 | 8.33 |
-Stocks for each Vaccine type at each VSU:
| Vaccine Stroge Units (in vials) | VSU1 | VSU2 | VSU3 | VSU4 | VSU5 |
|---|---|---|---|---|---|
| Pfizer | 1850 | 2450 | 1735 | 2500 | 1400 |
| Moderna | 1600 | 2400 | 1200 | 2100 | 3500 |
| AstraZeneca | 4000 | 3800 | 2800 | 4100 | 3800 |
-Stocks capacity after shipping to VCs for each Vaccine type at each VSU:
| Vaccine Stroge Capacity Units (in vials) | VSU1 | VSU2 | VSU3 | VSU4 | VSU5 |
|---|---|---|---|---|---|
| Pfizer | 1700 | 4500 | 2200 | 3100 | 1100 |
| Moderna | 2700 | 2100 | 1800 | 2000 | 3800 |
| AstraZeneca | 4700 | 4100 | 2100 | 4200 | 3800 |
| Holding Cost(€) | 7.0 | 5.0 | 7.5 | 7.0 | 4.0 |
-Each vaccine can be shipped from a Vaccine Storage Unit to a set of vaccination centers. The flow amount is depending on each Vaccination center demands.
| Vaccine Demands | VC1 | VC2 | VC3 | VC4 | VC5 | VC6 | VC7 | VC8 | VC9 | VC10 | VC11 | VC12 | VC13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pfizer | 1100 | 750 | 375 | 580 | 950 | 970 | 440 | 745 | 465 | 631 | 920 | 1260 | 730 |
| Moderna | 960 | 885 | 505 | 1040 | 920 | 720 | 460 | 1100 | 830 | 820 | 495 | 970 | 960 |
| AstraZeneca | 2430 | 1500 | 990 | 870 | 1140 | 2060 | 1010 | 1620 | 1390 | 910 | 420 | 1890 | 510 |
-Each vaccination center has a maximum capacity of storing the vaccines. Vaccine centers can hold the vaccines more than demand if the capacity constarints is provided, therefore, vaccines can be kept at VCs until they are used for the people.
| Vaccine Capacity | VC1 | VC2 | VC3 | VC4 | VC5 | VC6 | VC7 | VC8 | VC9 | VC10 | VC11 | VC12 | VC13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pfizer | 1400 | 800 | 500 | 600 | 955 | 975 | 445 | 750 | 475 | 635 | 930 | 1300 | 740 |
| Moderna | 1000 | 890 | 510 | 1050 | 950 | 750 | 500 | 1105 | 840 | 830 | 500 | 980 | 980 |
| AstraZeneca | 2600 | 1700 | 1200 | 950 | 1400 | 2400 | 1200 | 2000 | 1800 | 1300 | 800 | 2400 | 600 |
| Holding Cost(€) | 3.5 | 8.0 | 9.7 | 6.5 | 4.5 | 5.0 | 9.0 | 8.0 | 7.2 | 8.4 | 4.2 | 3.6 | 9.5 |
-Extra Shipping cost (Extra shipping cost*Amount of vaccine units) of each vaccine (in units) from the VSUs to the VCs.
| Extra Shipping Cost | Cost (in euros per unit) |
|---|---|
| Pfizer | x 6.5 |
| Moderna | x 4.75 |
| AstraZeneca | x 2.25 |
The question to be answered is how to satisfy the demand of the each Vaccination Center while minimizing the total cost.
$f \in \text{Vaccine Storage Units}=\{\text{VSU1}, \text{VSU2}, \text{VSU3},\text{VSU4},\text{VSU5}\}$
$d \in \text{Vaccine Centers}=\{\text{VC 1}, \text{VC 2}, \text{VC 3}, \text{VC 4}, \text{VC 5}, \text{VC 6}, \text{VC 7}, \text{VC 8}, \text{VC 9}, \text{VC 10}, \text{VC 11}, \text{VC 12}, \text{VC 13}\}$
$v \in \text{Vaccines}=\{\text{Pfizer}, \text{Moderna}, \text{AstraZeneca}\}$
$\text{Tc} \in \mathbb{R}^+$: Transportation cost per distance units.
$\text{Hc}_{f} \in \mathbb{R}^+$: Holding cost at VSUs in vials (€).
$\text{Hc}_{d} \in \mathbb{R}^+$: Holding cost at VCs in vials (€).
$\text{dist}_{f,d} \in \mathbb{R}^+$: Distance of shipping units from VSU $f$ to vaccination center $d$.
$\text{extracost}_{v} \in \mathbb{R}^+$: Extra shipping cost for each type of vaccine $v$.
$\text{stock}_{v,f} \in \mathbb{R}^+$: Stock of each vaccine $v$ at VSUs $f$ that distributed from factories (in units).
$\text{storage_cap}_{v,f} \in \mathbb{R}^+$: Maximum possible stroge of vaccine $v$ at VSU $f$ (in units).
$\text{cap}_{v,d} \in \mathbb{R}^+$: Maximum possible storage for each vaccine $v$ at vaccine center $d$ (in units).
$\text{demand}_{v,d} \in \mathbb{R}^+$: Demand for each vaccine $v$ at each vaccine center $d$ (in units).
$\text{X}_{v,f,d} \in \mathbb{N}^+$: Quantity of vaccines $v$ (in units) that is shipped from source $f$ to destionation $d$.
Data of the Vaccine Model
import numpy as np
F = list(range(1,6));
D = list(range(1,14));
V = list(range(1,4));
Tc = 5;
dist = np.array([[3.29 ,3.32 ,3.13 ,3.16 ,3.14 ,3.58 ,5.58 ,8.72 , 9.13 , 3.95 ,7.79 ,7.11 ,4.27 ] ,
[4.13 ,5.69 ,8.67 ,7.9 ,7.71 ,5.47 ,5.72 ,6.32 , 4.28 , 8.31 ,9.55 ,3.25 ,1.44 ] ,
[2.49 ,6.80 ,2.76 ,8.59 ,4.72 ,2.38 ,7.50 ,4.34 , 7.19 , 5.36 ,5.16 ,8.37 ,8.81 ] ,
[6.36 ,4.65 ,8.22 ,7.16 ,8.55 ,2.47 ,7.69 ,2.45 , 6.77 , 1.03 ,5.33 ,1.31 ,6.25 ] ,
[3.21 ,3.43 ,6.13 ,2.39 ,8.74 ,6.68 ,4.00 ,4.19 , 8.95 , 7.29 ,6.16 ,4.93 ,8.33 ] ]);
extracost = np.array([ 6.5,4.75,2.25 ]);
Hc_VSU = np.array([7.0, 5.0, 7.5, 7.0, 4.0]);
Hc_VC = np.array([3.5,8.0,9.7,6.5,4.5,5.0,9.0,8.0,7.2,8.4,4.2,3.6,9.5]);
stock = np.array([[1850 ,2450 ,1735 ,2500 ,1400],
[1600 ,2400 ,1200 ,2100 ,3500],
[4000 ,3800 ,2800 ,4100 ,3800]]);
storage_cap = np.array([[1700, 4500, 2200, 3100, 1100],
[2700, 2100, 1800, 2000, 3800],
[4700, 4100, 2100, 4200, 3800]]);
demand =np.array([[1100 ,750 ,375 ,580 ,950 ,970 ,440 ,745 ,465 ,630 ,920 ,1260 ,730 ],
[960 ,885 ,505 ,1040 ,920 ,720 ,460 ,1100 ,830 ,820 ,495 ,970 ,960 ],
[2430 ,1500 ,990 ,870 ,1140 ,2060 ,1010 ,1620 ,1390 ,910 ,420 ,1890 ,510 ]]);
cap = np.array([[1400 ,800 ,500 ,600 ,955 ,975 ,445 ,750 ,475 ,635 ,930 ,1300 ,740],
[1000 ,890 ,510 ,1050 ,950 ,750 ,500 ,1105 ,840 ,830 ,500 ,980 ,980],
[2600 ,1700 ,1200 ,950 ,1400 ,2400 ,1200 ,2000 ,1800,1300,800 ,2400 ,600]]);
Vaccine model sets, parameters, variables, objective function and constraints:
from pyomo.environ import *
opt = SolverFactory('glpk')
model = ConcreteModel(name="Vaccine Model")
#Sets#
# Vaccine Stroge Units
model.F = Set(initialize=F)
# Vaccine Centers
model.D = Set(initialize=D)
# Vaccine Types
model.V = Set(initialize=V)
# decision variables
model.X = Var(model.V,model.F,model.D, domain= NonNegativeReals)
# Minimize the cost
def cost_rule(model):
return sum(sum(sum(extracost[v-1]*model.X[v,f,d] for d in model.D) for f in model.F) for v in model.V)+\
sum(sum(Tc*dist[f-1,d-1] for d in model.V) for f in model.F)+\
sum(sum(sum(Hc_VSU[f-1]*(stock[v-1,f-1] - model.X[v,f,d]) for d in model.D) for v in model.V) for f in model.F)+\
sum(sum(sum(Hc_VC[d-1]*(model.X[v,f,d] - demand[v-1,d-1]) for f in model.F) for v in model.V) for d in model.D)
model.Obj = Objective(rule=cost_rule, sense=minimize)
#Constraints
#at least 80% of the stock must be shipped.
def flow(model,v,f):
return sum(model.X[v,f,d] for d in model.D) >= stock[v-1,f-1]*0.80
model.flow_const = Constraint(model.V,model.F, rule=flow)
#At least 2 vials for each type of vaccine must be kept in the storage.
def stock_flow_limit(model,v,f):
return stock[v-1,f-1]-sum(model.X[v,f,d] for d in model.D) >= 2
model.stock_const = Constraint(model.V,model.F, rule=stock_flow_limit)
#After transforming the vaccines from a VSU, the remaining stocks must respect to the maximum storage capacity.
def storage_output(model,v, f):
return stock[v-1,f-1] - sum(model.X[v,f,d] for d in model.D) <= storage_cap[v-1,f-1]
model.storage_const = Constraint(model.V,model.F, rule=storage_output)
#The amount of vaccine shipped from VSU to VC must be greater than or equal to the vaccine demand at VCs.
def vc_demand(model,v,d):
return sum(model.X[v,f,d] for f in model.F) >= demand[v-1,d-1]
model.demand_const = Constraint(model.V, model.D, rule=vc_demand)
#Flow of vaccines from a VSU to a VC must respect maximum storing capacity.
def vc_capacity(model,v,d):
return sum(model.X[v,f,d] for f in model.F) <= cap[v-1,d-1]
model.cap_const = Constraint(model.V, model.D, rule=vc_capacity)
#load dual information
model.dual = Suffix(direction=Suffix.IMPORT)
#solve
results = opt.solve(model, tee=True)
#model.Obj()
model.display()
#model.dual.display()
GLPSOL--GLPK LP/MIP Solver 5.0
Parameter(s) specified in the command line:
--write C:\Users\belce\AppData\Local\Temp\tmp7w9wr2e7.glpk.raw --wglp C:\Users\belce\AppData\Local\Temp\tmpsrscusg2.glpk.glp
--cpxlp C:\Users\belce\AppData\Local\Temp\tmp87vmk3ju.pyomo.lp
Reading problem data from 'C:\Users\belce\AppData\Local\Temp\tmp87vmk3ju.pyomo.lp'...
124 rows, 196 columns, 976 non-zeros
1747 lines were read
Writing problem data to 'C:\Users\belce\AppData\Local\Temp\tmpsrscusg2.glpk.glp'...
1619 lines were written
GLPK Simplex Optimizer 5.0
124 rows, 196 columns, 976 non-zeros
Preprocessing...
113 rows, 195 columns, 845 non-zeros
Scaling...
A: min|aij| = 1.000e+00 max|aij| = 1.000e+00 ratio = 1.000e+00
Problem data seem to be well scaled
Constructing initial basis...
Size of triangular part is 113
0: obj = 1.869228900e+06 inf = 7.026e+04 (59)
71: obj = 2.034273650e+06 inf = 0.000e+00 (0)
* 78: obj = 2.031703550e+06 inf = 0.000e+00 (0)
OPTIMAL LP SOLUTION FOUND
Time used: 0.0 secs
Memory used: 0.3 Mb (304467 bytes)
Writing basic solution to 'C:\Users\belce\AppData\Local\Temp\tmp7w9wr2e7.glpk.raw'...
329 lines were written
Model Vaccine Model
Variables:
X : Size=195, Index=X_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1, 1) : 0 : 972.0 : None : False : False : NonNegativeReals
(1, 1, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 10) : 0 : 630.0 : None : False : False : NonNegativeReals
(1, 1, 11) : 0 : 246.0 : None : False : False : NonNegativeReals
(1, 1, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 1, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 2) : 0 : 750.0 : None : False : False : NonNegativeReals
(1, 2, 3) : 0 : 375.0 : None : False : False : NonNegativeReals
(1, 2, 4) : 0 : 580.0 : None : False : False : NonNegativeReals
(1, 2, 5) : 0 : 743.0 : None : False : False : NonNegativeReals
(1, 2, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 2, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 5) : 0 : 207.0 : None : False : False : NonNegativeReals
(1, 3, 6) : 0 : 796.0 : None : False : False : NonNegativeReals
(1, 3, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 3, 13) : 0 : 730.0 : None : False : False : NonNegativeReals
(1, 4, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 4, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 4, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 4, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 4, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 4, 6) : 0 : 174.0 : None : False : False : NonNegativeReals
(1, 4, 7) : 0 : 440.0 : None : False : False : NonNegativeReals
(1, 4, 8) : 0 : 745.0 : None : False : False : NonNegativeReals
(1, 4, 9) : 0 : 465.0 : None : False : False : NonNegativeReals
(1, 4, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 4, 11) : 0 : 674.0 : None : False : False : NonNegativeReals
(1, 4, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 4, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 1) : 0 : 128.0 : None : False : False : NonNegativeReals
(1, 5, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(1, 5, 12) : 0 : 1260.0 : None : False : False : NonNegativeReals
(1, 5, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 6) : 0 : 38.0 : None : False : False : NonNegativeReals
(2, 1, 7) : 0 : 460.0 : None : False : False : NonNegativeReals
(2, 1, 8) : 0 : 1100.0 : None : False : False : NonNegativeReals
(2, 1, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 1, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 1) : 0 : 481.0 : None : False : False : NonNegativeReals
(2, 2, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 2, 10) : 0 : 452.0 : None : False : False : NonNegativeReals
(2, 2, 11) : 0 : 495.0 : None : False : False : NonNegativeReals
(2, 2, 12) : 0 : 970.0 : None : False : False : NonNegativeReals
(2, 2, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 9) : 0 : 830.0 : None : False : False : NonNegativeReals
(2, 3, 10) : 0 : 368.0 : None : False : False : NonNegativeReals
(2, 3, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 3, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 1) : 0 : 479.0 : None : False : False : NonNegativeReals
(2, 4, 2) : 0 : 885.0 : None : False : False : NonNegativeReals
(2, 4, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 4, 13) : 0 : 734.0 : None : False : False : NonNegativeReals
(2, 5, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 3) : 0 : 505.0 : None : False : False : NonNegativeReals
(2, 5, 4) : 0 : 1040.0 : None : False : False : NonNegativeReals
(2, 5, 5) : 0 : 920.0 : None : False : False : NonNegativeReals
(2, 5, 6) : 0 : 682.0 : None : False : False : NonNegativeReals
(2, 5, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(2, 5, 13) : 0 : 226.0 : None : False : False : NonNegativeReals
(3, 1, 1) : 0 : 1988.0 : None : False : False : NonNegativeReals
(3, 1, 2) : 0 : 1500.0 : None : False : False : NonNegativeReals
(3, 1, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 1, 13) : 0 : 510.0 : None : False : False : NonNegativeReals
(3, 2, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 3) : 0 : 990.0 : None : False : False : NonNegativeReals
(3, 2, 4) : 0 : 870.0 : None : False : False : NonNegativeReals
(3, 2, 5) : 0 : 1140.0 : None : False : False : NonNegativeReals
(3, 2, 6) : 0 : 40.0 : None : False : False : NonNegativeReals
(3, 2, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 2, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 1) : 0 : 424.0 : None : False : False : NonNegativeReals
(3, 3, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 8) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 3, 11) : 0 : 420.0 : None : False : False : NonNegativeReals
(3, 3, 12) : 0 : 1954.0 : None : False : False : NonNegativeReals
(3, 3, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 1) : 0 : 188.0 : None : False : False : NonNegativeReals
(3, 4, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 6) : 0 : 2020.0 : None : False : False : NonNegativeReals
(3, 4, 7) : 0 : 1010.0 : None : False : False : NonNegativeReals
(3, 4, 8) : 0 : 880.0 : None : False : False : NonNegativeReals
(3, 4, 9) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 10) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 4, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 1) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 2) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 3) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 4) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 5) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 6) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 7) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 8) : 0 : 740.0 : None : False : False : NonNegativeReals
(3, 5, 9) : 0 : 1390.0 : None : False : False : NonNegativeReals
(3, 5, 10) : 0 : 910.0 : None : False : False : NonNegativeReals
(3, 5, 11) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 12) : 0 : 0.0 : None : False : False : NonNegativeReals
(3, 5, 13) : 0 : 0.0 : None : False : False : NonNegativeReals
Objectives:
Obj : Size=1, Index=None, Active=True
Key : Active : Value
None : True : 2031703.5499999998
Constraints:
flow_const : Size=15
Key : Lower : Body : Upper
(1, 1) : 1480.0 : 1848.0 : None
(1, 2) : 1960.0 : 2448.0 : None
(1, 3) : 1388.0 : 1733.0 : None
(1, 4) : 2000.0 : 2498.0 : None
(1, 5) : 1120.0 : 1388.0 : None
(2, 1) : 1280.0 : 1598.0 : None
(2, 2) : 1920.0 : 2398.0 : None
(2, 3) : 960.0 : 1198.0 : None
(2, 4) : 1680.0 : 2098.0 : None
(2, 5) : 2800.0 : 3373.0 : None
(3, 1) : 3200.0 : 3998.0 : None
(3, 2) : 3040.0 : 3040.0 : None
(3, 3) : 2240.0 : 2798.0 : None
(3, 4) : 3280.0 : 4098.0 : None
(3, 5) : 3040.0 : 3040.0 : None
stock_const : Size=15
Key : Lower : Body : Upper
(1, 1) : 2.0 : 2.0 : None
(1, 2) : 2.0 : 2.0 : None
(1, 3) : 2.0 : 2.0 : None
(1, 4) : 2.0 : 2.0 : None
(1, 5) : 2.0 : 12.0 : None
(2, 1) : 2.0 : 2.0 : None
(2, 2) : 2.0 : 2.0 : None
(2, 3) : 2.0 : 2.0 : None
(2, 4) : 2.0 : 2.0 : None
(2, 5) : 2.0 : 127.0 : None
(3, 1) : 2.0 : 2.0 : None
(3, 2) : 2.0 : 760.0 : None
(3, 3) : 2.0 : 2.0 : None
(3, 4) : 2.0 : 2.0 : None
(3, 5) : 2.0 : 760.0 : None
storage_const : Size=15
Key : Lower : Body : Upper
(1, 1) : None : 2.0 : 1700.0
(1, 2) : None : 2.0 : 4500.0
(1, 3) : None : 2.0 : 2200.0
(1, 4) : None : 2.0 : 3100.0
(1, 5) : None : 12.0 : 1100.0
(2, 1) : None : 2.0 : 2700.0
(2, 2) : None : 2.0 : 2100.0
(2, 3) : None : 2.0 : 1800.0
(2, 4) : None : 2.0 : 2000.0
(2, 5) : None : 127.0 : 3800.0
(3, 1) : None : 2.0 : 4700.0
(3, 2) : None : 760.0 : 4100.0
(3, 3) : None : 2.0 : 2100.0
(3, 4) : None : 2.0 : 4200.0
(3, 5) : None : 760.0 : 3800.0
demand_const : Size=39
Key : Lower : Body : Upper
(1, 1) : 1100.0 : 1100.0 : None
(1, 2) : 750.0 : 750.0 : None
(1, 3) : 375.0 : 375.0 : None
(1, 4) : 580.0 : 580.0 : None
(1, 5) : 950.0 : 950.0 : None
(1, 6) : 970.0 : 970.0 : None
(1, 7) : 440.0 : 440.0 : None
(1, 8) : 745.0 : 745.0 : None
(1, 9) : 465.0 : 465.0 : None
(1, 10) : 630.0 : 630.0 : None
(1, 11) : 920.0 : 920.0 : None
(1, 12) : 1260.0 : 1260.0 : None
(1, 13) : 730.0 : 730.0 : None
(2, 1) : 960.0 : 960.0 : None
(2, 2) : 885.0 : 885.0 : None
(2, 3) : 505.0 : 505.0 : None
(2, 4) : 1040.0 : 1040.0 : None
(2, 5) : 920.0 : 920.0 : None
(2, 6) : 720.0 : 720.0 : None
(2, 7) : 460.0 : 460.0 : None
(2, 8) : 1100.0 : 1100.0 : None
(2, 9) : 830.0 : 830.0 : None
(2, 10) : 820.0 : 820.0 : None
(2, 11) : 495.0 : 495.0 : None
(2, 12) : 970.0 : 970.0 : None
(2, 13) : 960.0 : 960.0 : None
(3, 1) : 2430.0 : 2600.0 : None
(3, 2) : 1500.0 : 1500.0 : None
(3, 3) : 990.0 : 990.0 : None
(3, 4) : 870.0 : 870.0 : None
(3, 5) : 1140.0 : 1140.0 : None
(3, 6) : 2060.0 : 2060.0 : None
(3, 7) : 1010.0 : 1010.0 : None
(3, 8) : 1620.0 : 1620.0 : None
(3, 9) : 1390.0 : 1390.0 : None
(3, 10) : 910.0 : 910.0 : None
(3, 11) : 420.0 : 420.0 : None
(3, 12) : 1890.0 : 1954.0 : None
(3, 13) : 510.0 : 510.0 : None
cap_const : Size=39
Key : Lower : Body : Upper
(1, 1) : None : 1100.0 : 1400.0
(1, 2) : None : 750.0 : 800.0
(1, 3) : None : 375.0 : 500.0
(1, 4) : None : 580.0 : 600.0
(1, 5) : None : 950.0 : 955.0
(1, 6) : None : 970.0 : 975.0
(1, 7) : None : 440.0 : 445.0
(1, 8) : None : 745.0 : 750.0
(1, 9) : None : 465.0 : 475.0
(1, 10) : None : 630.0 : 635.0
(1, 11) : None : 920.0 : 930.0
(1, 12) : None : 1260.0 : 1300.0
(1, 13) : None : 730.0 : 740.0
(2, 1) : None : 960.0 : 1000.0
(2, 2) : None : 885.0 : 890.0
(2, 3) : None : 505.0 : 510.0
(2, 4) : None : 1040.0 : 1050.0
(2, 5) : None : 920.0 : 950.0
(2, 6) : None : 720.0 : 750.0
(2, 7) : None : 460.0 : 500.0
(2, 8) : None : 1100.0 : 1105.0
(2, 9) : None : 830.0 : 840.0
(2, 10) : None : 820.0 : 830.0
(2, 11) : None : 495.0 : 500.0
(2, 12) : None : 970.0 : 980.0
(2, 13) : None : 960.0 : 980.0
(3, 1) : None : 2600.0 : 2600.0
(3, 2) : None : 1500.0 : 1700.0
(3, 3) : None : 990.0 : 1200.0
(3, 4) : None : 870.0 : 950.0
(3, 5) : None : 1140.0 : 1400.0
(3, 6) : None : 2060.0 : 2400.0
(3, 7) : None : 1010.0 : 1200.0
(3, 8) : None : 1620.0 : 2000.0
(3, 9) : None : 1390.0 : 1800.0
(3, 10) : None : 910.0 : 1300.0
(3, 11) : None : 420.0 : 800.0
(3, 12) : None : 1954.0 : 2400.0
(3, 13) : None : 510.0 : 600.0
#check dual information
dual_flow = np.zeros((len(V),len(F)))
for v in range(0,len(V)):
for f in range(0,len(F)):
dual_flow[v][f]=model.dual[model.flow_const[v+1,f+1]]
dual_stock = np.zeros((len(V),len(F)))
for v in range(0,len(V)):
for f in range(0,len(F)):
dual_stock[v][f]=model.dual[model.stock_const[v+1,f+1]]
dual_storage = np.zeros((len(V),len(F)))
for v in range(0,len(V)):
for f in range(0,len(F)):
dual_storage[v][f]=model.dual[model.storage_const[v+1,f+1]]
dual_cap = np.zeros((len(V),len(D)))
for v in range(0,len(V)):
for d in range(0,len(D)):
dual_cap[v][d]=model.dual[model.cap_const[v+1,d+1]]
dual_demand=np.zeros((len(V),len(D)))
for v in range(0,len(V)):
for d in range(0,len(D)):
dual_demand[v][d]=model.dual[model.demand_const[v+1,d+1]]
print('sensitivity min flow of vaccine from VSUs to VCs= \n' ,dual_flow)
print('sensitivity min amount of vials have to be kept at VSUs= \n' ,dual_stock)
print('sensitivity max capacity of VSUs= \n' ,dual_storage)
print('sensitivity max capacity of VCs= \n' ,dual_cap)
print('sensitivity minimum demand of VCs= \n' ,dual_demand)
sensitivity min flow of vaccine from VSUs to VCs= [[0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. ] [0. 0.85 0. 0. 1.85]] sensitivity min amount of vials have to be kept at VSUs= [[3. 1. 3.5 3. 0. ] [3. 1. 3.5 3. 0. ] [1.15 0. 1.65 1.15 0. ]] sensitivity max capacity of VSUs= [[0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.]] sensitivity max capacity of VCs= [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [-0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]] sensitivity minimum demand of VCs= [[ 6. 10.5 12.2 9. 7. 7.5 11.5 10.5 9.7 10.9 6.7 6.1 12. ] [ 4.25 8.75 10.45 7.25 5.25 5.75 9.75 8.75 7.95 9.15 4.95 4.35 10.25] [ 0. 4.4 6.1 2.9 0.9 1.4 5.4 4.4 3.6 4.8 0.6 0. 5.9 ]]
Thanks to the sensitivity analysis, the most important constraints of the model can be determined. Each active constraint has an associated 'shadow price' as shown in the above sensitivity results of each constraint. For inequality constraints in a minimization problem, a positive optimal dual value in ">=" constraint is active, and a negative optimal dual value indicates that "<=" inequality constraint is active ´n the solution.
Only for the maximum capacity of VCs constraint there is a negative value which is -0.1. It indicates that the capacity of AstraZeneca (3rd vaccine) at VCs has an active role in the problem. However, it does not have a huge impact on the objective function.
The other parameters in max capacity of VCs have no impact on the OF. Additionally, the other capacity constaint at VSUs has no impact on the OF. All dual values are 0.
The constaint of the flow amount from VSUs to VCs that must be at least 80% of the stock, does not have a huge impact on the OF. However, only the stocks of AstraZeneca(3rd vaccine) at VSU2 and VSU5 have an impact on the OF.
The stock and demand constraints have great impacts on the OF. The changes on the both parameters can affect on the OF. For instance if demand parameter is increased, the OF is decreasing. If stock is increased, the total cost is increasing according to stock[v-1,f-1] - model.X[v,f,d] statement on the OF.
If the constraint right hand side value increases, objective function of the model will change according to the dual value. In this case when the associated demand parameter is increased one unit, the OF decreases by the corresponding dual value.
## DATA
import numpy as np
#sets
F = list(range(1,6));
D = list(range(1,14));
V = list(range(1,4));
#parameters
Tc = 5;
dist = np.array([[3.29 ,3.32 ,3.13 ,3.16 ,3.14 ,3.58 ,5.58 ,8.72 , 9.13 , 3.95 ,7.79 ,7.11 ,4.27 ] ,
[4.13 ,5.69 ,8.67 ,7.9 ,7.71 ,5.47 ,5.72 ,6.32 , 4.28 , 8.31 ,9.55 ,3.25 ,1.44 ] ,
[2.49 ,6.80 ,2.76 ,8.59 ,4.72 ,2.38 ,7.50 ,4.34 , 7.19 , 5.36 ,5.16 ,8.37 ,8.81 ] ,
[6.36 ,4.65 ,8.22 ,7.16 ,8.55 ,2.47 ,7.69 ,2.45 , 6.77 , 1.03 ,5.33 ,1.31 ,6.25 ] ,
[3.21 ,3.43 ,6.13 ,2.39 ,8.74 ,6.68 ,4.00 ,4.19 , 8.95 , 7.29 ,6.16 ,4.93 ,8.33 ] ]);
extracost = np.array([ 6.5,4.75,2.25 ]);
Hc_VSU = np.array([7.0, 5.0, 7.5, 7.0, 4.0]);
Hc_VC = np.array([3.5,8.0,9.7,6.5,4.5,5.0,9.0,8.0,7.2,8.4,4.2,3.6,9.5]);
stock = np.array([[1850 ,2450 ,1735 ,2500 ,1400],
[1600 ,2400 ,1200 ,2100 ,3500],
[4000 ,3800 ,2800 ,4100 ,3800]]);
#Storage capacity is determined by number of required diffrenet type freezers.
## *100 for each vials
storage_cap = np.array([[1700, 4500, 2200, 3100, 1100],
[2700, 2100, 1800, 2000, 3800],
[4700, 4100, 2100, 4200, 3800]]);
demand =np.array([[1100 ,750 ,375 ,580 ,950 ,970 ,440 ,745 ,465 ,630 ,920 ,1260 ,730 ],
[960 ,885 ,505 ,1040 ,920 ,720 ,460 ,1100 ,830 ,820 ,495 ,970 ,960 ],
[2430 ,1500 ,990 ,870 ,1140 ,2060 ,1010 ,1620 ,1390 ,910 ,420 ,1890 ,510 ]]);
cap = np.array([[1400 ,800 ,500 ,600 ,955 ,975 ,445 ,750 ,475 ,635 ,930 ,1300 ,740],
[1000 ,890 ,510 ,1050 ,950 ,750 ,500 ,1105 ,840 ,830 ,500 ,980 ,980],
[2600 ,1700 ,1200 ,950 ,1400 ,2400 ,1200 ,2000 ,1800,1300,800 ,2400 ,600]]);
## NEW PARAMETER!! ##
#risk factor to prioritize the destination - less values are more important, because of using it in the minimization.
risk = np.array([1,3,6,5,1,2,5,1,7,4,5,8,2]);
## MODEL
from pyomo.environ import *
opt = SolverFactory('glpk')
model = ConcreteModel(name="Vaccine Integer Model")
#Sets#
# Vaccine Storage Units
model.F = Set(initialize=F)
# Vaccination Centers
model.D = Set(initialize=D)
# Vaccine Types
model.V = Set(initialize=V)
# decision variables
model.X = Var(model.V,model.F,model.D, domain= NonNegativeIntegers)
model.Y = Var(model.F,model.D ,domain= Binary) ## Binary variable
# Minimize the extra cost of each vaccine, transportation cost from f to d, holding cost at VSU and VC,
# and finally minimize the risk factor in order to prioritize the destinations that have less value. (less value because of prioritizing it!)
def cost_rule(model):
return sum(sum(sum(extracost[v-1]*model.X[v,f,d] for d in model.D) for f in model.F) for v in model.V)+\
sum(sum(Tc*dist[f-1,d-1]*model.Y[f,d] for d in model.V) for f in model.F)+\
sum(sum(sum(Hc_VSU[f-1]*(stock[v-1,f-1] - model.X[v,f,d]) for d in model.D) for v in model.V) for f in model.F)+\
sum(sum(sum(Hc_VC[d-1]*(model.X[v,f,d] - demand[v-1,d-1]) for f in model.F) for v in model.V) for d in model.D)+\
sum(sum(risk[d-1]*model.Y[f,d] for f in model.F) for d in model.D)
model.Obj = Objective(rule=cost_rule, sense=minimize)
#Constraints
def flow(model,v,f):
return sum(model.X[v,f,d] for d in model.D) >= stock[v-1,f-1]*0.80 #at least 5 vials from each storage..
model.flow_const = Constraint(model.V,model.F, rule=flow)
def stock_flow_limit(model, v,f):
return stock[v-1,f-1]-sum(model.X[v,f,d] for d in model.D) >= 2
model.stock_const = Constraint(model.V,model.F, rule=stock_flow_limit)
def storage_output(model,v, f):
return stock[v-1,f-1] - sum(model.X[v,f,d] for d in model.D) <= storage_cap[v-1,f-1]
model.storage_const = Constraint(model.V,model.F, rule=storage_output)
def vc_demand(model,v,d):
return sum(model.X[v,f,d] for f in model.F) >= demand[v-1,d-1]
model.demand_const = Constraint(model.V, model.D, rule=vc_demand)
def vc_capacity(model,v,d):
return sum(model.X[v,f,d] for f in model.F) <= cap[v-1,d-1]
model.cap_const = Constraint(model.V, model.D, rule=vc_capacity)
## BINARY CONSTRAINTS ##
# each VSU should transfer vaccines to at least 2 VC.
def travel_VSU(model,f):
return sum(model.Y[f,d] for d in model.D) >= 2
model.travel_VSU_const = Constraint(model.F, rule=travel_VSU)
# each VC should receive vaccines from at least 2 VCU.
def travel_VC(model,d):
return sum(model.Y[f,d] for f in model.F) >= 2
model.travel_VC_const = Constraint(model.D, rule=travel_VC)
#solve
results = opt.solve(model)
model.Obj()
model.display()
Model Vaccine Integer Model
Variables:
X : Size=195, Index=X_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1, 1) : 0 : 972.0 : None : False : False : NonNegativeIntegers
(1, 1, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 10) : 0 : 630.0 : None : False : False : NonNegativeIntegers
(1, 1, 11) : 0 : 246.0 : None : False : False : NonNegativeIntegers
(1, 1, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 1, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 2) : 0 : 750.0 : None : False : False : NonNegativeIntegers
(1, 2, 3) : 0 : 375.0 : None : False : False : NonNegativeIntegers
(1, 2, 4) : 0 : 580.0 : None : False : False : NonNegativeIntegers
(1, 2, 5) : 0 : 743.0 : None : False : False : NonNegativeIntegers
(1, 2, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 2, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 5) : 0 : 207.0 : None : False : False : NonNegativeIntegers
(1, 3, 6) : 0 : 796.0 : None : False : False : NonNegativeIntegers
(1, 3, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 3, 13) : 0 : 730.0 : None : False : False : NonNegativeIntegers
(1, 4, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 4, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 4, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 4, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 4, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 4, 6) : 0 : 174.0 : None : False : False : NonNegativeIntegers
(1, 4, 7) : 0 : 440.0 : None : False : False : NonNegativeIntegers
(1, 4, 8) : 0 : 745.0 : None : False : False : NonNegativeIntegers
(1, 4, 9) : 0 : 465.0 : None : False : False : NonNegativeIntegers
(1, 4, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 4, 11) : 0 : 674.0 : None : False : False : NonNegativeIntegers
(1, 4, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 4, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 1) : 0 : 128.0 : None : False : False : NonNegativeIntegers
(1, 5, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(1, 5, 12) : 0 : 1260.0 : None : False : False : NonNegativeIntegers
(1, 5, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 6) : 0 : 38.0 : None : False : False : NonNegativeIntegers
(2, 1, 7) : 0 : 460.0 : None : False : False : NonNegativeIntegers
(2, 1, 8) : 0 : 1100.0 : None : False : False : NonNegativeIntegers
(2, 1, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 1, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 1) : 0 : 481.0 : None : False : False : NonNegativeIntegers
(2, 2, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 2, 10) : 0 : 452.0 : None : False : False : NonNegativeIntegers
(2, 2, 11) : 0 : 495.0 : None : False : False : NonNegativeIntegers
(2, 2, 12) : 0 : 970.0 : None : False : False : NonNegativeIntegers
(2, 2, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 9) : 0 : 830.0 : None : False : False : NonNegativeIntegers
(2, 3, 10) : 0 : 368.0 : None : False : False : NonNegativeIntegers
(2, 3, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 3, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 1) : 0 : 479.0 : None : False : False : NonNegativeIntegers
(2, 4, 2) : 0 : 885.0 : None : False : False : NonNegativeIntegers
(2, 4, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 4, 13) : 0 : 734.0 : None : False : False : NonNegativeIntegers
(2, 5, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 3) : 0 : 505.0 : None : False : False : NonNegativeIntegers
(2, 5, 4) : 0 : 1040.0 : None : False : False : NonNegativeIntegers
(2, 5, 5) : 0 : 920.0 : None : False : False : NonNegativeIntegers
(2, 5, 6) : 0 : 682.0 : None : False : False : NonNegativeIntegers
(2, 5, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(2, 5, 13) : 0 : 226.0 : None : False : False : NonNegativeIntegers
(3, 1, 1) : 0 : 1988.0 : None : False : False : NonNegativeIntegers
(3, 1, 2) : 0 : 1500.0 : None : False : False : NonNegativeIntegers
(3, 1, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 1, 13) : 0 : 510.0 : None : False : False : NonNegativeIntegers
(3, 2, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 3) : 0 : 990.0 : None : False : False : NonNegativeIntegers
(3, 2, 4) : 0 : 870.0 : None : False : False : NonNegativeIntegers
(3, 2, 5) : 0 : 1140.0 : None : False : False : NonNegativeIntegers
(3, 2, 6) : 0 : 40.0 : None : False : False : NonNegativeIntegers
(3, 2, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 2, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 1) : 0 : 424.0 : None : False : False : NonNegativeIntegers
(3, 3, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 8) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 3, 11) : 0 : 420.0 : None : False : False : NonNegativeIntegers
(3, 3, 12) : 0 : 1954.0 : None : False : False : NonNegativeIntegers
(3, 3, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 1) : 0 : 188.0 : None : False : False : NonNegativeIntegers
(3, 4, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 6) : 0 : 2020.0 : None : False : False : NonNegativeIntegers
(3, 4, 7) : 0 : 1010.0 : None : False : False : NonNegativeIntegers
(3, 4, 8) : 0 : 880.0 : None : False : False : NonNegativeIntegers
(3, 4, 9) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 10) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 4, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 1) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 2) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 3) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 4) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 5) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 6) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 7) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 8) : 0 : 740.0 : None : False : False : NonNegativeIntegers
(3, 5, 9) : 0 : 1390.0 : None : False : False : NonNegativeIntegers
(3, 5, 10) : 0 : 910.0 : None : False : False : NonNegativeIntegers
(3, 5, 11) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 12) : 0 : 0.0 : None : False : False : NonNegativeIntegers
(3, 5, 13) : 0 : 0.0 : None : False : False : NonNegativeIntegers
Y : Size=65, Index=Y_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1) : 0 : 0.0 : 1 : False : False : Binary
(1, 2) : 0 : 1.0 : 1 : False : False : Binary
(1, 3) : 0 : 1.0 : 1 : False : False : Binary
(1, 4) : 0 : 0.0 : 1 : False : False : Binary
(1, 5) : 0 : 0.0 : 1 : False : False : Binary
(1, 6) : 0 : 1.0 : 1 : False : False : Binary
(1, 7) : 0 : 1.0 : 1 : False : False : Binary
(1, 8) : 0 : 1.0 : 1 : False : False : Binary
(1, 9) : 0 : 1.0 : 1 : False : False : Binary
(1, 10) : 0 : 1.0 : 1 : False : False : Binary
(1, 11) : 0 : 1.0 : 1 : False : False : Binary
(1, 12) : 0 : 1.0 : 1 : False : False : Binary
(1, 13) : 0 : 1.0 : 1 : False : False : Binary
(2, 1) : 0 : 0.0 : 1 : False : False : Binary
(2, 2) : 0 : 0.0 : 1 : False : False : Binary
(2, 3) : 0 : 0.0 : 1 : False : False : Binary
(2, 4) : 0 : 0.0 : 1 : False : False : Binary
(2, 5) : 0 : 0.0 : 1 : False : False : Binary
(2, 6) : 0 : 0.0 : 1 : False : False : Binary
(2, 7) : 0 : 1.0 : 1 : False : False : Binary
(2, 8) : 0 : 1.0 : 1 : False : False : Binary
(2, 9) : 0 : 1.0 : 1 : False : False : Binary
(2, 10) : 0 : 1.0 : 1 : False : False : Binary
(2, 11) : 0 : 1.0 : 1 : False : False : Binary
(2, 12) : 0 : 1.0 : 1 : False : False : Binary
(2, 13) : 0 : 1.0 : 1 : False : False : Binary
(3, 1) : 0 : 1.0 : 1 : False : False : Binary
(3, 2) : 0 : 0.0 : 1 : False : False : Binary
(3, 3) : 0 : 1.0 : 1 : False : False : Binary
(3, 4) : 0 : 1.0 : 1 : False : False : Binary
(3, 5) : 0 : 0.0 : 1 : False : False : Binary
(3, 6) : 0 : 0.0 : 1 : False : False : Binary
(3, 7) : 0 : 0.0 : 1 : False : False : Binary
(3, 8) : 0 : 0.0 : 1 : False : False : Binary
(3, 9) : 0 : 0.0 : 1 : False : False : Binary
(3, 10) : 0 : 0.0 : 1 : False : False : Binary
(3, 11) : 0 : 0.0 : 1 : False : False : Binary
(3, 12) : 0 : 0.0 : 1 : False : False : Binary
(3, 13) : 0 : 0.0 : 1 : False : False : Binary
(4, 1) : 0 : 0.0 : 1 : False : False : Binary
(4, 2) : 0 : 0.0 : 1 : False : False : Binary
(4, 3) : 0 : 0.0 : 1 : False : False : Binary
(4, 4) : 0 : 1.0 : 1 : False : False : Binary
(4, 5) : 0 : 1.0 : 1 : False : False : Binary
(4, 6) : 0 : 0.0 : 1 : False : False : Binary
(4, 7) : 0 : 0.0 : 1 : False : False : Binary
(4, 8) : 0 : 0.0 : 1 : False : False : Binary
(4, 9) : 0 : 0.0 : 1 : False : False : Binary
(4, 10) : 0 : 0.0 : 1 : False : False : Binary
(4, 11) : 0 : 0.0 : 1 : False : False : Binary
(4, 12) : 0 : 0.0 : 1 : False : False : Binary
(4, 13) : 0 : 0.0 : 1 : False : False : Binary
(5, 1) : 0 : 1.0 : 1 : False : False : Binary
(5, 2) : 0 : 1.0 : 1 : False : False : Binary
(5, 3) : 0 : 0.0 : 1 : False : False : Binary
(5, 4) : 0 : 0.0 : 1 : False : False : Binary
(5, 5) : 0 : 1.0 : 1 : False : False : Binary
(5, 6) : 0 : 1.0 : 1 : False : False : Binary
(5, 7) : 0 : 0.0 : 1 : False : False : Binary
(5, 8) : 0 : 0.0 : 1 : False : False : Binary
(5, 9) : 0 : 0.0 : 1 : False : False : Binary
(5, 10) : 0 : 0.0 : 1 : False : False : Binary
(5, 11) : 0 : 0.0 : 1 : False : False : Binary
(5, 12) : 0 : 0.0 : 1 : False : False : Binary
(5, 13) : 0 : 0.0 : 1 : False : False : Binary
Objectives:
Obj : Size=1, Index=None, Active=True
Key : Active : Value
None : True : 2031533.85
Constraints:
flow_const : Size=15
Key : Lower : Body : Upper
(1, 1) : 1480.0 : 1848.0 : None
(1, 2) : 1960.0 : 2448.0 : None
(1, 3) : 1388.0 : 1733.0 : None
(1, 4) : 2000.0 : 2498.0 : None
(1, 5) : 1120.0 : 1388.0 : None
(2, 1) : 1280.0 : 1598.0 : None
(2, 2) : 1920.0 : 2398.0 : None
(2, 3) : 960.0 : 1198.0 : None
(2, 4) : 1680.0 : 2098.0 : None
(2, 5) : 2800.0 : 3373.0 : None
(3, 1) : 3200.0 : 3998.0 : None
(3, 2) : 3040.0 : 3040.0 : None
(3, 3) : 2240.0 : 2798.0 : None
(3, 4) : 3280.0 : 4098.0 : None
(3, 5) : 3040.0 : 3040.0 : None
stock_const : Size=15
Key : Lower : Body : Upper
(1, 1) : 2.0 : 2.0 : None
(1, 2) : 2.0 : 2.0 : None
(1, 3) : 2.0 : 2.0 : None
(1, 4) : 2.0 : 2.0 : None
(1, 5) : 2.0 : 12.0 : None
(2, 1) : 2.0 : 2.0 : None
(2, 2) : 2.0 : 2.0 : None
(2, 3) : 2.0 : 2.0 : None
(2, 4) : 2.0 : 2.0 : None
(2, 5) : 2.0 : 127.0 : None
(3, 1) : 2.0 : 2.0 : None
(3, 2) : 2.0 : 760.0 : None
(3, 3) : 2.0 : 2.0 : None
(3, 4) : 2.0 : 2.0 : None
(3, 5) : 2.0 : 760.0 : None
storage_const : Size=15
Key : Lower : Body : Upper
(1, 1) : None : 2.0 : 1700.0
(1, 2) : None : 2.0 : 4500.0
(1, 3) : None : 2.0 : 2200.0
(1, 4) : None : 2.0 : 3100.0
(1, 5) : None : 12.0 : 1100.0
(2, 1) : None : 2.0 : 2700.0
(2, 2) : None : 2.0 : 2100.0
(2, 3) : None : 2.0 : 1800.0
(2, 4) : None : 2.0 : 2000.0
(2, 5) : None : 127.0 : 3800.0
(3, 1) : None : 2.0 : 4700.0
(3, 2) : None : 760.0 : 4100.0
(3, 3) : None : 2.0 : 2100.0
(3, 4) : None : 2.0 : 4200.0
(3, 5) : None : 760.0 : 3800.0
demand_const : Size=39
Key : Lower : Body : Upper
(1, 1) : 1100.0 : 1100.0 : None
(1, 2) : 750.0 : 750.0 : None
(1, 3) : 375.0 : 375.0 : None
(1, 4) : 580.0 : 580.0 : None
(1, 5) : 950.0 : 950.0 : None
(1, 6) : 970.0 : 970.0 : None
(1, 7) : 440.0 : 440.0 : None
(1, 8) : 745.0 : 745.0 : None
(1, 9) : 465.0 : 465.0 : None
(1, 10) : 630.0 : 630.0 : None
(1, 11) : 920.0 : 920.0 : None
(1, 12) : 1260.0 : 1260.0 : None
(1, 13) : 730.0 : 730.0 : None
(2, 1) : 960.0 : 960.0 : None
(2, 2) : 885.0 : 885.0 : None
(2, 3) : 505.0 : 505.0 : None
(2, 4) : 1040.0 : 1040.0 : None
(2, 5) : 920.0 : 920.0 : None
(2, 6) : 720.0 : 720.0 : None
(2, 7) : 460.0 : 460.0 : None
(2, 8) : 1100.0 : 1100.0 : None
(2, 9) : 830.0 : 830.0 : None
(2, 10) : 820.0 : 820.0 : None
(2, 11) : 495.0 : 495.0 : None
(2, 12) : 970.0 : 970.0 : None
(2, 13) : 960.0 : 960.0 : None
(3, 1) : 2430.0 : 2600.0 : None
(3, 2) : 1500.0 : 1500.0 : None
(3, 3) : 990.0 : 990.0 : None
(3, 4) : 870.0 : 870.0 : None
(3, 5) : 1140.0 : 1140.0 : None
(3, 6) : 2060.0 : 2060.0 : None
(3, 7) : 1010.0 : 1010.0 : None
(3, 8) : 1620.0 : 1620.0 : None
(3, 9) : 1390.0 : 1390.0 : None
(3, 10) : 910.0 : 910.0 : None
(3, 11) : 420.0 : 420.0 : None
(3, 12) : 1890.0 : 1954.0 : None
(3, 13) : 510.0 : 510.0 : None
cap_const : Size=39
Key : Lower : Body : Upper
(1, 1) : None : 1100.0 : 1400.0
(1, 2) : None : 750.0 : 800.0
(1, 3) : None : 375.0 : 500.0
(1, 4) : None : 580.0 : 600.0
(1, 5) : None : 950.0 : 955.0
(1, 6) : None : 970.0 : 975.0
(1, 7) : None : 440.0 : 445.0
(1, 8) : None : 745.0 : 750.0
(1, 9) : None : 465.0 : 475.0
(1, 10) : None : 630.0 : 635.0
(1, 11) : None : 920.0 : 930.0
(1, 12) : None : 1260.0 : 1300.0
(1, 13) : None : 730.0 : 740.0
(2, 1) : None : 960.0 : 1000.0
(2, 2) : None : 885.0 : 890.0
(2, 3) : None : 505.0 : 510.0
(2, 4) : None : 1040.0 : 1050.0
(2, 5) : None : 920.0 : 950.0
(2, 6) : None : 720.0 : 750.0
(2, 7) : None : 460.0 : 500.0
(2, 8) : None : 1100.0 : 1105.0
(2, 9) : None : 830.0 : 840.0
(2, 10) : None : 820.0 : 830.0
(2, 11) : None : 495.0 : 500.0
(2, 12) : None : 970.0 : 980.0
(2, 13) : None : 960.0 : 980.0
(3, 1) : None : 2600.0 : 2600.0
(3, 2) : None : 1500.0 : 1700.0
(3, 3) : None : 990.0 : 1200.0
(3, 4) : None : 870.0 : 950.0
(3, 5) : None : 1140.0 : 1400.0
(3, 6) : None : 2060.0 : 2400.0
(3, 7) : None : 1010.0 : 1200.0
(3, 8) : None : 1620.0 : 2000.0
(3, 9) : None : 1390.0 : 1800.0
(3, 10) : None : 910.0 : 1300.0
(3, 11) : None : 420.0 : 800.0
(3, 12) : None : 1954.0 : 2400.0
(3, 13) : None : 510.0 : 600.0
travel_VSU_const : Size=5
Key : Lower : Body : Upper
1 : 2.0 : 10.0 : None
2 : 2.0 : 7.0 : None
3 : 2.0 : 3.0 : None
4 : 2.0 : 2.0 : None
5 : 2.0 : 4.0 : None
travel_VC_const : Size=13
Key : Lower : Body : Upper
1 : 2.0 : 2.0 : None
2 : 2.0 : 2.0 : None
3 : 2.0 : 2.0 : None
4 : 2.0 : 2.0 : None
5 : 2.0 : 2.0 : None
6 : 2.0 : 2.0 : None
7 : 2.0 : 2.0 : None
8 : 2.0 : 2.0 : None
9 : 2.0 : 2.0 : None
10 : 2.0 : 2.0 : None
11 : 2.0 : 2.0 : None
12 : 2.0 : 2.0 : None
13 : 2.0 : 2.0 : None
After adding a binary variable which represents whether the vaccines transformed from VSU to VC or not, and adding constarints about the flow between VSUs and VCs (each VSU should transfer vaccines to at least 2 VC and each VC should receive vaccines from at least 1 VCU), the OF decreased significantly to 2031533. These constraints are very important because of deciding which VSU should transfer the vaccines to the VCs in order to minimize the total cost. Because there are 5 VCUs and 13 VCs. As a result, the optimal solution has found that The VSU1 should transfer to the 10 VCs, VCU2 to 7, VCU3 to 3, VSU4 to 2, VSU5 to 4. And all 13 VCs are receiving the vaccines from 2 VCUs.
Also to the OF, another parameter has been added which is called risk. This risk factor was added to prioritize the VCs whether which destination needs vaccines as soon as possible. The risk factor is between 1-9, less values are representing the most important centers, and high values are indicating the less emergent status. Less values are more emergent because of using it in the minimization. In the OF, the summation must be minimized.
In this part, the binary variable which has been added to the optimazition problem is relaxed by changing its domain from Binary to NonNegativeReals and adding extended boundries.
In this step, minimum boundary is 0 and for the maximum boundary, less than 1 and more than 1 upper boundary values has been tested.\
I wanted to do this analysis that is running the model with different upper boundaries in order to see the effects of the objective function and Y decision variable with the boundary in the relaxed problem.
obj_list =[]
bound = [0.75,1,1.5,1.75,2]
for i in bound:
from pyomo.environ import *
opt = SolverFactory('glpk')
model = ConcreteModel(name="Vaccine Model")
#Sets#
# Vaccine Storage Units
model.F = Set(initialize=F)
# Vaccine Centers
model.D = Set(initialize=D)
# Vaccine Types
model.V = Set(initialize=V)
# decision variables
model.X = Var(model.V,model.F,model.D, domain= NonNegativeReals)
model.Y = Var(model.F,model.D ,domain= NonNegativeReals,bounds=(0,i))
# Minimize the cost
def cost_rule(model):
return sum(sum(sum(extracost[v-1]*model.X[v,f,d] for d in model.D) for f in model.F) for v in model.V)+\
sum(sum(Tc*dist[f-1,d-1]*model.Y[f,d] for d in model.V) for f in model.F)+\
sum(sum(sum(Hc_VSU[f-1]*(stock[v-1,f-1] - model.X[v,f,d]) for d in model.D) for v in model.V) for f in model.F)+\
sum(sum(sum(Hc_VC[d-1]*(model.X[v,f,d] - demand[v-1,d-1]) for f in model.F) for v in model.V) for d in model.D)+\
sum(sum(risk[d-1]*model.Y[f,d] for f in model.F) for d in model.D)
model.Obj = Objective(rule=cost_rule, sense=minimize)
#Constraints
def flow(model,v,f):
return sum(model.X[v,f,d] for d in model.D) >= stock[v-1,f-1]*0.80 #at least 5 vials from each storage..
model.flow_const = Constraint(model.V,model.F, rule=flow)
def stock_flow_limit(model, v,f):
return stock[v-1,f-1]-sum(model.X[v,f,d] for d in model.D) >= 2
model.stock_const = Constraint(model.V,model.F, rule=stock_flow_limit)
def storage_output(model,v, f):
return stock[v-1,f-1] - sum(model.X[v,f,d] for d in model.D) <= storage_cap[v-1,f-1]
model.storage_const = Constraint(model.V,model.F, rule=storage_output)
def vc_demand(model,v,d):
return sum(model.X[v,f,d] for f in model.F) >= demand[v-1,d-1]
model.demand_const = Constraint(model.V, model.D, rule=vc_demand)
def vc_capacity(model,v,d):
return sum(model.X[v,f,d] for f in model.F) <= cap[v-1,d-1]
model.cap_const = Constraint(model.V, model.D, rule=vc_capacity)
## BINARY CONSTRAINTS ##
# each VSU should transfer vaccines to at least 2 VCs.
def travel_VSU(model,f):
return sum(model.Y[f,d] for d in model.D) >= 2
model.travel_VSU_const = Constraint(model.F, rule=travel_VSU)
# each VC should receive vaccines from at least 2 VCUs.
def travel_VC(model,d):
return sum(model.Y[f,d] for f in model.F) >= 2
model.travel_VC_const = Constraint(model.D, rule=travel_VC)
#solve
results = opt.solve(model)
OBJ = model.Obj()
Y_values = model.Y.display()
obj_list = np.append(obj_list, OBJ)
print(obj_list)
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(bound,obj_list)
plt.xlabel('Boundaries')
Y : Size=65, Index=Y_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(1, 2) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(1, 3) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(1, 4) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 5) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 6) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 7) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 8) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 9) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 10) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 11) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 12) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(1, 13) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 1) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 2) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 3) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 4) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(2, 5) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(2, 6) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(2, 7) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(2, 8) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 9) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 10) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 11) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 12) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(2, 13) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(3, 1) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 2) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(3, 3) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 4) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(3, 5) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(3, 6) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 7) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 8) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 9) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 10) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 11) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 12) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(3, 13) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 1) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(4, 2) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(4, 3) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(4, 4) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 5) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 6) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 7) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 8) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 9) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 10) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 11) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 12) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(4, 13) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(5, 1) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(5, 2) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(5, 3) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(5, 4) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(5, 5) : 0 : 0.75 : 0.75 : False : False : NonNegativeReals
(5, 6) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(5, 7) : 0 : 0.0 : 0.75 : False : False : NonNegativeReals
(5, 8) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(5, 9) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(5, 10) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(5, 11) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(5, 12) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
(5, 13) : 0 : 0.5 : 0.75 : False : False : NonNegativeReals
Y : Size=65, Index=Y_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(1, 2) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 3) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 4) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(1, 5) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(1, 6) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 7) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 8) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 9) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 10) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 11) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 12) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(1, 13) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(2, 1) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(2, 2) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(2, 3) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(2, 4) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(2, 5) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(2, 6) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(2, 7) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(2, 8) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(2, 9) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(2, 10) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(2, 11) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(2, 12) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(2, 13) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(3, 1) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(3, 2) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 3) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(3, 4) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(3, 5) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 6) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 7) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 8) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 9) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 10) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 11) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 12) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(3, 13) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 1) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 2) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 3) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 4) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(4, 5) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(4, 6) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 7) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 8) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 9) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 10) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 11) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 12) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(4, 13) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 1) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(5, 2) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(5, 3) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 4) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 5) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(5, 6) : 0 : 1.0 : 1 : False : False : NonNegativeReals
(5, 7) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 8) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 9) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 10) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 11) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 12) : 0 : 0.0 : 1 : False : False : NonNegativeReals
(5, 13) : 0 : 0.0 : 1 : False : False : NonNegativeReals
Y : Size=65, Index=Y_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 2) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(1, 3) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(1, 4) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 5) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 6) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 7) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 8) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 9) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 10) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 11) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 12) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(1, 13) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(2, 1) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(2, 2) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(2, 3) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(2, 4) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(2, 5) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(2, 6) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(2, 7) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(2, 8) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(2, 9) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(2, 10) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(2, 11) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(2, 12) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(2, 13) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(3, 1) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(3, 2) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 3) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(3, 4) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(3, 5) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 6) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 7) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 8) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 9) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 10) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 11) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 12) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(3, 13) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(4, 1) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(4, 2) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(4, 3) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(4, 4) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(4, 5) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(4, 6) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(4, 7) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(4, 8) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(4, 9) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(4, 10) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(4, 11) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(4, 12) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(4, 13) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(5, 1) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(5, 2) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(5, 3) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 4) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 5) : 0 : 1.5 : 1.5 : False : False : NonNegativeReals
(5, 6) : 0 : 0.5 : 1.5 : False : False : NonNegativeReals
(5, 7) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 8) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 9) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 10) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 11) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 12) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
(5, 13) : 0 : 0.0 : 1.5 : False : False : NonNegativeReals
Y : Size=65, Index=Y_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 2) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(1, 3) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(1, 4) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 5) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 6) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 7) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 8) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 9) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 10) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 11) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 12) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(1, 13) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(2, 1) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(2, 2) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(2, 3) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(2, 4) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(2, 5) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(2, 6) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(2, 7) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(2, 8) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(2, 9) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(2, 10) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(2, 11) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(2, 12) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(2, 13) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(3, 1) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(3, 2) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 3) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(3, 4) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(3, 5) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 6) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 7) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 8) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 9) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 10) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 11) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 12) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(3, 13) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(4, 1) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(4, 2) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(4, 3) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(4, 4) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(4, 5) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(4, 6) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(4, 7) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(4, 8) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(4, 9) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(4, 10) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(4, 11) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(4, 12) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(4, 13) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(5, 1) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(5, 2) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(5, 3) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 4) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 5) : 0 : 1.75 : 1.75 : False : False : NonNegativeReals
(5, 6) : 0 : 0.25 : 1.75 : False : False : NonNegativeReals
(5, 7) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 8) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 9) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 10) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 11) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 12) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
(5, 13) : 0 : 0.0 : 1.75 : False : False : NonNegativeReals
Y : Size=65, Index=Y_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 1) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(1, 2) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(1, 3) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(1, 4) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(1, 5) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(1, 6) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(1, 7) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(1, 8) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(1, 9) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(1, 10) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(1, 11) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(1, 12) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(1, 13) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(2, 1) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 2) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 3) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 4) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 5) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 6) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(2, 7) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 8) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 9) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 10) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 11) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 12) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(2, 13) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 1) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(3, 2) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 3) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(3, 4) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 5) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 6) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 7) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 8) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 9) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 10) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 11) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 12) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(3, 13) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 1) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 2) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 3) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 4) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(4, 5) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 6) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 7) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 8) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 9) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 10) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 11) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 12) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(4, 13) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 1) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 2) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 3) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 4) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 5) : 0 : 2.0 : 2 : False : False : NonNegativeReals
(5, 6) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 7) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 8) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 9) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 10) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 11) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 12) : 0 : 0.0 : 2 : False : False : NonNegativeReals
(5, 13) : 0 : 0.0 : 2 : False : False : NonNegativeReals
[2031546.1 2031533.85 2031530.85 2031529.35 2031527.85]
Text(0.5, 0, 'Boundaries')
After relaxing the integer problem, the objective function result has been changed according to the upper boundary. For 1, the OF has't changed, however, after simulating with different bounds, it can be seen on the above graph that while the boundaries are relaxed more, the total cost decreases, because the problem has been relaxed.
In this step, the integer problem was solved with several instances. In order to do that i value was iterated in range(2,20). Finally, the execution times were printed and plotted.
# libraries
import numpy as np
import random
from pyomo.environ import *
import time
# defining empty list for the execution times.
time_list = []
for i in range(2,20):
random.seed(i)
F = list(range(1,i));
D = list(range(1,i*2));
V = list(range(1,i+2));
Tc = 5;
dist = np.random.uniform(5,40,([len(F),len(D)]));
extracost = np.random.uniform(2.25,10,len(V));
Hc_VSU = np.random.uniform(2,9,len(F));
Hc_VC = np.random.uniform(2,9,len(D));
stock = np.random.randint(2500,3500,size = (len(V),len(F)));
#Storage capacity is determined by number of required diffrenet type freezers.
## *100 for each vials
storage_cap = np.random.randint(2000,5500,size = (len(V),len(F)));
demand = np.random.randint(350,2200,size = (len(V),len(D)));
cap = np.random.randint(2000,4000,size = (len(V),len(D)));
## NEW PARAMETER!! ##
#risk factor to prioritize the destination
risk = np.random.randint(1,9,len(D));
###MODEL
opt = SolverFactory('glpk')
model = ConcreteModel(name="Vaccine Model")
#Sets#
# Factories
model.F = Set(initialize=F)
# Vaccine Centers
model.D = Set(initialize=D)
# Vaccine Types
model.V = Set(initialize=V)
# decision variables
model.X = Var(model.V,model.F,model.D, domain= NonNegativeIntegers)
model.Y = Var(model.F,model.D ,domain= Binary)
# Minimize the cost
def cost_rule(model):
return sum(sum(sum(extracost[v-1]*model.X[v,f,d] for d in model.D) for f in model.F) for v in model.V)+\
sum(sum(Tc*dist[f-1,d-1]*model.Y[f,d] for d in model.V) for f in model.F)+\
sum(sum(sum(Hc_VSU[f-1]*(stock[v-1,f-1] - model.X[v,f,d]) for d in model.D) for v in model.V) for f in model.F)+\
sum(sum(sum(Hc_VC[d-1]*(model.X[v,f,d] - demand[v-1,d-1]) for f in model.F) for v in model.V) for d in model.D)+\
sum(sum(risk[d-1]*model.Y[f,d] for f in model.F) for d in model.D)
model.Obj = Objective(rule=cost_rule, sense=minimize)
#Constraints
def flow(model,v,f):
return sum(model.X[v,f,d] for d in model.D) >= stock[v-1,f-1]*0.80 #at least 5 vials from each storage..
model.flow_const = Constraint(model.V,model.F, rule=flow)
def stock_flow_limit(model, v,f):
return stock[v-1,f-1]-sum(model.X[v,f,d] for d in model.D) >= 2
model.stock_const = Constraint(model.V,model.F, rule=stock_flow_limit)
def storage_output(model,v, f):
return stock[v-1,f-1] - sum(model.X[v,f,d] for d in model.D) <= storage_cap[v-1,f-1]
model.storage_const = Constraint(model.V,model.F, rule=storage_output)
def vc_demand(model,v,d):
return sum(model.X[v,f,d] for f in model.F) >= demand[v-1,d-1]
model.demand_const = Constraint(model.V, model.D, rule=vc_demand)
def vc_capacity(model,v,d):
return sum(model.X[v,f,d] for f in model.F) <= cap[v-1,d-1]
model.cap_const = Constraint(model.V, model.D, rule=vc_capacity)
## BINARY CONSTRAINTS ##
# each VSU should transfer vaccines to at least 2 VCs.
def travel_VSU(model,f):
return sum(model.Y[f,d] for d in model.D) >= 2
model.travel_VSU_const = Constraint(model.F, rule=travel_VSU)
# each VC should receive vaccines from at least 2 VCUs.
def travel_VC(model,d):
return sum(model.Y[f,d] for f in model.F) >= 1
model.travel_VC_const = Constraint(model.D, rule=travel_VC)
start = time.time()
#solve
results = opt.solve(model)
end = time.time()
execution = end-start
#num_variables = len(V)*len(F)*len(D)
time_list = np.append(time_list,execution)
print(time_list)
[0.18177605 0.18275094 0.16476321 0.20637703 0.20563102 0.2142086 0.26167941 0.27771783 0.29543424 0.32596874 0.34967327 0.411623 0.4810307 0.4836669 0.57741785 0.63670254 1.07809114 1.25341797]
During iteration, first, the model has been run with less decision variables and then nnumber of variables has been increaed slightly. Moreover, when increasing the instances' size, the execution time went up as well.
For the integer problem in d), solve several instances with the same data, using (10 to 20) different values for one of the parameters in the model (choose a parameter you think may provide insights for the interpretation of the different solution values). Collect the resulting optimal values of the objective function, print and plot them. Comment on these values.
import numpy as np
m = 5 #list(range(1,6));
n = 13 #list(range(1,14));
e = 3 #list(range(1,4));
Tc = 5;
a=2;
b=1;
dist = np.array([[3.29 ,3.32 ,3.13 ,3.16 ,3.14 ,3.58 ,5.58 ,8.72 , 9.13 , 3.95 ,7.79 ,7.11 ,4.27 ] ,
[4.13 ,5.69 ,8.67 ,7.9 ,7.71 ,5.47 ,5.72 ,6.32 , 4.28 , 8.31 ,9.55 ,3.25 ,1.44 ] ,
[2.49 ,6.80 ,2.76 ,8.59 ,4.72 ,2.38 ,7.50 ,4.34 , 7.19 , 5.36 ,5.16 ,8.37 ,8.81 ] ,
[6.36 ,4.65 ,8.22 ,7.16 ,8.55 ,2.47 ,7.69 ,2.45 , 6.77 , 1.03 ,5.33 ,1.31 ,6.25 ] ,
[3.21 ,3.43 ,6.13 ,2.39 ,8.74 ,6.68 ,4.00 ,4.19 , 8.95 , 7.29 ,6.16 ,4.93 ,8.33 ] ]);
extracost = np.array([ 6.5,4.75,2.25 ]);
Hc_VSU = np.array([7.0, 5.0, 7.5, 7.0, 4.0]);
Hc_VC = np.array([3.5,8.0,9.7,6.5,4.5,5.0,9.0,8.0,7.2,8.4,4.2,3.6,9.5]);
stock = np.array([[1850 ,2450 ,1735 ,2500 ,1400],
[1600 ,2400 ,1200 ,2100 ,3500],
[4000 ,3800 ,2800 ,4100 ,3800]]);
#Storage capacity is determined by number of required diffrenet type freezers.
## *100 for each vials
storage_cap = np.array([[1700, 4500, 2200, 3100, 1100],
[2700, 2100, 1800, 2000, 3800],
[4700, 4100, 2100, 4200, 3800]]);
demand =np.array([[1100 ,750 ,375 ,580 ,950 ,970 ,440 ,745 ,465 ,630 ,920 ,1260 ,730 ],
[960 ,885 ,505 ,1040 ,920 ,720 ,460 ,1100 ,830 ,820 ,495 ,970 ,960 ],
[2430 ,1500 ,990 ,870 ,1140 ,2060 ,1010 ,1620 ,1390 ,910 ,420 ,1890 ,510 ]]);
cap = np.array([[1400 ,800 ,500 ,600 ,955 ,975 ,445 ,750 ,475 ,635 ,930 ,1300 ,740],
[1000 ,890 ,510 ,1050 ,950 ,750 ,500 ,1105 ,840 ,830 ,500 ,980 ,980],
[2600 ,1700 ,1200 ,950 ,1400 ,2400 ,1200 ,2000 ,1800,1300,800 ,2400 ,600]]);
## NEW PARAMETER!! ##
#risk factor to prioritize the destination - less values are more important, because of using it in the minimization.
risk = np.array([1,3,6,5,1,2,5,1,7,4,5,8,2]);
###MODEL
from pyomo.environ import *
opt = SolverFactory('glpk')
def corona_model(m,n,e,dist,extracost,Hc_VSU,Hc_VC,stock,storage_cap,demand,cap):
model = ConcreteModel(name="Vaccine Model")
#Sets#
# VSUs
model.F = RangeSet(1,m)
# Vaccine Centers
model.D = RangeSet(1,n)
# Vaccine Types
model.V = RangeSet(1,e)
# decision variables
model.X = Var(model.V,model.F,model.D, domain= NonNegativeIntegers)
model.Y = Var(model.F,model.D ,domain= Binary)
# Minimize the cost
def cost_rule(model):
return sum(sum(sum(extracost[v-1]*model.X[v,f,d] for d in model.D) for f in model.F) for v in model.V)+\
sum(sum(Tc*dist[f-1,d-1]*model.Y[f,d] for d in model.V) for f in model.F)+\
sum(sum(sum(Hc_VSU[f-1]*(stock[v-1,f-1] - model.X[v,f,d]) for d in model.D) for v in model.V) for f in model.F)+\
sum(sum(sum(Hc_VC[d-1]*(model.X[v,f,d] - demand[v-1,d-1]) for f in model.F) for v in model.V) for d in model.D)+\
sum(sum(risk[d-1]*model.Y[f,d] for f in model.F) for d in model.D)
model.Obj = Objective(rule=cost_rule, sense=minimize)
#Constraints
def flow(model,v,f):
return sum(model.X[v,f,d] for d in model.D) >= stock[v-1,f-1]*0.80
model.flow_const = Constraint(model.V,model.F, rule=flow)
def stock_flow_limit(model, v,f):
return stock[v-1,f-1]-sum(model.X[v,f,d] for d in model.D) >= 2
model.stock_const = Constraint(model.V,model.F, rule=stock_flow_limit)
def storage_output(model,v, f):
return stock[v-1,f-1] - sum(model.X[v,f,d] for d in model.D) <= storage_cap[v-1,f-1]
model.storage_const = Constraint(model.V,model.F, rule=storage_output)
def vc_demand(model,v,d):
return sum(model.X[v,f,d] for f in model.F) >= demand[v-1,d-1]
model.demand_const = Constraint(model.V, model.D, rule=vc_demand)
def vc_capacity(model,v,d):
return sum(model.X[v,f,d] for f in model.F) <= cap[v-1,d-1]
model.cap_const = Constraint(model.V, model.D, rule=vc_capacity)
## BINARY CONSTRAINTS ##
# each VSU should transfer vaccines to at least 2 VCs.
def travel_VSU(model,f):
return sum(model.Y[f,d] for d in model.D) >= a
model.travel_VSU_const = Constraint(model.F, rule=travel_VSU)
# each VC should receive vaccines from at least 1 VCUs.
def travel_VC(model,d):
return sum(model.Y[f,d] for f in model.F) >= b
model.travel_VC_const = Constraint(model.D, rule=travel_VC)
#solve
results = opt.solve(model)
return model.Obj()
corona_model(m,n,e,dist,extracost,Hc_VSU,Hc_VC,stock,storage_cap,demand,cap)
2031435.0
In this part, the OF observed by giving different values to the RHS of the constraint Travel_VSU. (each VSU should transfer vaccines to at least "2" VCs.) Here, the "2" value is replacing by 0,1,2,3,4 and 5, respectively.
It is clear that between 0 and 2, the total cost does not change. However, when the parameter is increased to more than 2, the total cost starts to increase.
import matplotlib.pyplot as plt
%matplotlib inline
travel_VCU=np.array([0,1,2,3,4,5])
dim =travel_VCU.size
all_obj=np.zeros(dim)
for cont in range(0,dim):
a=travel_VCU[cont] #each time increasing.
Obj=corona_model(m,n,e,dist,extracost,Hc_VSU,Hc_VC,stock,storage_cap,demand,cap)
all_obj[cont]=Obj
print(all_obj)
plt.plot(travel_VCU,all_obj)
plt.xlabel('Minimum Travels from each VSU to VCs')
plt.ylabel('Total Cost')
plt.figure()
[2031435. 2031435. 2031435. 2031437. 2031442. 2031451.]
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
In this part, the OF observed by giving different values to the RHS of the constraint Travel_VC. (each VC should receive vaccines from at least "1" VCs.) Here, the "1" value is replacing by 0,1,2,3,4 and 5, respectively.
It is clear that if RHS value in the constraint increases, the total cost is increasing as well.
import matplotlib.pyplot as plt
%matplotlib inline
travel_VC=np.array([0,1,2,3,4,5])
dim =travel_VC.size
all_obj=np.zeros(dim)
for cont in range(0,dim):
b=travel_VC[cont] #each time increasing.
Obj=corona_model(m,n,e,dist,extracost,Hc_VSU,Hc_VC,stock,storage_cap,demand,cap)
all_obj[cont]=Obj
print(all_obj)
plt.plot(travel_VC,all_obj)
plt.xlabel('Minimum Travels to each VC from VSUs')
plt.ylabel('Total Cost')
plt.figure()
[2031392.15 2031451. 2031533.85 2031654.2 2031794.4 2031953.55]
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
In this part, the OF observed by giving different values to the RHS of the constraint Demand Constraint at VCs. The parameters ranges between 900 and 1110 with 10 increasement.
It is clear that if RHS value in the constraint increases, the total cost is decreasing.
import matplotlib.pyplot as plt
%matplotlib inline
v_demand=np.arange(900,1110,10)
dim =v_demand.size
all_obj=np.zeros(dim)
for cont in range(0,dim):
demand[0,0]=v_demand[cont] #each time increasing.
Obj=corona_model(m,n,e,dist,extracost,Hc_VSU,Hc_VC,stock,storage_cap,demand,cap)
all_obj[cont]=Obj
print(all_obj)
plt.plot(v_demand,all_obj)
plt.xlabel('Demand Analysis for the 1st type of Vaccine at VC1')
plt.ylabel('Total Cost')
plt.figure()
[2034253.55 2034138.55 2034023.55 2033908.55 2033793.55 2033678.55 2033563.55 2033448.55 2033333.55 2033218.55 2033103.55 2032988.55 2032873.55 2032758.55 2032643.55 2032528.55 2032413.55 2032298.55 2032183.55 2032068.55 2031953.55]
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
In this part, the OF observed by giving different values to the RHS of the constraint Stock Constraint at VSUs. The parameters ranges between 1840 and 1900 with 1 unit increasement.
It is clear that if RHS value in the constraint increases, the total cost is increasing as well.
import matplotlib.pyplot as plt
%matplotlib inline
v_stock=np.arange(1840,1900,1)
dim =v_stock.size
all_obj=np.zeros(dim)
for cont in range(0,dim):
stock[0,0]=v_stock[cont] #each time increasing.
Obj=corona_model(m,n,e,dist,extracost,Hc_VSU,Hc_VC,stock,storage_cap,demand,cap)
all_obj[cont]=Obj
print(all_obj)
plt.plot(v_stock,all_obj)
plt.xlabel('Stock Analysis for the 1st type of Vaccine at VC1')
plt.ylabel('Total Cost')
plt.figure()
[2031073.55 2031161.55 2031249.55 2031337.55 2031425.55 2031513.55 2031601.55 2031689.55 2031777.55 2031865.55 2031953.55 2032041.55 2032129.55 2032217.55 2032305.55 2032393.55 2032481.55 2032569.55 2032657.55 2032745.55 2032833.55 2032921.55 2033009.55 2033097.55 2033185.55 2033273.55 2033361.55 2033449.55 2033537.55 2033625.55 2033713.55 2033801.55 2033889.55 2033977.55 2034065.55 2034153.55 2034241.55 2034329.55 2034417.55 2034505.55 2034593.55 2034681.55 2034769.55 2034857.55 2034945.55 2035033.55 2035121.55 2035209.55 2035297.55 2035385.55 2035473.55 2035561.55 2035649.55 2035737.55 2035825.55 2035913.55 2036001.55 2036089.55 2036177.55 2036265.55]
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>
In this part, the OF observed by giving different values to the RHS of the capacity constraint at VSUs. The parameter ranges between 1200 and 2000 with 10 unit increasement.
It is clear that if the capacity parameter changes, the total cost does not affect.
import matplotlib.pyplot as plt
%matplotlib inline
v_stock=np.arange(1200,2000,10)
dim =v_stock.size
all_obj=np.zeros(dim)
for cont in range(0,dim):
cap[0,0]=v_stock[cont] #each time increasing.
Obj=corona_model(m,n,e,dist,extracost,Hc_VSU,Hc_VC,stock,storage_cap,demand,cap)
all_obj[cont]=Obj
print(all_obj)
plt.plot(v_stock,all_obj)
plt.xlabel('Stock Capacity for the 1st type of Vaccine at VSU1')
plt.ylabel('Total Cost')
plt.figure()
[2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55 2036265.55]
<Figure size 432x288 with 0 Axes>
<Figure size 432x288 with 0 Axes>