more code samples for sat
This commit is contained in:
@@ -84,6 +84,67 @@ def RabbitsAndPheasants():
|
||||
print('%i rabbits and %i pheasants' % (solver.Value(r), solver.Value(p)))
|
||||
|
||||
|
||||
def BinpackingProblem():
|
||||
"""Solves a bin-packing problem."""
|
||||
# Data.
|
||||
bin_capacity = 100
|
||||
slack_capacity = 20
|
||||
num_bins = 10
|
||||
all_bins = range(num_bins)
|
||||
|
||||
items = [(20, 12), (15, 12), (30, 8), (45, 5)]
|
||||
num_items = len(items)
|
||||
all_items = range(num_items)
|
||||
|
||||
# Model.
|
||||
model = cp_model.CpModel()
|
||||
|
||||
# Main variables.
|
||||
x = {}
|
||||
for i in all_items:
|
||||
num_copies = items[i][1]
|
||||
for b in all_bins:
|
||||
x[(i, b)] = model.NewIntVar(0, num_copies, 'x_%i_%i' % (i, b))
|
||||
|
||||
# Load variables.
|
||||
load = [model.NewIntVar(0, bin_capacity, 'load_%i' % b) for b in all_bins]
|
||||
|
||||
# Slack variables.
|
||||
slacks = [model.NewBoolVar('slack_%i' % b) for b in all_bins]
|
||||
|
||||
# Links load and x.
|
||||
for b in all_bins:
|
||||
model.Add(load[b] == sum(x[(i, b)] * items[i][0] for i in all_items))
|
||||
|
||||
# Place all items.
|
||||
for i in all_items:
|
||||
model.Add(sum(x[(i, b)] for b in all_bins) == items[i][1])
|
||||
|
||||
# Links load and slack through an equivalence relation.
|
||||
safe_capacity = bin_capacity - slack_capacity
|
||||
for b in all_bins:
|
||||
# slack[b] => load[b] <= safe_capacity.
|
||||
model.Add(load[b] <= safe_capacity).OnlyEnforceIf(slacks[b])
|
||||
# not(slack[b]) => load[b] > safe_capacity.
|
||||
model.Add(load[b] > safe_capacity).OnlyEnforceIf(slacks[b].Not())
|
||||
|
||||
# Maximize sum of slacks.
|
||||
model.Maximize(sum(slacks))
|
||||
|
||||
print(model)
|
||||
|
||||
# Solves and prints out the solution.
|
||||
solver = cp_model.CpSolver()
|
||||
status = solver.Solve(model)
|
||||
print('Solve status: %s' % solver.StatusName(status))
|
||||
if status == cp_model.OPTIMAL:
|
||||
print('Optimal objective value: %i' % solver.ObjectiveValue())
|
||||
print('Statistics')
|
||||
print(' - conflicts : %i' % solver.NumConflicts())
|
||||
print(' - branches : %i' % solver.NumBranches())
|
||||
print(' - wall time : %f s' % solver.WallTime())
|
||||
|
||||
|
||||
def IntervalSample():
|
||||
model = cp_model.CpModel()
|
||||
horizon = 100
|
||||
@@ -364,6 +425,8 @@ def main(_):
|
||||
ReifiedSample()
|
||||
print('--- RabbitsAndPheasants ---')
|
||||
RabbitsAndPheasants()
|
||||
print('--- BinpackingProblem ---')
|
||||
BinpackingProblem()
|
||||
print('--- IntervalSample ---')
|
||||
IntervalSample()
|
||||
print('--- MinimalCpSat ---')
|
||||
|
||||
Reference in New Issue
Block a user