작은 부분에 방정식/불평등 시스템 최적화와 관련된 프로그램이 있습니다. 이상적으로, 나는 Modelica에서 할 수있는 것처럼하고 싶었을 것이고 방정식을 써서 솔버가 처리하도록 할 것입니다.Python - 불평등 시스템 최적화
솔버 및 선형 프로그래밍의 작업은 내 안락 영역에서 벗어나지 만 어쨌든 시도하기로 결정했습니다. 문제는 프로그램의 일반적인 디자인이 객체 지향적이며, 방정식을 형성하는 다양한 조합 가능성과 일부 비선형 성이 있으므로 선형 프로그래밍으로 변환 할 수 없었습니다 문제 (하지만 내가 잘못되었을 수도 있음).
일부 연구를 마친 후 솔버가 내가 원하는 것을 수행 한 것으로 나타났습니다. 이 작품 이제
from z3 import *
a = Real('a')
b = Real('b')
c = Real('c')
d = Real('d')
e = Real('e')
g = Real('g')
f = Real('f')
cost = Real('cost')
opt = Optimize()
opt.add(a + b - 350 == 0)
opt.add(a - g == 0)
opt.add(c - 400 == 0)
opt.add(b - d * 0.45 == 0)
opt.add(c - f - e - d == 0)
opt.add(d <= 250)
opt.add(e <= 250)
opt.add(cost == If(f > 0, f * 50, f * 0.4) + e * 40 + d * 20 +
If(g > 0, g * 50, g * 0.54))
h = opt.minimize(cost)
opt.check()
opt.lower(h)
opt.model()
, 그것은 (I가 필요로 매우 빠른없는에도 불구하고, 나에게 내가 원하는 결과를 제공합니다 : I (이 내가 최적화 싶은 것이 전형적인 경우처럼 보인다)이 함께했다 그러한 시스템을 수천 번 해결하십시오.) 하지만 작업에 적합한 도구를 사용하고 있는지 확실하지 않습니다 (Z3은 "정리 증명자"임).
API는 기본적으로 정확하게 필요하지만 다른 패키지에서 비슷한 구문을 사용할 수 있는지 궁금합니다. 아니면 표준 LP 접근 방식을 허용하는 다른 방식으로 문제를 공식화해야합니까? (비록 내가 어떻게 알지는 못하지만)
LP 솔버는 약 0 초 만에 이것을 해결할 수 있습니다. 실제로는 너무 작습니다. –
네,하지만 함수의 여러 "if"조건을 어떻게 관리 할 수 있습니까? 내가 본 솔루션은 다소 해킹 된 것처럼 보이고 제 경우에는 실제로 작동하지 않습니다. –
변수 분할을 사용하여 구현할 수 있다고 생각합니다. 예. 음수가 아닌 변수'fplus, fmin'을 소개합니다. 'f = fplus-fmin' 제약 조건을 추가하십시오. 첫 번째'if'는'50fplus-0.4fmin'이됩니다. –