या उपकरण सीपी-सैट सॉल्वर निर्यात / आयात: मॉडल लोड करने के बाद var का उपयोग कैसे करें?

Dec 08 2020

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 चर के साथ बातचीत करने की अनुमति देगा।

जवाब

2 etov Dec 08 2020 at 23:41

@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