या उपकरण सीपी-सैट सॉल्वर निर्यात / आयात: मॉडल लोड करने के बाद var का उपयोग कैसे करें?
OR-Tools CP-CAT सॉल्वर (संदर्भ) में पायथन इंटरफ़ेस का उपयोग करते हुए , मैं एक cp_model को बचाने में सक्षम होना चाहूंगा, इसे बाद के समय या किसी अन्य प्रक्रिया से लोड कर सकता हूं और इसके साथ सहभागिता जारी रख सकता हूं।
मैं एक मॉडल को एक प्रोटूफ़ में क्रमबद्ध करने में सक्षम हूं, और फिर इसे लोड और हल कर सकता हूं:
from google.protobuf import text_format
from ortools.sat.python import cp_model
def create_model():
model = cp_model.CpModel()
a = model.NewIntVar(0, 10, "var_a")
b = model.NewIntVar(0, 10, "var_b")
model.Maximize(a + b)
return model
def clone_model(model):
new_model = cp_model.CpModel()
text_format.Parse(str(model), new_model.Proto())
return new_model
def solve_model(model):
solver = cp_model.CpSolver()
status = solver.Solve(new_model)
print(solver.StatusName(status))
print(solver.ObjectiveValue())
# Works fine
model = create_model()
new_model = clone_model(model)
solve_model(new_model)
(स्रोत)
हालांकि, मैं इसे लोड करने के बाद मॉडल के साथ बातचीत करना जारी रखना चाहूंगा। उदाहरण के लिए, मैं कुछ ऐसा करने में सक्षम होना चाहता हूं:
model = create_model()
new_model = clone_model(model)
c = new_model.NewIntVar(0, 5, "var_c")
new_model.Add(a < c)
समस्या यह है कि यह अंतिम पंक्ति काम नहीं करती है क्योंकि a
परिभाषित नहीं है; और मुझे मौजूदा मॉडल के चर तक पहुंचने का कोई तरीका नहीं मिला।
मैं कुछ इस तरह की तलाश कर रहा हूं: a = new_model.getExistingVariable("var_a")
जो मुझे लोड करने के बाद मॉडल में preexisting चर के साथ बातचीत करने की अनुमति देगा।
जवाब
@Stradivari की एक टिप्पणी के आधार पर, एक दृष्टिकोण जो काम कर रहा है, वह है बस pickle
इसके चर के साथ मॉडल।
उदाहरण के लिए:
from ortools.sat.python import cp_model
import pickle
class ClonableModel:
def __init__(self):
self.model = cp_model.CpModel()
self.vars = {}
def create_model(self):
self.vars['a'] = self.model.NewIntVar(0, 10, "var_a")
self.vars['b'] = self.model.NewIntVar(0, 10, "var_b")
self.model.Maximize(self.vars['a'] + self.vars['b'])
# Also possible to serialize via a file / over network
def clone(self):
return pickle.loads(pickle.dumps(self))
def solve(self):
solver = cp_model.CpSolver()
status = solver.Solve(self.model)
return '%s: %i' % (solver.StatusName(status), solver.ObjectiveValue())
अब, निम्नलिखित उम्मीद के अनुसार काम करता है:
model = ClonableModel()
model.create_model()
new_model = model.clone()
new_model.model.NewIntVar(0,5,"c")
new_model.model.Add(new_model.vars['a'] < c)
print('Original model: %s' % model.solve())
print('Cloned model: %s' % new_model.solve())
# Original model: OPTIMAL: 20
# Cloned model: OPTIMAL: 14