2017-12-09 32 views
1

는 :펄프 파이썬 LP 나는 다음과 같은 코드를 실행하면 잘못된 솔루션

from pulp import * 

x = pulp.LpVariable("x", 0, None , LpContinuous) 
y = pulp.LpVariable("y", 0, None , LpContinuous) 
problem = pulp.LpProblem("A simple max problem", pulp.LpMinimize) 
problem += x + y, "The objective function" 
problem += x + 2*y == 2, "1st constraint" 
problem += 2*x + 3*y == 2, "2nd constraint" 
problem += x >= 0, "3rd constraint" 
problem += y >= 0, "4th constraint" 
problem += x + y == 1, "5th constraint" 

problem.writeLP("WhiskasModel.lp") 
problem.solve() 

for variable in problem.variables(): 
    print variable.name, "=", variable.varValue 

print value(problem.objective) 

나는 출력으로 얻을 : 2 제약 조건이 만족되지 않기 때문에, 분명히 잘못된 것입니다

x = 0.0 
y = 1.0 
1.0 

합니다. 이제는 위의 문제에 대한 해결책이 없습니다. 그래서 저는 펄프가 관련성이있는 ("Infeasible problem") 것과 비슷한 것을 알려주기를 기대합니다. 대신, 나는 임의로 제약 조건 중 일부를 삭제하고 나머지 제약 조건과 함께 작동한다고 생각합니다. 마찬가지로, 다음의 경우 :

x = pulp.LpVariable("x", 0, None , LpContinuous) 
y = pulp.LpVariable("y", 0, None , LpContinuous) 
problem = pulp.LpProblem("A simple max problem", pulp.LpMinimize) 
problem += x + y, "The objective function" 
problem += x + 2*y == 2, "1st constraint" 
problem += 2*x + 3*y == 20, "2nd constraint" 
problem += x >= 0, "3rd constraint" 
problem += y >= 0, "4th constraint" 
problem += x + y == 1, "5th constraint" 

problem.writeLP("WhiskasModel.lp") 
problem.solve() 

for variable in problem.variables(): 
    print variable.name, "=", variable.varValue 

print value(problem.objective) 

OUPUT는

x = 34.0 
y = -16.0 
18.0 

즉 4 번째 제약은 이제 "드롭"된다.

누구든지이 문제를 해결하는 방법을 알고 있습니까?

답변

0

프로그램은 첫 번째 제약 조건부터 시작하여 스스로 해결하려고 시도합니다. 선형 대수학 관점에서 그것의

생각해는 보강 매트릭스는 다음 두 변수> = 0이어야 상기 제약

[ 1 2 | 2 
    2 3 | 20 
    1 1 | 1 ] 

. 가 직접 당신이 종료됩니다 두 번째에서 두 번 첫 번째 행을 뺀 :

[ 1 2 | 2 
    0 -1 | 16 
    .........] 

을 즉, 첫 번째 제약 조건을 만족시키기 위해, 당신은 -16 만 가능한 해결책이 될하기 위해 Y 변수를 강제로. x 변수는 첫 번째 행을 푸는 결과로 34가됩니다. 모든 추가 제약 조건과 목적 함수는 더 이상 중요하지 않습니다. 이것이 가능한 유일한 해결책이었습니다.

문제는 모든 제약 조건을 만족하는 솔루션이없는 경우 시스템에서 경고를 표시합니다. 현재이 패키지에 구현되어 있지 않으며 Git을보고 있기 때문에이 동작을 변경하지 않으므로 실행 불가능한 문제에 대해 경고하고 싶으면 패키지를 변경하십시오.

패키지를 변경하지 않으려는 경우 문제가 해결사에서 제약 조건을 위반하여 실행 불가능하다는 것을 알 수 있습니다. 코드 블록을 작성하여 경고/예외를 직접 throw 할 수 있습니다.