固定费用运输问题的 Javascript 算法

问题描述

我已经询问了一个问题的名称,在该问题中,我们使用 Math StackExchange 中每行和每列的给定总和来搜索某个矩阵:

https://math.stackexchange.com/questions/3697532/find-matrices-given-sums-of-each-row-and-column-with-bounded-integer-entries-ma

它的名字是固定电荷运输问题,它也与图论整数规划有关。

我也在javascript中实现了一些算法来解决它,但它们很慢。基本上,它会测试每一种可能性。

有人已经实现了,或者知道一些带有这个(也许更多)图形算法的 js 库?

编辑 1

仅考虑等于 1 的固定成本。这足以解决我的问题。我首先寻求任何解决方案,因为可以在矩形定位的单元格中交换数量以找到局部最小值。

这是我当前的递归算法(变量名来自葡萄牙语,所以为了清楚起见,我添加了一些注释):

var gra; //desired sums for rows
var dem; //desired sums for columns
var x; //current solution being built (bidimensional array); will be returned when one is found

var [iMax,jMax] = [gra.length,dem.length];

function passo(i,j) {
    if (j == jMax - 1) { //if last column
        var m = gra[i];
        
        if (m > max[i][j]) {
            return;
        }
        
        x[i][j] = m;
        gra[i] -= m;
        dem[j] -= m;
        
        if (i == iMax - 1) {
            if (gra[i] == 0 && dem[j] == 0) {
                return true;
            }
        } else {
            if (passo(i + 1,j)) return true;
        }
        
        gra[i] += m;
        dem[j] += m;
    } else {
        if (i == iMax - 1) { //if last row
            var m = dem[j];
            if (m <= max[i][j] && m <= gra[i]) {
                x[i][j] = m;
                gra[i] -= m;
                dem[j] -= m;
                
                if (passo(0,j + 1)) return true;
                
                gra[i] += m;
                dem[j] += m;
            }
        } else {
            for (var m = Math.min(max[i][j],gra[i],dem[j]); m >= 0; m--) {
                x[i][j] = m;
                gra[i] -= m;
                dem[j] -= m;
                
                if (passo(i + 1,j)) return true;
                
                gra[i] += m;
                dem[j] += m;
            }
        }
    }
}

passo(0,0);

解决方法

有一个库。

它是glpk.js,一个带有json接口的GLPK包装器。

https://github.com/jvail/glpk.js

这个问题可以用(混合)整数线性规划解决。