Pyomo: Cum să includă o sancțiune în funcția obiectiv

0

Problema

Eu sunt încercarea de a minimiza costurile de fabricare a unui produs cu două mașini. Costul mașinii este de $30/produs și costul de mașină B este de 40 $/produs.

Există două constrângeri:

  • noi trebuie să acopere o cerere de 50 de produse pe lună (x+y >= 50)
  • ieftine masini (O) poate doar fabricarea de 40 de produse pe lună (x<=40)

Așa că am creat următoarele Pyomo cod:

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())

Functioneaza ok, cu evidente soluția x=40, y=10 (Cost = 1600)

Cu toate acestea, dacă vom începe să utilizați aparatul B, acolo va fi o penalizare de 300 de dolari de-a lungul cost.

Am incercat si cu

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

Dar am primit următorul mesaj de eroare

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.

Nu am cum să pună în aplicare condiția de a include pedeapsa în funcția obiectiv prin Pyomo cod.

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

Cel mai bun răspuns

1

Deoarece m.y este un Var, nu puteți utiliza if declarație cu ea. Îl poți folosi întotdeauna o variabilă binară folosind Big M abordarea Airsquid spus-o. Această abordare este, de obicei, nu este recomandat, deoarece acesta se transformă problema din LP într-un MILP, dar este eficient.

Ai nevoie doar pentru a crea un nou Binary Var:

model.bin_y = Var(domain=Binary)

Apoi constrângere model.y pentru a fi zero dacă model.bin_y este zero, sau altceva, fie de orice valoare între limitele sale. Eu folosesc un legat de 100 de aici, dar puteți folosi chiar și cererea:

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

apoi, în obiectivul tau doar aplica noua valoare fixă de 300 de:

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

Multumesc @pybegginer, foarte bine explicat :-) voi merge mai adânc în utilizarea de Mare M.
Hookstark

Pentru nemarginit Vars ai nevoie de a utiliza o valoare foarte mare de legat, cum ar fi 1E6. În acest tip de problemă, va trebui să verificați solver toleranță la Binar, deoarece s-ar putea intampla asta bin_y este de aprox. zero, dar y este încă mai mare decât zero: de exemplu, dacă limitele sunt stabilite ca 1E6 și binar de toleranță este de 1E-6, bin_y este atribuit 1E-7(foarte aproape de zero), dar care rezultă constrângere este y<=5 permițându-Y să fie mai mare decât zero. Oricum, doar să verificați aceste valori atunci când modelul este rezolvată
pybegginer

În alte limbi

Această pagină este în alte limbi

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