"""
Example script to try and replicate the Dobble game.
1. setup our decision variables, all symbols can potentially be allocated
to each card.
Card_0_Symbol_0_Card_1 = 0 (symbol is not the card 0)
Card_0_Symbol_0_Card_0 = 1 (symbol is on the card)
Author: Alexander Baker April 2016
"""
from collections import OrderedDict
# import PuLp modeler functions
from pulp import *
def check(card0, card1):
return int(card0.split('_')[1]) != int(card1.split('_')[1])
#Create a prob variable to contain the problem data
prob = LpProblem('Dobble Card Game', LpMinimize)
# Set the number of symbols to 50
m = 50
# Set the number of cards to 55
n = 57
# Set the number of symbols per card
z = 8
Symbol = ['Symbol_%d'%(i) for i in xrange(0, m)]
# Setup Card list
Card = ['Card_%d'%(i) for i in xrange(0, n)]
card_symbol = []
for card0 in Card:
for s in Symbol:
for card1 in Card:
if check(card0, card1):
card_symbol.append('%s_%s_%s'%(card0,s,card1))
symbol_card_var = LpVariable.dicts("CardSymbolCard", \
card_symbol, \
lowBound=0, \
upBound=1, \
cat='Integer')
for c0 in Card:
prob += lpSum([symbol_card_var['%s_%s_%s'%(c0, s, c1)] \
for s in Symbol \
for c1 in Card \
if check(c0, c1)]) == z
for c0 in Card:
for s in Symbol: \
prob += lpSum([symbol_card_var['%s_%s_%s'%(c0, s, c1)] \
for c1 in Card \
if check(c0, c1)]) <= 1
for c0 in Card:
#print c0
for c1 in Card:
#print s
prob += lpSum([symbol_card_var['%s_%s_%s'%(c0, s, c1)] \
for s in Symbol\
if check(c0, c1)]) <= 1
for c0 in Card:
for s in Symbol:
for c1 in Card:
if check(c0, c1):
y = LpVariable('dummy_%s_%s_%s'%(c0,s,c1),0,1,cat='Integer')
prob += 1 <= symbol_card_var['%s_%s_%s'%(c0,s,c1)] + 10*y
prob += symbol_card_var['%s_%s_%s'%(c1,s,c0)] <= 0 + 10*(1-y)
prob.writeLP('dobble.lp')
prob += 0, "Arbitrary Objective Function"
status = prob.solve()
print LpStatus[status]
results = OrderedDict()
for v in prob.variables():
if 'dummy' in v.name:
continue
f = v.name.split('_')
card0 = f[2]
symbol = f[4]
card1 = f[6]
if v.varValue == 1:
if 'C%s'%(card0) in results:
if not 'S%s'%(symbol) in results['C%s'%(card0)]:
results['C%s'%(card0)].append('%s(Card %s)'%(symbol, card1))
else:
results['C%s'%(card0)] = ['%s(Card %s)'%(symbol, card1)]
for k,v in results.items():
print k, v
print prob.objective
print value(prob.objective)