Welcome, guest | Sign In | My Account | Store | Cart
"""

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('_')) != int(card1.split('_'))

#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
symbol = f
card1 = f
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)