Skip to content

Commit 6e2f623

Browse files
committed
implement wpm method
1 parent bf96594 commit 6e2f623

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

src/main/scala/wpm.scala

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.expr.mcdm
2+
3+
case class WpmResult(
4+
normalizedDecisionMatrix: Mat,
5+
scores: Vec,
6+
ordering: VecInt,
7+
bestIndex: Int
8+
) extends MCDMResult
9+
10+
def wpm(
11+
mat: Mat,
12+
weights: Vec,
13+
directions: Array[Direction],
14+
normalization: NormalizationFunction =
15+
Normalization.DivideByColumnMaxMinNormalization
16+
): WpmResult =
17+
18+
val (n, p) = Matrix.size(mat)
19+
20+
val normalizedDecisionMat = normalization(mat, weights, directions)
21+
22+
/*
23+
var scoreMat = Array.tabulate(n, p)((i, j) => 0.0)
24+
for (i <- 0 until p) {
25+
for (j <- 0 until n) {
26+
scoreMat(j)(i) = math.pow(normalizedDecisionMat(j)(i), weights(i))
27+
}
28+
}
29+
*/
30+
val scoreMat = Array.tabulate(n, p)((i, j) => math.pow(normalizedDecisionMat(i)(j), weights(j)))
31+
32+
val scores = scoreMat.map(_.product)
33+
34+
val orderings = scores.zipWithIndex.sortBy(_._1).map(_._2)
35+
36+
val bestIndex = orderings.last
37+
38+
WpmResult(
39+
normalizedDecisionMat,
40+
scores,
41+
orderings,
42+
bestIndex
43+
)

src/test/scala/testwpm.scala

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import munit.Assertions as A
2+
3+
import org.expr.mcdm.wpm
4+
import org.expr.mcdm.Direction.{Maximize, Minimize}
5+
import org.expr.mcdm.Matrix
6+
7+
class TestWpm extends munit.FunSuite {
8+
test("Wpm Example - 1") {
9+
val decmat = Array(
10+
Array(3.0, 12.5, 2, 120, 14, 3),
11+
Array(5.0, 15, 3, 110, 38, 4),
12+
Array(3.0, 13, 2, 120, 19, 3),
13+
Array(4.0, 14, 2, 100, 31, 4),
14+
Array(3.0, 15, 1.5, 125, 40, 4)
15+
)
16+
17+
val weights = Array(0.221, 0.159, 0.175, 0.127, 0.117, 0.201)
18+
19+
val directions =
20+
Array(Maximize, Minimize, Minimize, Maximize, Minimize, Maximize)
21+
22+
val result = wpm(decmat, weights, directions)
23+
24+
val expectedScores = Array(0.7975224331331, 0.7532541470585,
25+
0.7647463553356, 0.7873956894791, 0.7674278741782)
26+
27+
val expectedBestIndex = 0
28+
29+
val expectedOrdering = Array(1, 2, 4, 3, 0)
30+
31+
A.assert(
32+
Matrix.elementwise_equal(result.scores, expectedScores, 1e-5)
33+
)
34+
35+
A.assertEquals(result.bestIndex, expectedBestIndex)
36+
37+
expectedOrdering.zip(result.ordering).foreach { case (a, b) =>
38+
A.assertEquals(a, b)
39+
}
40+
41+
}
42+
}

0 commit comments

Comments
 (0)