Created
November 27, 2019 20:21
-
-
Save bartaelterman/444699ff353b3abf3c80576da3cd3960 to your computer and use it in GitHub Desktop.
Draw Christmas names with Constraint Programming
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Mam buys for Johanna\n", | |
"Bart buys for Alice\n", | |
"Dad buys for Belle\n", | |
"Jonathan buys for Rhonda\n", | |
"Robert buys for Alex\n", | |
"Alex buys for Robert\n", | |
"Rhonda buys for Jonathan\n", | |
"Belle buys for Dad\n", | |
"Alice buys for Bart\n", | |
"Johanna buys for Mam\n" | |
] | |
} | |
], | |
"source": [ | |
"from ortools.sat.python import cp_model\n", | |
"from random import shuffle\n", | |
"\n", | |
"persons = ['Mam', 'Dad', 'Bart', 'Belle', 'Jonathan', 'Johanna', 'Alex', 'Alice', 'Robert', 'Rhonda']\n", | |
"shuffle(persons)\n", | |
"forbidden = [\n", | |
" ['Mam', 'Dad'],\n", | |
" ['Bart', 'Belle',],\n", | |
" ['Jonathan', 'Johanna'],\n", | |
" ['Alex', 'Alice'],\n", | |
" ['Robert', 'Rhonda']\n", | |
"]\n", | |
"\n", | |
"\n", | |
"model = cp_model.CpModel()\n", | |
"\n", | |
"variables = {}\n", | |
"\n", | |
"for buyer in persons:\n", | |
" receiver_dict = {}\n", | |
" for receiver in persons:\n", | |
" receiver_dict[receiver] = model.NewIntVar(0, 1, f'{buyer} buys for {receiver}')\n", | |
" variables[buyer] = receiver_dict\n", | |
"\n", | |
"\n", | |
"for name, buyer in variables.items():\n", | |
" model.Add(sum(buyer.values()) == 1)\n", | |
"\n", | |
"for name in persons:\n", | |
" model.Add(sum([receivers[name] for buyer_name, receivers in variables.items()]) == 1)\n", | |
"\n", | |
"for name in persons:\n", | |
" model.Add(variables[name][name] == 0)\n", | |
"\n", | |
"for name_1, name_2 in forbidden:\n", | |
" model.Add(variables[name_1][name_2] == 0)\n", | |
" model.Add(variables[name_2][name_1] == 0)\n", | |
"\n", | |
"\n", | |
"solver = cp_model.CpSolver()\n", | |
"result = solver.Solve(model)\n", | |
"\n", | |
"if result == cp_model.FEASIBLE:\n", | |
" for buyer, buyer_vars in variables.items():\n", | |
" for receiver, var in buyer_vars.items():\n", | |
" if solver.Value(var):\n", | |
" print(var)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.9" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment