{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Este es un ejemplo de un problema de programación lineal que es dual de sí mismo" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{l}\n", "\\begin{array}{lcrcrcrcl}\n", " \\min \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} 0 \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\\\\n", " \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} - \\mspace{-6mu}&\\mspace{-6mu} x_{2} \\mspace{-6mu}&\\mspace{-6mu} + \\mspace{-6mu}&\\mspace{-6mu} x_{3} \\mspace{-6mu}&\\mspace{-6mu} \\geq \\mspace{-6mu}&\\mspace{-6mu} 0 \\\\\n", " \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} x_{1} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} - \\mspace{-6mu}&\\mspace{-6mu} x_{3} \\mspace{-6mu}&\\mspace{-6mu} \\geq \\mspace{-6mu}&\\mspace{-6mu} 0 \\\\\n", " \\mspace{-6mu}&\\mspace{-6mu} - \\mspace{-6mu}&\\mspace{-6mu} x_{1} \\mspace{-6mu}&\\mspace{-6mu} + \\mspace{-6mu}&\\mspace{-6mu} x_{2} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\geq \\mspace{-6mu}&\\mspace{-6mu} 0 \\\\\n", "\\end{array} \\\\\n", "x_{1}, x_{2}, x_{3} \\geq 0\n", "\\end{array}$$" ], "text/plain": [ "LP problem (use 'view(...)' or '%display typeset' for details)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}0$$" ], "text/plain": [ "0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0,\\,0,\\,0\\right)$$" ], "text/plain": [ "(0, 0, 0)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n=3 # número de variables x's\n", "m=3 # número de restricciones (distintas de las de signo)\n", "\n", "c=matrix(QQ,1,n,[0,0,0] ) # vector de costos\n", "\n", "A=matrix(QQ,m,n,[ # coeficientes de las variables x's\n", "[0,-1,1],\n", "[1,0,-1],\n", "[-1,1,0]\n", "])\n", "\n", "\n", "\n", "b=matrix(QQ,m,1,[0,0,0]) # vector de la derecha\n", "\n", "\n", "######################################################\n", "############### VARIABLES DE HOLGURA ################\n", "\n", "\n", "h=matrix(ZZ,1,m,[-1,-1,-1]) # variables de holgura: \n", " # Pon 1 si va sumando, \n", " # -1 si va restando y \n", " # 0 si no hay variable de holgura.\n", "\n", "#######################################################\n", "# Signo de las variables x's ###\n", "\n", "signvars=[\">=\",\">=\",\">=\"]\n", "\n", "#######################################################\n", "\n", "\n", "\n", "\n", "######################################################\n", "######### Problemas Paramétricos ###########\n", " \n", "prmtr_b=0 # 1 si quieres usar un parámetro en b\n", " # 0 en caso contrario\n", "\n", "bp=matrix(QQ,m,1,[0,0,0]) # vector de la derecha para problemas paramétricos.\n", "\n", "###################################################### \n", " \n", "prmtr_c=0 # 1 si quieres usar un parámetro en c\n", " # 0 en caso contrario\n", "\n", " \n", "cp=matrix(QQ,1,n,[0,0,0] ) # vector de costos adicional para problemas paramétricos.\n", "\n", "######################################################\n", "\n", "Aori=A\n", "cori=c\n", "bori=b\n", "\n", "##############################################################################\n", "####### Usando el paquete de programación lineal Pinteractive de Sage ########\n", "##############################################################################\n", "signos=[]\n", "for i in range(m):\n", " if h[0,i] == -1:\n", " signos.append(\">=\")\n", " elif h[0,i] == 1:\n", " signos.append(\"<=\")\n", " elif h[0,i] == 0:\n", " signos.append(\"==\")\n", "\n", " \n", "signosvduales=signos\n", "\n", "\n", "var_nam = []\n", "for i in range(n):\n", " k=i+1\n", " var_nam.append('x_%s' %k)\n", "\n", "\n", "\n", " \n", " \n", "PPL = InteractiveLPProblem(A, b, c, var_nam, \n", "constraint_type=signos, variable_type=signvars, problem_type=\"min\") \n", "\n", "\n", "##############################################################################\n", "##############################################################################\n", "\n", "\n", "####################################################################\n", "############ HASTA AQUÍ LOS DATOS ################################\n", "####################################################################\n", "\n", "\n", "raya=var('ry', latex_name='===================================')\n", "show(ry)\n", "show(ry)\n", "show(PPL)\n", "show(PPL.optimal_value())\n", "show(PPL.optimal_solution())\n", "show(ry)\n", "show(ry)\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\begin{array}{l}\n", "\\begin{array}{lcrcrcrcl}\n", " \\max \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} 0 \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\\\\n", " \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\pi_{2} \\mspace{-6mu}&\\mspace{-6mu} - \\mspace{-6mu}&\\mspace{-6mu} \\pi_{3} \\mspace{-6mu}&\\mspace{-6mu} \\leq \\mspace{-6mu}&\\mspace{-6mu} 0 \\\\\n", " \\mspace{-6mu}&\\mspace{-6mu} - \\mspace{-6mu}&\\mspace{-6mu} \\pi_{1} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} + \\mspace{-6mu}&\\mspace{-6mu} \\pi_{3} \\mspace{-6mu}&\\mspace{-6mu} \\leq \\mspace{-6mu}&\\mspace{-6mu} 0 \\\\\n", " \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\pi_{1} \\mspace{-6mu}&\\mspace{-6mu} - \\mspace{-6mu}&\\mspace{-6mu} \\pi_{2} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\mspace{-6mu}&\\mspace{-6mu} \\leq \\mspace{-6mu}&\\mspace{-6mu} 0 \\\\\n", "\\end{array} \\\\\n", "\\pi_{1}, \\pi_{2}, \\pi_{3} \\geq 0\n", "\\end{array}$$" ], "text/plain": [ "LP problem (use 'view(...)' or '%display typeset' for details)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}0$$" ], "text/plain": [ "0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(0,\\,0,\\,0\\right)$$" ], "text/plain": [ "(0, 0, 0)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}{===================================}$$" ], "text/plain": [ "ry" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "c=bori.transpose(); \n", "b=cori.transpose(); \n", "A=Aori.transpose(); \n", "nn=n; n=m; m=nn; \n", "\n", "restduales=[]\n", "hd=[]\n", "for i in range(m):\n", " if signvars[i] == \"\":\n", " restduales.append(\"==\")\n", " hd.append(0)\n", " elif signvars[i] == \">=\": \n", " restduales.append(\"<=\")\n", " hd.append(-1)\n", " elif signvars[i] == \"<=\":\n", " restduales.append(\">=\")\n", " hd.append(1)\n", "\n", "\n", " \n", "h=matrix(ZZ,1,m,hd) \n", "\n", "\n", "\n", " \n", "\n", "pi = var('pi', latex_name='\\\\pi')\n", "pi = matrix(SR,1,1, pi) \n", "var_nam_duales = []\n", "for i in range(n):\n", " k=i+1\n", " var_nam_duales.append('pi_%s' %k)\n", " \n", " \n", "PPL = InteractiveLPProblem(A, b, c, var_nam_duales,\n", "constraint_type=restduales, variable_type=signosvduales, problem_type=\"max\") \n", "\n", "raya=var('ry', latex_name='===================================')\n", "show(ry)\n", "show(ry)\n", "show(PPL)\n", "show(PPL.optimal_value())\n", "show(PPL.optimal_solution())\n", "show(ry)\n", "show(ry)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.5", "language": "sage", "name": "sagemath" }, "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.2" } }, "nbformat": 4, "nbformat_minor": 4 }