{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "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", "def main():\n", " # Data.\n", " cost = [[90, 76, 75, 70, 50, 74],\n", " [35, 85, 55, 65, 48, 101],\n", " [125, 95, 90, 105, 59, 120],\n", " [45, 110, 95, 115, 104, 83],\n", " [60, 105, 80, 75, 59, 62],\n", " [45, 65, 110, 95, 47, 31],\n", " [38, 51, 107, 41, 69, 99],\n", " [47, 85, 57, 71, 92, 77],\n", " [39, 63, 97, 49, 118, 56],\n", " [47, 101, 71, 60, 88, 109],\n", " [17, 39, 103, 64, 61, 92],\n", " [101, 45, 83, 59, 92, 27]]\n", "\n", " group1 = [[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]] # Workers 0, 2\n", "\n", " group2 = [[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]] # Workers 4, 7\n", "\n", " group3 = [[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]] # Workers 8, 11\n", "\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)) 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]], group3)\n", "\n", " # Total cost\n", " model.Add(total_cost ==\n", " sum(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", "\n", "if __name__ == '__main__':\n", " main()" ] } ], "metadata": {}, "nbformat": 4, "nbformat_minor": 2 }