2013-02-20 2 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

+0

나는 알고있다 - 나는 같은 것을 생각했다! 하지만 나는 체크하고 트리플 체크했다. 그것은 나에게 너무 기괴합니다. 코드는 다소 번거롭기 때문에 게시하지 않은 이유는 무엇입니까? 나는 틀린 일을해야한다고 느낍니다. 유용한 코드 조각을 게시 할 수 있는지 확인합니다. –

답변

3

시작. 모델을 .mps 형식으로 내보낼 수 있다면 (GLPK로 죄송합니다), http://www.neos-server.org/neos/solvers/index.html에 mps 파일을 업로드하고 여러 가지 LP 솔버로 해결할 수 있습니다.

+0

정말 고마워요. 나는 그것을 시도해 볼 것입니다. GLPK가있는 두 개의 오픈 소스 솔버가 "최적"부서에서 매우 열등한 정확도를 가지고 있다는 연구 결과를 읽었습니다. 아마도 제 구현이 아닌 것 같습니다. 4, 7 % 만 수정하십시오. 나는 그것이 충격적인 것을 조금 발견했다! 물론 그들이 찾은 해결책이 그곳의 95 %에 이르지만 최적이 아니라면 그렇게 나쁘지는 않을 것입니다. 그러나이 특별한 경우에는 그렇게 보이지 않습니다. –

+1

4 % 통계를 어디에서 찾을 수 있습니까? 그것은 놀랍습니다. CLP를 참조하는 다른 오픈 소스 솔버입니까? 또한 다른 해결사를 확인한 후에 더 많은 문제 해결 아이디어를 제공 할 수 있습니다. – raoulcousins

+0

죄송합니다. 저는 이걸보고 있습니다! 인생은 혼란스럽게 돌아 섰다. 모든 문제 해결 아이디어는 매우 높이 평가 될 것입니다! 다음은 제가 참조했던 조사입니다 - neon.vb.cbs.nl/casc/..%5Ccasc%5CESSNet2%5Cdeliverable_solverstudy.pdf –