{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "resident-briefs", "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "def random_request():\n", " return [sorted(random.sample(range(100),2)), random.random()*10]\n", "\n", "def make_requests(n):\n", " return [random_request() for i in range(n)]\n", "\n", "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", " r = request\n", " return all(compatible(r, s) for s in solution)\n", "\n", "def greedy(requests, sort_key):\n", " sorted_requests = sorted(requests, key=sort_key) # O(n*log(n))\n", " solution = []\n", " solution.append(sorted_requests.pop(0))\n", "\n", " while len(sorted_requests) > 0: # O(n)\n", " request = sorted_requests.pop(0)\n", " if is_compatible(request, solution):\n", " solution.append(request)\n", "\n", " return solution\n", "\n", "def plot_requests(requests):\n", "# print(\"=\"*100)\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)) + \")\")" ] }, { "cell_type": "code", "execution_count": 2, "id": "seeing-worry", "metadata": {}, "outputs": [], "source": [ "shortest = lambda x: x[0][1] - x[0][0]\n", "most_value = lambda x: -x[1]\n", "density = lambda x: -(x[1])/(x[0][1] - x[0][0])" ] }, { "cell_type": "code", "execution_count": 9, "id": "turkish-gathering", "metadata": {}, "outputs": [], "source": [ "requests = make_requests(1000)" ] }, { "cell_type": "code", "execution_count": 10, "id": "center-treasure", "metadata": {}, "outputs": [], "source": [ "s1 = greedy(requests, shortest)\n", "s2 = greedy(requests, most_value)\n", "s3 = greedy(requests, density)" ] }, { "cell_type": "code", "execution_count": 11, "id": "encouraging-trading", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "202.5616005977209\n", "131.43886685029057\n", "219.39754836970306\n" ] } ], "source": [ "print(sum(r[1] for r in s1))\n", "print(sum(r[1] for r in s2))\n", "print(sum(r[1] for r in s3))" ] }, { "cell_type": "code", "execution_count": 12, "id": "changing-queensland", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "- (9.26)\n", " - (6.55)\n", " - (4.85)\n", " -- (5.19)\n", " ---- (8.3)\n", " - (8.88)\n", " -- (5.19)\n", " --- (4.22)\n", " --- (6.96)\n", " -- (5.13)\n", " - (8.89)\n", " - (2.85)\n", " - (9.08)\n", " --- (4.31)\n", " - (9.4)\n", " -- (1.13)\n", " -- (3.77)\n", " -- (3.3)\n", " - (0.11)\n", " - (6.55)\n", " -- (7.81)\n", " -- (5.27)\n", " - (8.4)\n", " --- (6.35)\n", " -- (8.19)\n", " - (5.38)\n", " -- (3.6)\n", " - (4.36)\n", " - (6.79)\n", " -- (4.41)\n", " - (2.77)\n", " ---- (8.26)\n", " - (9.31)\n", " -- (5.45)\n", " --- (2.3)\n" ] } ], "source": [ "plot_requests(s1)" ] }, { "cell_type": "code", "execution_count": 13, "id": "representative-provider", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "- (9.26)\n", " - (6.55)\n", " - (4.85)\n", " ----------------- (9.99)\n", " --- (6.96)\n", " ---------- (9.94)\n", " --- (4.31)\n", " - (9.4)\n", " -- (1.13)\n", " --------------- (9.97)\n", " --- (6.35)\n", " -- (8.19)\n", " ---- (6.49)\n", " ----------- (9.96)\n", " - (2.77)\n", " ---- (8.26)\n", " - (9.31)\n", " -- (5.45)\n", " --- (2.3)\n" ] } ], "source": [ "plot_requests(s2)" ] }, { "cell_type": "code", "execution_count": 14, "id": "adjusted-radar", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "- (9.26)\n", " - (6.55)\n", " - (4.85)\n", " --- (7.73)\n", " --- (9.95)\n", " ---- (8.3)\n", " - (8.88)\n", " -- (9.07)\n", " --- (6.96)\n", " -- (5.13)\n", " - (8.89)\n", " - (2.85)\n", " - (9.08)\n", " --- (4.31)\n", " - (9.4)\n", " -- (1.13)\n", " -- (5.62)\n", " -- (3.3)\n", " - (0.11)\n", " - (6.55)\n", " -- (7.81)\n", " -- (5.27)\n", " - (8.4)\n", " --- (6.35)\n", " -- (8.19)\n", " - (5.38)\n", " -- (3.6)\n", " - (4.36)\n", " - (6.79)\n", " --- (7.25)\n", " - (2.77)\n", " ---- (8.26)\n", " - (9.31)\n", " -- (5.45)\n", " --- (2.3)\n" ] } ], "source": [ "plot_requests(s3)" ] }, { "cell_type": "code", "execution_count": null, "id": "impressed-halloween", "metadata": {}, "outputs": [], "source": [] } ], "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.9.1" } }, "nbformat": 4, "nbformat_minor": 5 }