GLPK线性规划

5

我正在处理一些非常大规模的线性规划问题。(矩阵目前大约是1000x1000,而这些只是“小型”矩阵。)

我曾以为我的程序成功运行了,只是现在我意识到我得到了一些非常不直观的答案。例如,假设我想要最大化x+y+z,受到一组约束条件x+y<10和y+z<5的限制。我运行它并获得了最优解。然后,我再运行同样的方程但是使用不同的约束条件:x+y<20和y+z<5。然而,在第二次迭代中,我的最大化结果下降了!

我费尽心思地检查过了约束条件是否正确加载。

有人知道可能是什么问题吗?

我在文档中找到了关于lpx_check_kkt的一些内容,似乎可以告诉你何时您的解决方案可能是正确或高置信度(或者也可能是低置信度),但我不知道如何使用它。

我尝试了一下,但出现了错误信息lpx_check_kkt未定义。

我附加了一些代码,希望有人能找到一个错误。结论是它声称已经找到了最优解。然而,每次我提高上限时,它都变得不那么优秀。

    size = 10000000+1
    ia = intArray(size)
    ja = intArray(size)
    ar = doubleArray(size)
    prob = glp_create_prob()

    glp_set_prob_name(prob, "sample")
    glp_set_obj_dir(prob, GLP_MAX)
    glp_add_rows(prob, Num_constraints)
    for x in range(Num_constraints):
            Variables.add_variables(Constraints_for_simplex)
            glp_set_row_name(prob, x+1, Variables.variers[x])
            glp_set_row_bnds(prob, x+1, GLP_UP, 0, Constraints_for_simplex[x][1])
            print 'we set the row_bnd for', x+1,' to ',Constraints_for_simplex[x][1]
    glp_add_cols(prob, len(All_Loops))
    for x in range(len(All_Loops)):
            glp_set_col_name(prob, x+1, "".join(["x",str(x)]))
            glp_set_col_bnds(prob,x+1,GLP_LO,0,0)
            glp_set_obj_coef(prob,x+1,1)
    for x in range(1,len(All_Loops)+1):
            z=Constraints_for_simplex[0][0][x-1]
            ia[x] = 1; ja[x] = x;  ar[x] = z
    x=len(All_Loops)+1
    while x<Num_constraints + len(All_Loops):
    for y in range(2, Num_constraints+1):
                    z=Constraints_for_simplex[y-1][0][0]
                    ia[x] = y; ja[x] =1 ; ar[x] = z
                    x+=1
    x=Num_constraints+len(All_Loops)
    while x <len(All_Loops)*(Num_constraints-1):
            for z in range(2,len(All_Loops)+1):
                    for y in range(2,Num_constraints+1):
                            if x<len(All_Loops)*Num_constraints+1:
                                    q = Constraints_for_simplex[y-1][0][z-1]
                                    ia[x] = y ; ja[x]=z; ar[x] = q
                                    x+=1


    glp_load_matrix(prob, len(All_Loops)*Num_constraints, ia, ja, ar)
    glp_exact(prob,None)
    Z = glp_get_obj_val(prob)

你设置了最大化的目标方向吗?默认是最小化,根据你所说的情况,看起来你没有设置,或者至少可以解释为什么你的目标在下降。 - Ali
我知道 - 我也是这么想的!但我已经检查了三遍。这对我来说太奇怪了。代码相当繁琐,所以我没有发布它,但也许我应该。我感觉我一定做错了什么。我会看看能否找到一个有用的代码块来发布。 - Hilary Park
1个回答

4

首先,使用不同的求解器来解决您的问题实例,并检查目标函数值。如果您可以将您的模型导出为.mps格式(我不知道如何使用GLPK做到这一点,抱歉),您可以将mps文件上传到http://www.neos-server.org/neos/solvers/index.html并使用多个不同的LP求解器进行求解。


非常感谢 - 我会尝试一下的 - 我刚刚读到了一些研究,说两个开源求解器中GLPK是其中之一,在“最优”方面精度非常差,所以也许不是我的实现问题。只有4%和7%的正确率。我觉得有点震惊!当然,如果它们找到的解决方案恰好达到了95%的要求但不是最优的,那么情况就不会太糟糕,但在这种特定情况下似乎并非如此。 - Hilary Park
1
你能分享一下你找到那个4%的数据的来源吗?这让人感到惊讶。你提到的另一个开源求解器是CLP吗?此外,一旦你检查了其他求解器,我可以给你更多的故障排除思路。 - user327301
非常抱歉我才看到这个消息!生活变得有些混乱。如果您有任何故障排除的想法,将不胜感激!这是我参考的调查链接 - neon.vb.cbs.nl/casc/..%5Ccasc%5CESSNet2%5Cdeliverable_solverstudy.pdf - Hilary Park
目前还没有想法...如果可能的话,请更新问题,说明尝试使用不同的求解器解决模型的结果。此外,在那篇论文中哪里提到了4%和7%的统计数据?我没有看到任何关于求解器提供错误解决方案的内容。 - user327301
引用在第6页底部:一个非常有趣的事实是,GLKP和LP SOLVE只能计算出87个问题实例中的3或5个最优解。 - Hilary Park
1
我明白了。这篇论文并没有说GLPK将非最优解报告为最优解。它所说的是,在大多数情况下,GLPK在运行一个小时后仍未找到最优解。GLPK虽然慢,但不一定不准确。 - user327301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接