Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bartaelterman/444699ff353b3abf3c80576da3cd3960 to your computer and use it in GitHub Desktop.
Save bartaelterman/444699ff353b3abf3c80576da3cd3960 to your computer and use it in GitHub Desktop.
Draw Christmas names with Constraint Programming
Display the source blob
Display the rendered blob
Raw
{
"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