Repository navigation
Expand file tree
/
Copy pathsimple_CP.py
More file actions
107 lines (87 loc) · 3.44 KB
/
Copy pathsimple_CP.py
File metadata and controls
107 lines (87 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""
================================================================================
Title : Simple CP Model
Description : This OT-Tools code solves the a simple IP Problem
Developed by: Dr. Alireza Soroudi
Website : https://optexpert.org/
Contact : https://t.me/pypyid
================================================================================
"""
from ortools.sat.python import cp_model
model = cp_model.CpModel()
x = model.new_int_var(0, 2, f"x")
y = model.new_int_var(0, 2, f"y")
model.add(x + 5 * y <= 2)
model.maximize(x + y)
solver = cp_model.CpSolver()
results = solver.Solve(model)
print(solver.status_name(results))
print('OF =', solver.objective_value)
print(f'x ={solver.value(x)}, y= {solver.value(y)}')
class VarArraySolutionPrinter(cp_model.CpSolverSolutionCallback):
"""Print intermediate solutions."""
def __init__(self, variables: list[cp_model.IntVar]):
cp_model.CpSolverSolutionCallback.__init__(self)
self.__variables = variables
self.__solution_count = 0
def on_solution_callback(self) -> None:
self.__solution_count += 1
print(f"Solution {self.__solution_count}")
for v in self.__variables:
print(f"{v}={self.value(v)}", end=" ")
print()
@property
def solution_count(self) -> int:
return self.__solution_count
class VarArraySolutionPrinternSolution(cp_model.CpSolverSolutionCallback):
def __init__(self, variables: list[cp_model.IntVar], n: int):
cp_model.CpSolverSolutionCallback.__init__(self)
self.__variables = variables
self.__solution_count = 0
self.__limit = n
def on_solution_callback(self) -> None:
self.__solution_count += 1
print(f"Solution {self.__solution_count}")
for v in self.__variables:
print(f"{v}={self.value(v)}", end=" ")
print()
if self.__solution_count == self.__limit:
self.stop_search()
@property
def solution_count(self) -> int:
return self.__solution_count
def all_solutions_sample_sat():
"""Showcases calling the solver to search for small number of solutions."""
# Creates the model.
model = cp_model.CpModel()
x = model.new_int_var(0, 2, f"x")
y = model.new_int_var(0, 2, f"y")
model.add(x + 5 * y <= 2)
# model.maximize(x + y)
solver = cp_model.CpSolver()
solution_printer = VarArraySolutionPrinter([x, y])
# Enumerate all solutions.
solver.parameters.enumerate_all_solutions = True
# Solve.
status = solver.solve(model, solution_printer)
print(f"Status = {solver.status_name(status)}")
print(f"Number of solutions found: {solution_printer.solution_count}")
all_solutions_sample_sat()
print("----------------------------")
def all_solutions_sample_sat_nsolution():
"""Showcases calling the solver to search for small number of solutions."""
# Creates the model.
model = cp_model.CpModel()
x = model.new_int_var(0, 2, f"x")
y = model.new_int_var(0, 2, f"y")
model.add(x + 5 * y <= 2)
# model.maximize(x + y)
solver = cp_model.CpSolver()
solution_printer = VarArraySolutionPrinternSolution([x, y], 2)
# Enumerate all solutions.
solver.parameters.enumerate_all_solutions = True
# Solve.
status = solver.solve(model, solution_printer)
print(f"Status = {solver.status_name(status)}")
print(f"Number of solutions found: {solution_printer.solution_count}")
all_solutions_sample_sat_nsolution()