mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-10-22 21:41:37 +00:00
refactor: enhance minCostAssignment function with sentinel column for improved indexing
- Introduced a sentinel column to replace 0-indexing from the Rust version, simplifying potential assignments. - Updated array initializations to accommodate the new indexing scheme, enhancing clarity and consistency in the algorithm. - Adjusted logic for potential updates and augmenting paths to align with the new structure.
This commit is contained in:
parent
d26f82b4f2
commit
3f469d615b
1 changed files with 20 additions and 13 deletions
|
|
@ -337,6 +337,8 @@ local function minCostAssignment(cost: { { number } }, rows: number, cols: numbe
|
||||||
|
|
||||||
local n = math.max(rows, cols)
|
local n = math.max(rows, cols)
|
||||||
local big = UNMATCHED_PENALTY * 2
|
local big = UNMATCHED_PENALTY * 2
|
||||||
|
local S = n + 1 -- sentinel column (replaces 0-index from the Rust version)
|
||||||
|
local INF = math.huge
|
||||||
|
|
||||||
local c: { { number } } = table.create(n)
|
local c: { { number } } = table.create(n)
|
||||||
for i = 1, n do
|
for i = 1, n do
|
||||||
|
|
@ -349,24 +351,26 @@ local function minCostAssignment(cost: { { number } }, rows: number, cols: numbe
|
||||||
c[i] = row
|
c[i] = row
|
||||||
end
|
end
|
||||||
|
|
||||||
local u = table.create(n + 1, 0)
|
-- u[1..n] = row potentials, u[S] unused but allocated for uniform indexing
|
||||||
local v = table.create(n + 1, 0)
|
local u = table.create(S, 0)
|
||||||
local p = table.create(n + 1, 0)
|
-- v[1..n] = col potentials, v[S] = sentinel potential
|
||||||
local way = table.create(n + 1, 0)
|
local v = table.create(S, 0)
|
||||||
|
-- p[j] = row assigned to column j (0 = unassigned), p[S] = sentinel
|
||||||
local INF = math.huge
|
local p = table.create(S, 0)
|
||||||
|
-- way[j] = previous column in augmenting path
|
||||||
|
local way = table.create(S, 0)
|
||||||
|
|
||||||
for i = 1, n do
|
for i = 1, n do
|
||||||
p[0] = i
|
p[S] = i
|
||||||
local j0 = 0
|
local j0 = S
|
||||||
local minV = table.create(n + 1, INF)
|
local minV = table.create(S, INF)
|
||||||
local used = table.create(n + 1, false)
|
local used = table.create(S, false)
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
used[j0] = true
|
used[j0] = true
|
||||||
local i0 = p[j0]
|
local i0 = p[j0]
|
||||||
local delta = INF
|
local delta = INF
|
||||||
local j1 = 0
|
local j1 = S
|
||||||
|
|
||||||
for j = 1, n do
|
for j = 1, n do
|
||||||
if used[j] then
|
if used[j] then
|
||||||
|
|
@ -383,7 +387,10 @@ local function minCostAssignment(cost: { { number } }, rows: number, cols: numbe
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for j = 0, n do
|
-- Update potentials: sentinel + real columns
|
||||||
|
u[p[S]] += delta
|
||||||
|
v[S] -= delta
|
||||||
|
for j = 1, n do
|
||||||
if used[j] then
|
if used[j] then
|
||||||
u[p[j]] += delta
|
u[p[j]] += delta
|
||||||
v[j] -= delta
|
v[j] -= delta
|
||||||
|
|
@ -402,7 +409,7 @@ local function minCostAssignment(cost: { { number } }, rows: number, cols: numbe
|
||||||
local j1 = way[j0]
|
local j1 = way[j0]
|
||||||
p[j0] = p[j1]
|
p[j0] = p[j1]
|
||||||
j0 = j1
|
j0 = j1
|
||||||
if j0 == 0 then
|
if j0 == S then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue