Skip to content

Commit

Permalink
reweite ahp still need to fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
leliel12 committed Feb 24, 2016
1 parent 90b5c5c commit bee07b3
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 92 deletions.
124 changes: 58 additions & 66 deletions notebooks/AHP.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
"collapsed": false
},
"outputs": [],
"source": [
"from __future__ import print_function, division\n",
"\n",
"import numpy as np\n",
"\n",
"from skcriteria import ahp\n",
"from skcriteria.common import norm"
]
Expand All @@ -25,95 +29,83 @@
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"crit_n, alt_n = 3, 3\n",
"\n",
"data = [\n",
" [20000, 1.8, 9],\n",
" [180000, 1.6, 7],\n",
" [155000, 1.4, 6]\n",
"]"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"## First step: Criteria pair comparision matrix"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1. 5. 7. ]\n",
" [ 0.2 1. 3. ]\n",
" [ 0.14285714 0.33333333 1. ]]\n"
"Criteria Vs. Criteria:\n",
" [[ 1. 2. 8. ]\n",
" [ 0.5 1. 6. ]\n",
" [ 0.125 0.16666667 1. ]] \n",
"\n",
"Alternative Vs. Alternative By Location:\n",
" [[ 1. 0.125 0.16666667]\n",
" [ 8. 1. 2. ]\n",
" [ 6. 0.5 1. ]] \n",
"\n",
"Alternative Vs. Alternative By Area:\n",
" [[ 1. 7. 5. ]\n",
" [ 0.14285714 1. 0.33333333]\n",
" [ 0.2 3. 1. ]] \n",
"\n",
"Alternative Vs. Alternative By Price:\n",
" [[ 1. 7. 3. ]\n",
" [ 0.14285714 1. 0.33333333]\n",
" [ 0.33333333 3. 1. ]] \n",
"\n"
]
}
],
"source": [
"vs_criteria = ahp.t([\n",
" [1.], \n",
" [1/5., 1.],\n",
" [1/7., 1/3., 1.]\n",
" [1.], # location\n",
" [1/2., 1.], # area\n",
" [1/8., 1/6., 1.] # price\n",
"])\n",
"\n",
"print(vs_criteria)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(0.055731850580674758, 0.10717261031851821)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ahp.saaty_cr(3, vs_criteria)"
"alt_vs_alt_by_crit = [\n",
" ahp.t([[1], [8, 1], [6, 1/2, 1]]), # location\n",
" ahp.t([[1], [1/7, 1], [1/5, 3, 1]]), # area\n",
" ahp.t([[1], [1/7, 1], [1/3, 3, 1]]), # price\n",
"]\n",
"\n",
"print(\"Criteria Vs. Criteria:\\n\", vs_criteria, \"\\n\")\n",
"print(\"Alternative Vs. Alternative By Location:\\n\", alt_vs_alt_by_crit[0], \"\\n\")\n",
"print(\"Alternative Vs. Alternative By Area:\\n\", alt_vs_alt_by_crit[1], \"\\n\")\n",
"print(\"Alternative Vs. Alternative By Price:\\n\", alt_vs_alt_by_crit[2], \"\\n\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.52002"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
"name": "stdout",
"output_type": "stream",
"text": [
"Rank: [2 1 3]\n",
"Points: [ 0.32938398 0.38635231 0.28426372]\n",
"Criteria Vs. Criteria CR: 0.0176324296565 [> 0.1 - Consistent]\n",
"Alternative Vs. Alternative By Location CR: 0.00916920780479 [< 0.1 - Consistent]\n",
"Alternative Vs. Alternative By Area CR: 0.0329093351825 [< 0.1 - Consistent]\n",
"Alternative Vs. Alternative By Price CR: 0.00351519171738 [< 0.1 - Consistent]\n"
]
}
],
"source": [
"ahp.saaty_ri(3)"
"result = ahp.ahp(vs_criteria, alt_vs_alt_by_crit)\n",
"\n",
"ranked, points, crit_ci, avabc_ci, crit_cr, avabc_cr = result\n",
"print(\"Rank:\", ranked)\n",
"print(\"Points:\", points)\n",
"print(\"Criteria Vs. Criteria CR:\", crit_cr, \"[> 0.1 - Consistent]\" if crit_cr < 0.1 else \"[< 0.1 - Inconsistent]\")\n",
"print(\"Alternative Vs. Alternative By Location CR:\", avabc_ir[0], \"[< 0.1 - Consistent]\" if avabc_cr[0] < 0.1 else \"[> 0.1 - Inconsistent]\")\n",
"print(\"Alternative Vs. Alternative By Area CR:\", avabc_ir[1], \"[< 0.1 - Consistent]\" if avabc_cr[1] < 0.1 else \"[> 0.1 - Inconsistent]\")\n",
"print(\"Alternative Vs. Alternative By Price CR:\", avabc_ir[2], \"[< 0.1 - Consistent]\" if avabc_cr[2] < 0.1 else \"[> 0.1 - Inconsistent]\")"
]
},
{
Expand Down
51 changes: 25 additions & 26 deletions skcriteria/ahp.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,11 @@

SAATY_MIN, SAATY_MAX = 0, 10

#: Random indexes [SATTY1980]_
#: Random indexes [CHANGSHENG2013]_
SAATY_RI = np.array(
[(1, 0.), (2, 0.), (3, 0.58), (4, 0.90),
(5, 1.12), (6, 1.24), (7, 1.32), (8, 1.41),
(9, 1.45), (10, 1.49), (11, 1.51), (12, 1.48),
(13, 1.56), (14, 1.57), (15, 1.59)],
[(1, 0.0), (2, 0.0), (3, 0.52), (4, 0.89), (5, 1.12),
(6, 1.26), (7, 1.36), (8, 1.41), (9, 1.46), (10, 1.49),
(11, 1.52), (12, 1.54), (13, 1.56), (14, 1.58), (15, 1.59)],
dtype=[(b'size', b'i'), (b'ri', b'f2')]
)

Expand Down Expand Up @@ -196,39 +195,39 @@ def saaty_ri(size):
return SAATY_RI["ri"][idx]


def saaty_cr(size, mtx):
validate_ahp_matrix(size, mtx)
colsum = np.sum(mtx, axis=0)
nmtx = np.divide(mtx, colsum, dtype=np.float64)
avg = np.average(nmtx, axis=1)
lambda_max = np.dot(colsum, avg)
def saaty_cr(mtx):
size = len(mtx)
nmtx = norm.sum(mtx, axis=0)
weights = np.average(nmtx, axis=1)
lambda_max = np.sum(np.dot(mtx, weights) / weights) / size
ci = (lambda_max - size) / (size - 1)
ri = saaty_ri(size)
return ci, ci/ri
cr = ci / saaty_ri(size)
return ci, cr, weights


def ahp(crit_n, alt_n, crit_vs_crit, alt_vs_alt_by_crit):
def ahp(crit_vs_crit, alt_vs_alt_by_crit):
""" """
crit_n = len(crit_vs_crit)

# criteria
validate_ahp_matrix(crit_n, crit_vs_crit, mtxtype=MTX_TYPE_CRITERIA)
n_cvsc = norm.sum(crit_vs_crit, axis=0)
pvector = np.average(n_cvsc, axis=1)

# alternatives
if len(alt_vs_alt_by_crit) != crit_n:
msg = (
"The number 'alt_vs_alt_by_crit' must be "
"the number of criteria '{}'. Found"
).format(crit_n, len(alt_vs_alt_by_crit))
raise ValueError(msg)

pmatrix = np.empty((crit_n, alt_n))
# criteria
crit_ci, crit_cr, wvector = saaty_cr(crit_vs_crit)
alt_n = len(alt_vs_alt_by_crit[0])

wmatrix = np.empty((crit_n, alt_n))
avabc_ci, avabc_cr = np.empty(crit_n), np.empty(crit_n)
for cidx, altmtx in enumerate(alt_vs_alt_by_crit):
validate_ahp_matrix(alt_n, altmtx, mtxtype=MTX_TYPE_ALTERNATIVES)
n_altmtx = norm.sum(altmtx, axis=0)
pmatrix[:, cidx] = np.average(n_altmtx, axis=1)
ava_ci, ava_cr, ava_weights = saaty_cr(altmtx)
avabc_ci[cidx], avabc_cr[cidx] = ava_ci, ava_cr
wmatrix[:, cidx] = ava_weights

points = np.dot(pmatrix, pvector)
points = np.dot(wmatrix, wvector)
ranked = rank.rankdata(points, reverse=True)

return rank.rankdata(points, reverse=True), points
return ranked, points, crit_ci, avabc_ci, crit_cr, avabc_cr

0 comments on commit bee07b3

Please sign in to comment.