Pyomo:을 포함하는 방법에 형벌을 목적 함수

0

질문

려고 노력해요 비용을 최소화하기 위해 제품의 제조와 두 기계입니다. 비용의 기계은$30/제품과 비용의 기계 B$40/제품입니다.

두 가지 제약 사항이 있습니다.

  • 우리 커버의 수요가 50 제품 per month(x+y>=50)
  • 저렴한계(A)단지조 제품 40per month(x<=40)

그래서 내가 만든 다음 Pyomo 코드:

from pyomo.environ import *
model = ConcreteModel()
model.x = Var(domain=NonNegativeReals)
model.y = Var(domain=NonNegativeReals)

def production_cost(m):
    return 30*m.x + 40*m.y

# Objective
model.mycost = Objective(expr = production_cost, sense=minimize)

# Constraints
model.demand = Constraint(expr = model.x + model.y >= 50)
model.maxA = Constraint(expr = model.x <= 40)

# Let's solve it
results = SolverFactory('glpk').solve(model)

# Display the solution
print('Cost=', model.mycost())
print('x=', model.x())
print('y=', model.y())

그것은 작동 확인,으로 명백한 솔루션 x=40;y=10(비용=1600)

그러나,만약 우리가 사용하기 시작 기계는 B,있을 것입니다 고$300 비용.

내가 함께 노력

def production_cost(m):
  if (m.y > 0):
    return 30*m.x + 40*m.y + 300
  else:
    return 30*m.x + 40*m.y

하지만 나는 다음과 같은 오류 메시지

Rule failed when generating expression for Objective mycost with index
    None: PyomoException: Cannot convert non-constant Pyomo expression (0  <
    y) to bool. This error is usually caused by using a Var, unit, or mutable
    Param in a Boolean context such as an "if" statement, or when checking
    container membership or equality. For example,
        >>> m.x = Var() >>> if m.x >= 1: ...     pass
    and
        >>> m.y = Var() >>> if m.y in [m.x, m.y]: ...     pass
    would both cause this exception.

지 않을 구현하는 방법을 조건은 포함하는 처벌을 목표는 기능을 통해 Pyomo 코드입니다.

optimization pyomo python
2021-11-22 12:46:07
1

최고의 응답

1

m.yVar사용할 수 없습니다 if 문습니다. 당신은 항상 사용할 수 있는 이진 변수를 사용하는 Big M 접근 방법으로 Airsquid 그것을 말했다. 이 방식은 일반적으로 추천하지 않기 때문에,회전에서 문제 LP 로 MILP 지만,그 효과적입니다.

당신은 새로 만들 필요가 Binary Var:

model.bin_y = Var(domain=Binary)

제약 조건을 다음 model.y 할 수 있는 경우 model.bin_y 로,또는 다른,어떤 사이의 값의 범위. 내가 사용하의 100 여기에,하지만 당신이 사용할 수 있습니요:

model.bin_y_cons = Constraint(expr= model.y <= model.bin_y*100)   

그런 다음에서 당신의 목적은 바로 적용되는 새로운 고정 값 300:

def production_cost(m):
    return 30*m.x + 40*m.y + 300*model.bin_y 

model.mycost = Objective(rule=production_cost, sense=minimize)
2021-11-22 15:22:41

감사@pybegginer,아주 잘 설명되어:-)나는 깊은의 사용으로 큰 M.
Hookstark

에 대한 무제한 Vars 당신을 사용할 필요가 매우 큰 값을 바와 같이 1E6. 에 이런 종류의 문제해야 합니다 한 번 더 확인하 찾기 내성 바이너리,수 있기 때문에 발생하는 bin_y 를 손상시킬 수 있습니다. 나 y 은 여전히 greater than zero:는 경우,예를 들어,범위로 설정되어 있습니다 1E6 및 이진성은 1E-6, bin_y 에 할당된 1E-7 일(근로)그러나 결과는 제약 조건 y<=5 수 Y 는 것보다 더 큰니다. 어쨌든,단지 두 사람들을 확인 값을 할 때 모델을 해결
pybegginer

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................