{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Copyright 2010-2017 Google\n", "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# http://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License.\n", "from __future__ import print_function\n", "from ortools.sat.python import cp_model\n", "\n", "\n", "# Data.\n", "cost = [[90, 76, 75, 70, 50, 74], [35, 85, 55, 65, 48,\n", " 101], [125, 95, 90, 105, 59, 120],\n", " [45, 110, 95, 115, 104, 83], [60, 105, 80, 75, 59, 62], [\n", " 45, 65, 110, 95, 47, 31\n", " ], [38, 51, 107, 41, 69, 99], [47, 85, 57, 71,\n", " 92, 77], [39, 63, 97, 49, 118, 56],\n", " [47, 101, 71, 60, 88, 109], [17, 39, 103, 64, 61,\n", " 92], [101, 45, 83, 59, 92, 27]]\n", "\n", "group1 = [\n", " [0, 0, 1, 1], # Workers 2, 3\n", " [0, 1, 0, 1], # Workers 1, 3\n", " [0, 1, 1, 0], # Workers 1, 2\n", " [1, 1, 0, 0], # Workers 0, 1\n", " [1, 0, 1, 0]\n", "] # Workers 0, 2\n", "\n", "group2 = [\n", " [0, 0, 1, 1], # Workers 6, 7\n", " [0, 1, 0, 1], # Workers 5, 7\n", " [0, 1, 1, 0], # Workers 5, 6\n", " [1, 1, 0, 0], # Workers 4, 5\n", " [1, 0, 0, 1]\n", "] # Workers 4, 7\n", "\n", "group3 = [\n", " [0, 0, 1, 1], # Workers 10, 11\n", " [0, 1, 0, 1], # Workers 9, 11\n", " [0, 1, 1, 0], # Workers 9, 10\n", " [1, 0, 1, 0], # Workers 8, 10\n", " [1, 0, 0, 1]\n", "] # Workers 8, 11\n", "\n", "sizes = [10, 7, 3, 12, 15, 4, 11, 5]\n", "total_size_max = 15\n", "num_workers = len(cost)\n", "num_tasks = len(cost[1])\n", "all_workers = range(num_workers)\n", "all_tasks = range(num_tasks)\n", "\n", "# Model.\n", "\n", "model = cp_model.CpModel()\n", "# Variables\n", "total_cost = model.NewIntVar(0, 1000, 'total_cost')\n", "x = [[model.NewBoolVar('x[%i,%i]' % (i, j))\n", " for j in all_tasks]\n", " for i in all_workers]\n", "works = [model.NewBoolVar('works[%i]' % i) for i in all_workers]\n", "\n", "# Constraints\n", "\n", "# Link x and workers.\n", "for i in range(num_workers):\n", " model.AddMaxEquality(works[i], x[i])\n", "\n", "# Each task is assigned to at least one worker.\n", "for j in all_tasks:\n", " model.Add(sum(x[i][j] for i in all_workers) >= 1)\n", "\n", "# Total task size for each worker is at most total_size_max\n", "for i in all_workers:\n", " model.Add(sum(sizes[j] * x[i][j] for j in all_tasks) <= total_size_max)\n", "\n", "# Group constraints.\n", "model.AddAllowedAssignments([works[0], works[1], works[2], works[3]], group1)\n", "model.AddAllowedAssignments([works[4], works[5], works[6], works[7]], group2)\n", "model.AddAllowedAssignments([works[8], works[9], works[10], works[11]],\n", " group3)\n", "\n", "# Total cost\n", "model.Add(total_cost == sum(\n", " x[i][j] * cost[i][j] for j in all_tasks for i in all_workers))\n", "model.Minimize(total_cost)\n", "\n", "# Solve and output solution.\n", "solver = cp_model.CpSolver()\n", "status = solver.Solve(model)\n", "\n", "if status == cp_model.OPTIMAL:\n", " print('Total cost = %i' % solver.ObjectiveValue())\n", " print()\n", " for i in all_workers:\n", " for j in all_tasks:\n", " if solver.Value(x[i][j]) == 1:\n", " print('Worker ', i, ' assigned to task ', j, ' Cost = ', cost[i][j])\n", "\n", " print()\n", "\n", "print('Statistics')\n", "print(' - conflicts : %i' % solver.NumConflicts())\n", "print(' - branches : %i' % solver.NumBranches())\n", "print(' - wall time : %f ms' % solver.WallTime())\n", "\n" ] } ], "metadata": {}, "nbformat": 4, "nbformat_minor": 2 }