2013-02-20 79 views
4

我正在處理一些非常大規模的線性規劃問題。 (矩陣目前大致爲1000x1000,這些都是'迷你')。GLPK線性規劃

我以爲我的程序運行成功,只有我意識到我得到了一些非常不直觀的答案。例如,假設我將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) 
+0

您是否設定了最大化的客觀方向?默認值是最小化,根據你所說的看起來你沒有,或者至少可以解釋爲什麼你的目標正在下降。 – Ali 2013-02-20 18:51:38

+0

我知道 - 我以爲同樣的事情!但我已經過檢查和三重檢查。這對我來說太奇怪了。代碼相當麻煩,因此我沒有發佈它,但也許我應該。我覺得我一定在做錯事。我會看看我是否可以找到一段有用的代碼發佈。 – 2013-02-20 19:27:59

回答

3

首先解決有問題的實例與不同的求解器並檢查目標函數值。如果您可以將您的模型導出爲.mps格式(我不知道如何使用GLPK執行此操作,對不起),您可以將mps文件上傳到http://www.neos-server.org/neos/solvers/index.html,並使用幾種不同的LP解算器解決此問題。

+0

非常感謝 - 我會試一試 - 我只是讀了一些研究,說GLPK的兩個開源解決方案在「最佳」部門中的準確性很差,所以也許這不是我的實現。只糾正4%和7%的時間。我發現這有點令人震驚!當然,如果他們發現的解決方案恰好是95%的解決方案,但並不是最優的解決方案,那也不會那麼糟糕,但在這個特殊情況下,似乎並非如此。 – 2013-02-21 19:30:18

+1

你能發佈你發現4%統計的地方嗎?這是令人驚訝的。您提到CLP的另一個開源解決方案是什麼?此外,一旦您查看了其他求解器,我可以爲您提供更多的故障排除建議。 – raoulcousins 2013-02-21 21:45:55

+0

對不起,我只是看到這個!生活發生了混亂。任何疑難解答的想法將非常感激!這裏是我參考的調查 - neon.vb.cbs.nl/casc/..%5Ccasc%5CESSNet2%5Cdeliverable_solverstudy.pdf – 2013-02-28 17:33:55