{ "cells": [ { "cell_type": "code", "execution_count": 2, "id": "19a17ff2", "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "def random_request():\n", " return [sorted(random.sample(range(100),2)), random.random()*10]" ] }, { "cell_type": "code", "execution_count": 6, "id": "1fbba6d3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[4, 77], 7.812850208565464]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_request()" ] }, { "cell_type": "code", "execution_count": 7, "id": "ecd4b9ce", "metadata": {}, "outputs": [], "source": [ "def make_requests(n):\n", " return [random_request() for i in range(n)]" ] }, { "cell_type": "code", "execution_count": 8, "id": "05c6d3b5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[[19, 93], 4.544893361987881],\n", " [[22, 32], 8.936559198028235],\n", " [[8, 33], 6.972678462477631]]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "make_requests(3)" ] }, { "cell_type": "code", "execution_count": 9, "id": "f66f612c", "metadata": {}, "outputs": [], "source": [ "def compatible(r1, r2):\n", " return r2[0][1] <= r1[0][0] or r2[0][0] >= r1[0][1]\n", "\n", "def is_compatible(request, solution):\n", " return all(compatible(request, r) for r in solution)" ] }, { "cell_type": "code", "execution_count": 10, "id": "5d12ad6e", "metadata": {}, "outputs": [], "source": [ "def plot_requests(requests):\n", " for r in sorted(requests, key=lambda x : x[0][1]):\n", " print(\" \"*(r[0][0]) + \"-\"*(r[0][1]-r[0][0]) + \" (\" + str(round(r[1],2)) + \")\")\n", " #print(\"total value:\",sum(r[1] for r in requests))\n", " total_value = sum(r[1] for r in requests)\n", " print(f\"total value: {total_value}\")" ] }, { "cell_type": "code", "execution_count": 11, "id": "8af41160", "metadata": {}, "outputs": [], "source": [ "# best = most valuable\n", "def greedy(requests):\n", " sorted_requests = sorted(requests, key=lambda r: r[1], reverse=True)\n", " solution = []\n", " solution.append(sorted_requests.pop(0))\n", " \n", " while len(sorted_requests) > 0:\n", " request = sorted_requests.pop(0)\n", " if is_compatible(request, solution):\n", " solution.append(request)\n", " \n", " return solution" ] }, { "cell_type": "code", "execution_count": 15, "id": "33eda987", "metadata": {}, "outputs": [], "source": [ "requests = make_requests(100)" ] }, { "cell_type": "code", "execution_count": 13, "id": "0bf7883f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ----------------- (7.82)\n", " --------------------- (2.03)\n", " ---------- (7.07)\n", " --------- (8.35)\n", " ---------- (1.01)\n", " ---------------------- (8.02)\n", " ----------- (8.88)\n", "--------------------------------- (6.5)\n", " --------------------- (9.51)\n", " -------------------- (3.25)\n", " --------------------------- (0.6)\n", " ------------------- (8.45)\n", " -------------------- (8.01)\n", " --------------------------- (7.57)\n", " ------------------------------------- (7.03)\n", " ------------ (7.42)\n", " ---------------- (9.32)\n", " ------- (2.18)\n", " ----------------------- (1.67)\n", " ------------- (2.67)\n", " ---------------------------------- (4.57)\n", " --------------------------------- (6.46)\n", " ---------- (6.24)\n", " ---------- (0.7)\n", " ---------------- (7.98)\n", " ---------------- (4.37)\n", " ----------------------------------------- (8.93)\n", " -------------- (4.85)\n", " ------------------------- (1.24)\n", " ------------------------------- (5.47)\n", " -------- (2.27)\n", " --------------------- (5.19)\n", " -------------------------------------------- (0.31)\n", " ------------------ (9.79)\n", " ---------------- (7.75)\n", " ------------------------------------------- (9.45)\n", " ------------------------------------------------ (5.05)\n", " ----------------------- (2.67)\n", " --------------------------------- (6.78)\n", " --------------------------------------------- (2.21)\n", " --------------------------------------------- (4.55)\n", " ----------------- (9.16)\n", " -------------------------- (8.69)\n", " --------- (0.89)\n", " --------------------------------------------------- (8.78)\n", " ------------------------------------------- (4.86)\n", " ------------------------------------- (2.76)\n", " ---------------------------------------------------- (9.56)\n", " ---------- (3.94)\n", " -------------------- (8.9)\n", " ----------------------------------------- (6.6)\n", " --- (8.22)\n", " ------------------------------------------- (4.01)\n", " ------------------------------------------- (3.14)\n", " --------------------------------------------------- (6.65)\n", "----------------------------------------------------------------------- (7.4)\n", " --------------------------------------------- (3.45)\n", " ---------------------------------------------------------------- (9.08)\n", " -- (2.44)\n", " --------------------- (4.54)\n", " ------------------------ (4.49)\n", " ---------------------- (9.61)\n", " ------------------------------ (2.82)\n", " ------------------- (1.06)\n", " ------------------------------------------ (6.72)\n", " ---------------------------------------------------------------------------- (0.53)\n", " ---- (8.5)\n", " -------------------------------------- (9.72)\n", " ------------------------------------------ (5.7)\n", " -------------------------------------------------------- (5.9)\n", " ------------------------------------------------------------------------------- (5.16)\n", " ---------------------------------------- (0.48)\n", " --------------------------------------- (2.53)\n", " --------------------------- (8.03)\n", " ---------------------------------------------------------- (3.84)\n", " -------------------------------------------------------- (4.65)\n", " --------------------------------------------- (5.43)\n", " -------------------------------------- (4.14)\n", " ----------------------------------------- (5.24)\n", " ----------------- (3.85)\n", " --------------- (7.28)\n", " --------------------------------------- (9.58)\n", " ------------------- (8.91)\n", " ----------------- (7.95)\n", " --------------------------------------------- (3.41)\n", " -------------------------------------- (3.72)\n", " -------------- (9.45)\n", " ------------------------------------------------ (6.11)\n", " ---------------------------------------------- (7.84)\n", " ---------------------------------------------------------------------- (1.81)\n", " ------------------------------------------------------------------------------------ (5.73)\n", " - (2.65)\n", " -------------------------------------------------------------------------------- (6.8)\n", " ------------------------------------------------------------------------------------------- (5.71)\n", " ---------------------------------------------------------------------------- (1.32)\n", " -------------------- (1.37)\n", " --------------------------------------------------------------------------- (2.09)\n", " ------------------------------------ (6.11)\n", " ----------------- (5.9)\n", " ----------------------------------------------------------- (1.78)\n", "total value: 541.1882013681587\n" ] } ], "source": [ "plot_requests(requests)" ] }, { "cell_type": "code", "execution_count": 17, "id": "751e8677", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[0, 17], 9.642055670118738], [[33, 57], 9.584198092734097], [[68, 96], 9.402787196546646], [[19, 28], 4.107258566760387]]\n", "4\n" ] } ], "source": [ "sol = greedy(requests)\n", "print(sol)\n", "print(len(sol))" ] }, { "cell_type": "code", "execution_count": 18, "id": "8c4c02b8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "----------------- (9.64)\n", " --------- (4.11)\n", " ------------------------ (9.58)\n", " ---------------------------- (9.4)\n", "total value: 32.73629952615987\n" ] } ], "source": [ "plot_requests(sol)" ] }, { "cell_type": "code", "execution_count": null, "id": "6444c6f2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 19, "id": "19e78f75", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32.73629952615987" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(s[1] for s in sol)" ] }, { "cell_type": "code", "execution_count": 14, "id": "94b24582", "metadata": {}, "outputs": [], "source": [ "# best = most valuable\n", "# best = shortest\n", "# best = most value-dense (highest value/duration)" ] }, { "cell_type": "code", "execution_count": 20, "id": "7da69936", "metadata": {}, "outputs": [], "source": [ "def greedy(requests, sort_function):\n", " sorted_requests = sorted(requests, key=sort_function)\n", " solution = []\n", " solution.append(sorted_requests.pop(0))\n", " \n", " while len(sorted_requests) > 0:\n", " request = sorted_requests.pop(0)\n", " if is_compatible(request, solution):\n", " solution.append(request)\n", " \n", " return solution" ] }, { "cell_type": "code", "execution_count": 21, "id": "963f2d3d", "metadata": {}, "outputs": [], "source": [ "# request = [[start, end], value]\n", "most_value = lambda req : -req[1]\n", "shortest = lambda req : req[0][1] - req[0][0]\n", "density = lambda req : -req[1]/(req[0][1] - req[0][0])" ] }, { "cell_type": "code", "execution_count": 23, "id": "5f48de7b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " at 0x10b933060>\n", "-15.1\n" ] } ], "source": [ "print(most_value)\n", "print(most_value([[10,20], 15.1]))" ] }, { "cell_type": "code", "execution_count": 24, "id": "931925d1", "metadata": {}, "outputs": [], "source": [ "requests = make_requests(1000)" ] }, { "cell_type": "code", "execution_count": 25, "id": "87a2164d", "metadata": {}, "outputs": [], "source": [ "s1 = greedy(requests, most_value)\n", "s2 = greedy(requests, shortest)\n", "s3 = greedy(requests, density)" ] }, { "cell_type": "code", "execution_count": 27, "id": "2546b18d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " -------- (9.55)\n", " --- (3.05)\n", " -- (8.3)\n", " -------- (9.95)\n", " ---- (9.57)\n", " ----------------------------------------- (9.98)\n", " - (9.84)\n", " --- (9.2)\n", " ------ (7.55)\n", " ------- (9.96)\n", " --- (9.86)\n", " - (5.49)\n", "total value: 102.30311439286716\n" ] } ], "source": [ "plot_requests(s1)" ] }, { "cell_type": "code", "execution_count": 28, "id": "bdcd7c17", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " -- (2.65)\n", " -- (2.31)\n", " --- (3.05)\n", " -- (8.3)\n", " - (7.41)\n", " - (1.27)\n", " - (8.45)\n", " -- (5.54)\n", " -- (1.08)\n", " ----- (5.07)\n", " --- (5.03)\n", " - (0.87)\n", " -- (1.08)\n", " -- (0.55)\n", " -- (6.0)\n", " - (9.43)\n", " - (4.53)\n", " - (9.94)\n", " - (2.16)\n", " -- (2.11)\n", " -- (9.52)\n", " - (7.5)\n", " - (9.84)\n", " -- (4.36)\n", " - (5.93)\n", " - (5.29)\n", " - (6.86)\n", " - (4.6)\n", " - (0.43)\n", " - (8.87)\n", " --- (2.49)\n", " --- (2.49)\n", " - (0.22)\n", " - (5.49)\n", "total value: 160.731839170667\n" ] } ], "source": [ "plot_requests(s2)" ] }, { "cell_type": "code", "execution_count": 29, "id": "61d612ec", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-- (7.28)\n", " --- (4.15)\n", " --- (3.05)\n", " -- (8.3)\n", " - (7.41)\n", " - (1.27)\n", " - (8.45)\n", " -- (5.54)\n", " ---- (9.57)\n", " ------ (6.09)\n", " --- (5.03)\n", " --- (3.21)\n", " ---- (5.97)\n", " ---- (4.73)\n", " -- (6.0)\n", " - (9.43)\n", " - (4.53)\n", " - (9.94)\n", " -- (6.87)\n", " -- (4.17)\n", " -- (9.52)\n", " - (7.5)\n", " - (9.84)\n", " --- (9.2)\n", " - (5.93)\n", " - (5.29)\n", " - (6.86)\n", " - (4.6)\n", " - (0.43)\n", " - (8.87)\n", " --- (2.49)\n", " --- (9.86)\n", " - (5.49)\n", "total value: 206.8680948172197\n" ] } ], "source": [ "plot_requests(s3)" ] }, { "cell_type": "code", "execution_count": null, "id": "0b3b27fd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "c368ed71", "metadata": {}, "source": [ "###### requests = make_requests(1000)\n", "s1 = greedy(requests, most_value)\n", "s2 = greedy(requests, shortest)\n", "s3 = greedy(requests, density)\n", "def score(sol):\n", " return sum(s[1] for s in sol)\n", "print([score(s1), score(s2), score(s3)])" ] }, { "cell_type": "code", "execution_count": null, "id": "ba55cc04", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.1" } }, "nbformat": 4, "nbformat_minor": 5 }