Skip to content

Commit 3828b54

Browse files
authored
Merge pull request loiane#181 from anthonycampbell/gale_shapley
Adding gale-shapley algorithm
2 parents db35403 + 57d29f6 commit 3828b54

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
class Person {
2+
constructor(id, gender, ranks, rankIndex, status = "single") {
3+
this.id = id
4+
this.gender = gender
5+
this.ranks = ranks
6+
this.i = rankIndex
7+
this.status = status
8+
this.partner = null
9+
}
10+
}
11+
12+
function galeShapley(proposers, reviewers) {
13+
let perfectMatching = new Map()
14+
for (let [pid, p] of proposers) {
15+
while (p.i < p.ranks.length) {
16+
let rid = p.ranks[p.i]
17+
let r = reviewers.get(rid)
18+
p.i++
19+
if (r.status === "single") {
20+
r.status = "engaged"
21+
r.partner = p
22+
p.partner = r
23+
perfectMatching.set(pid, rid)
24+
proposers.delete(pid)
25+
break
26+
} else if (r.status === "engaged" && r.ranks.get(pid) < r.ranks.get(r.partner.id)) {
27+
perfectMatching.delete(r.partner.id)
28+
proposers.set(r.partner.id, r.partner)
29+
proposers.delete(pid)
30+
r.partner.partner = null
31+
r.partner = p
32+
p.partner = r
33+
perfectMatching.set(pid, rid)
34+
break
35+
}
36+
}
37+
}
38+
return perfectMatching
39+
}
40+
41+
let men = new Map()
42+
let women = new Map()
43+
//O(n^2)
44+
function createPeople(n, gender, set) {
45+
for (let i = 0; i < n; i++) {
46+
let id = i
47+
let rankIndex = 0
48+
let g = gender
49+
let ranks = new Array(n)
50+
let p
51+
for (let i = 0; i < n; i++) ranks[i] = i
52+
shuffle(ranks)
53+
if (gender == 'w') {
54+
let wRanks = new Map()
55+
for (let i = 0; i < n; i++) wRanks.set(i, ranks[i])
56+
p = new Person(id, g, wRanks, null)
57+
} else {
58+
p = new Person(id, g, ranks, rankIndex)
59+
}
60+
set.set(i, p)
61+
}
62+
}
63+
64+
//fisher-yates shuffle O(n)
65+
function shuffle(array) {
66+
for (let i = array.length - 1; i >= 0; i--) {
67+
let j = Math.floor(Math.random() * (i + 1))
68+
let temp = array[i]
69+
array[i] = array[j]
70+
array[j] = temp
71+
}
72+
}
73+
74+
createPeople(4, 'm', men)
75+
createPeople(4, 'w', women)
76+
let stableMatching = galeShapley(men, women)
77+
console.log(stableMatching)

0 commit comments

Comments
 (0)