SIMUS (Sequential Interactive Model for Urban Systems)
Is a tool to aid decision-making problems with multiple objectives. The method solves successive scenarios formulated as linear programs. For each scenario, the decision-maker must choose the criterion to be considered objective while the remaining restrictions constitute the constrains system that the projects are subject to. In each case, if there is a feasible solution that is optimum, it is recorded in a matrix of efficient results. Then, from this matrix two rankings allow the decision maker to compare results obtained by different procedures. The first ranking is obtained through a linear weighting of each column by a factor - equivalent of establishing a weight - and that measures the participation of the corresponding project. In the second ranking, the method uses dominance and subordinate relationships between projects, concepts from the French school of MCDM.
An important port city has been affected by the change in the modality of maritime transport, since the start of containers transport in the mid-20th century. The city was left with 39 hectares of empty docks, warehouses and a railway terminal.
Three projects was developed to decide what to do with this places
The criteria for the analysis of proposals are:
Only for the 2nd criteria a maximun limit pf $500$ are provided. The decisor has the four criteria as goals, so 4 Linear Optimizations must be solved.
The data are provided in the next table:
Criteria | Project 1 | Project 2 | Project 3 | Right side value | Optimal Sense |
---|---|---|---|---|---|
jobs | 250 | 130 | 350 | - | Maximize |
green | 120 | 200 | 340 | 500 | Maximize |
fin | 20 | 40 | 15 | - | Maximize |
env | 800 | 1000 | 600 | - | Maximize |
We can create a skcriteria.Data
object with all this information (except the limits):
In [1]:
# first lets import the DATA class
from skcriteria import Data
data = Data(
# the alternative matrix
mtx=[[250, 120, 20, 800],
[130, 200, 40, 1000],
[350, 340, 15, 600]],
# optimal sense
criteria=[max, max, min, max],
# names of alternatives and criteria
anames=["Prj 1", "Prj 2", "Prj 3"],
cnames=["jobs", "green", "fin", "env"])
# show the data object
data
Out[1]:
In [2]:
# import the class
from skcriteria.madm.simus import SIMUS
# create the new simus and
dm = SIMUS()
By default the call SIMUS()
create a solver that internally uses the PuLP solver to solve the linear programs. Other availables solvers are:
SUMUS(solver='glpk')
for the GNU Linear programming toolkitSUMUS(solver='gurobi')
to use Gurobi OptimizerSUMUS(solver='cplex')
for IBM ILOG CPLEX Optimization StudioAlso the njobs
parameters determines how many cores the user want to use to run the linear programs. For example
SIMUS(njobs=2)
uses up to two cores. (By default all CPUs are used).
Also the last (and most important) parameter is rank_by
(default is 1): determines which of the two ranks methods executed by SIMUS is the one that determines the final ranking. If the experiment is consistent, the two methos must detemines the same ranking (Please check the paper for more details).
In [3]:
# store the decision inside the dec variable
dec = dm.decide(data, b=[None, 500, None, None])
# let's see the decision
dec
Out[3]:
If you check the last column the raking is:
In [4]:
dec.e_
Out[4]:
for example the attribute stages
stores all the Linear programs executed by SIMUS:
In [5]:
dec._e.stages
Out[5]:
The attribute stages_results
stores the eficients restults normalized matrix
In [6]:
dec.e_.stage_results
Out[6]:
In [7]:
import datetime as dt
import skcriteria
print("Scikit-Criteria version:", skcriteria.VERSION)
print("Running datetime:", dt.datetime.now())