Javascript 加速单纯形算法

Javascript 加速单纯形算法,javascript,arrays,algorithm,mathematical-optimization,simplex,Javascript,Arrays,Algorithm,Mathematical Optimization,Simplex,我在这里找到了一个很棒的单纯形算法: 我创建了一个JSFIDLE,在这里我建立了一个模型,并使用上面的算法解决了这个问题 该模型基本上是一个变量和约束的长数组。你可以把它看作是在不同的枢纽(国家)之间寻找最便宜的乘客运输方式,每个国家都有最低的乘客需求,最大的乘客供应,每个连接都有价格。我不在乎乘客去哪里,我只想找到最便宜的方式分发他们。为此,我采用以下最小化目标: model = { "optimize": "cost", "opType": "min"

我在这里找到了一个很棒的单纯形算法:

我创建了一个JSFIDLE,在这里我建立了一个模型,并使用上面的算法解决了这个问题

该模型基本上是一个变量和约束的长数组。你可以把它看作是在不同的枢纽(国家)之间寻找最便宜的乘客运输方式,每个国家都有最低的乘客需求,最大的乘客供应,每个连接都有价格。我不在乎乘客去哪里,我只想找到最便宜的方式分发他们。为此,我采用以下最小化目标:

model = {
        "optimize": "cost",
            "opType": "min",
            "constraints": { \\etc... 
我对模型和算法提供的答案感到满意。。。但后者需要很长时间才能运行(>15秒…)有没有可能加快计算速度

亲切的问候和感谢。
G.

听起来你好像有一个朋友。Zealint有一个合理的外观,他介绍了循环取消算法,这将是我的第一个建议(假设您的LP解算器没有快速优化)。如果这仍然太慢,那就有一整部文学作品


既然你决定用LP解算器来解决这个问题,我的建议是编写一个简单的解算器,它速度快、贪婪,但不太理想,并将其作为LP的起点,用与起点的差异来表示LP。

@Noobster,我很高兴我以外的人正在使用我的simplex库。我浏览了一遍,看了一遍,发现运行时间和你一样(10-20秒)。有一段代码是不必要的转置数组,将RHS从2d数组转换为1d数组。就您的问题而言,每次发生都会消耗60毫秒的性能(对于您的问题,137次)

我已经在回购协议中纠正了这一点,我看到运行时间约为2秒。可能需要进行大量这样的代码清理优化,但我构建此()的问题集太小,我从来不知道这是一个问题。谢谢


为了它的价值,我从大学教科书中取出单纯形算法,并将其转化为代码;MILP的文章来自维基百科

找到了答案。最昂贵的代码是旋转操作;事实证明,通过添加0来更新矩阵需要做大量工作。预先执行一点逻辑以防止出现这种情况,将节点上的运行时间从~12秒降低到~0.5秒

    for (i = 0; i < length; i++) {
        if (i !== row) {
            pivot_row = tbl[i][col];
            for (j = 0; j < width; j++) {


                // No point in doing math if you're just adding
                // Zero to the thing


                if (pivot_row !== 0 && tbl[row][j] !== 0) {
                    tbl[i][j] += -pivot_row * tbl[row][j];
                }
            }
        }
    }
for(i=0;i
你好,大卫!是的,这确实是一个最小成本流问题。我不是在试图重新发明轮子或从头开始编写算法。事实上,我不知道如何开始,这就是为什么我使用上面的单纯形。我喜欢它,因为我可以将变量和约束直接作为数组提供给它。为什么要花这么长时间才能完成?作为一个出发点,我想在以上的工作之前,我考虑其他选择!Noobster您正在使用的LP解算器是一个玩具,但浏览一下,我没有发现任何明显的性能问题。我把我的建议编辑成了答案。贾斯汀这真是令人印象深刻。我非常希望有一天我们能一起工作,我有很多东西要向你们学习。