Pyomo: शामिल करने के लिए कैसे में एक दंड उद्देश्य समारोह

0

सवाल

मैं कोशिश कर रहा हूँ करने के लिए कम से कम लागत के निर्माण के साथ एक उत्पाद के दो मशीनों की है । इस मशीन की लागत एक $30/उत्पाद और मशीन की लागत है $40/उत्पाद.

वहाँ रहे हैं दो की कमी:

  • हम को कवर करना होगा एक मांग के 50 उत्पादों प्रति माह (x+y >= 50)
  • सस्ते मशीन (एक) कर सकते हैं केवल निर्माण 40 उत्पादों का प्रति माह (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)

हालांकि, अगर हम शुरू करने के लिए मशीन का उपयोग करें बी, वहाँ हो जाएगा एक निश्चित दंड के 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.y एक Var, आप का उपयोग नहीं कर सकता 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, बहुत अच्छी तरह से समझाया :-) मैं में गहरा जाने के लिए एम.
Hookstark

के लिए असीम Vars आप की जरूरत है का उपयोग करने के लिए एक बहुत बड़ा मूल्य के लिए बाध्य है, इस तरह के रूप में 1E6. इस तरह की समस्या है, तो आप की आवश्यकता होगी करने के लिए डबल की जाँच करें सॉल्वर सहिष्णुता के लिए द्विआधारी, के बाद से यह हो सकता है कि क्या होता है bin_y लगभग है । शून्य है, लेकिन y अभी भी शून्य से अधिक: उदाहरण के लिए, यदि सीमा सेट कर रहे हैं के रूप में 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ý
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में