DESARROLLAR UN PROGRAMA QUE PERMITA RESOLVER EL MTODO DE TRANSPORTE: MXIMO Y MNIMO
Autor: CARLOS HERRERA DIAZ
Profesor: Ing. Gustavo Hilzinger
2014
CARLOS HERRERA Pgina 2
INDICE
INTRODUCCIN ............................................................................................................................... 3 MARCO TERICO ............................................................................................................................ 4 CODIFICACIN ................................................................................................................................. 6 MANUAL DE USUARIO ................................................................................................................. 26 BIBLIOGRAFA ................................................................................................................................ 29
CARLOS HERRERA Pgina 3
INTRODUCCIN
Este trabajo de programacin tiene como propsito desarrollar un software que permita optimizar los costos en cuanto al mtodo de transporte, ya sea la optimizacin mxima o la optimizacin mnima.
La Investigacin de operaciones utiliza la programacin lineal para hacer frente a los problemas de transporte. La programacin lineal es un proceso de planificacin matemtica que consiste en la asignacin de recursos de la manera ms eficiente. Esto incluye el capital fsico y humano.
Los problemas de transporte con respecto a la investigacin de operaciones trabajan con la distribucin fsica de productos de un lugar a otro. Debido a los costos involucrados en el transporte de mercancas, es de gran inters para las empresas del rubro optimizar su eficiencia CARLOS HERRERA Pgina 4
MARCO TERICO
Es un mtodo de programacin lineal para la asignacin de artculos de un conjunto de origines a un conjunto de destinos de tal manera que se optimice la funcin objetivo.
Esta tcnica es particularmente usada en organizaciones que producen el mismo producto en numerosas plantas y que enva sus productos a diferentes destinos (Centros de distribucin, almacenes). Tambin se aplica en distribucin, anlisis de localizacin de plantas y programacin de la produccin.
Se han desarrollado diferentes enfoques para resolver este problema de distribucin, tales como: El mtodo de la esquina noroeste, el mtodo modificado de la esquina noroeste (celda mnima), mtodo del trampoln (Cruce de arroyo, stepping stone), mtodo de la distribucin modificada (MODI), mtodo de aproximacin de Vogel y el mtodo simplex.
Se cubrirn nicamente en estas notas los siguientes mtodos: a) Esquina Noroeste b) Modificado de la esquina Noroeste. c) Aproximacin de Vogel. d) Del trampoln (Stepping stone)
El transporte desempea un papel importante en la economa y en las decisiones administrativas. Con frecuencia la disponibilidad de transporte econmico es crtica para la sobre-vivencia de una empresa.
El modelo de transporte busca determinar un plan de transporte de una mercanca de varias fuentes a varios destinos. Los datos del modelo son: 1. Nivel de oferta en cada fuente y la cantidad de demanda en cada destino. 2. El costo de transporte unitario de la mercanca a cada destino. CARLOS HERRERA Pgina 5
Como solo hay una mercanca un destino puede recibir su demanda de una o ms fuentes. El objetivo del modelo es el de determinar la cantidad que se enviar de cada fuente a cada destino, tal que se minimice el costo del transporte total. La suposicin bsica del modelo es que el costo del transporte en una ruta es directamente proporcional al nmero de unidades transportadas. La definicin de unidad de transporte variar dependiendo de la mercanca que se transporte.
Ejemplo Problema de transporte Supngase que un fabricante tiene tres plantas que producen el mismo producto. Estas plantas a su vez mandan el producto a cuatro almacenes. Cada planta puede mandar productos a todos los almacenes, pero el costo de transporte vara con las diferentes combinaciones. El problema es determinar la cantidad que cada planta debe mandar a cada almacn con el fin de minimizar el costo total de transporte. La manera ms fcil de reconocer un problema de transporte es por su naturaleza o estructura de-hacia: de un origen hacia un destino, de una fuente hacia un usuario, del presente hacia el futuro, de aqu hacia all. Al enfrentar este tipo de problemas, la intuicin dice que debe haber una manera de obtener una solucin. Se conocen las fuentes y los destinos, las capacidades y demandas y los costos de cada trayectoria. Debe haber una combinacin ptima que minimice el costo (o maximice la ganancia). La dificultad estriba en el gran nmero de combinaciones posibles.
CARLOS HERRERA Pgina 6
CODIFICACIN
Detallaremos los algoritmos y las lneas de cdigo que he utilizado para desarrollar el proyecto. Interfaz de Bienvenida:
public Principal() { initComponents(); Image icono = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("imagenes/icono.png")); setIconImage(icono); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: int op = JOptionPane.showConfirmDialog(null, "Desea salir del programa?", "Mtodo de Transporte", JOptionPane.YES_NO_OPTION); if (op == 0) { System.exit(0); } } private void btnMaximoActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Maximo maximo = new Maximo(); maximo.setVisible(true); dispose(); } CARLOS HERRERA Pgina 7
private void btnMinimoActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Minimo minimo = new Minimo(); minimo.setVisible(true); dispose(); }
Interfaz de Clculo del mximo
public Maximo() { initComponents(); Image icono = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("imagenes/icono.png")); setIconImage(icono); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(490, 385); setLocationRelativeTo(null); } private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Principal principal = new Principal(); principal.setVisible(true); dispose(); } private void btnMostrarActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: //Llamar ventana de resultados CARLOS HERRERA Pgina 8
present.txtQ1.setText(txtQ1); present.txtQ2.setText(txtQ2); // prese.setModal(true); present.setVisible(true); } private void btnCalcularActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: iniciarMetodoTransporte(); btnCalcular.setEnabled(false); btnMostrar.setEnabled(true); } //Metodos que calcularn el resultado: public void ValorInicial() { salir = vi = 1; do { vp = costo[nc][0] - vi;//160 - 1 = 159 if (vp <= costo[nc][0] && vp <= costo[1][3])//(159 <= 160) and (159 <= 90) { tabla[0][0] = vi;//=70 tabla[1][0] = vp;//=90 salir = 0; } else { vi++; } } while (salir != 0); LlenarTablaInicial(0); } void LlenarTablaInicial(int ff)//FF = 0 { c = dos = 0; do { //c =0, c = 1, 2, 3 , 4 //dos =0, dos =1, 0, 1 // FF = 1 for (f = 0; f <= ff; f++) //0 <= 0 , [0 <= 1, 1 <= 1], [0 <= 1, 1 <= 1] { CARLOS HERRERA Pgina 9
sc = sc + tabla[c][f];//=70 despues de dar una vuelta se hace 0 para coger otro valor, =90, =140, 0, } if (sc <= costo[c][3])// 70 < = 80 -> SI, 90 <= 90, 140 <= 270, 0 <= 60 { vpc = costo[c][3] - sc;//80 - 70 VPC = 10, 90-90 VPC = 0, 270-140 VPC = 130, 60-0 VPC = 60 if (vpc <= costo[nc][ff + 1] && ff < 3)//cambiar sigual // 10 <= 150 AND 0 < 3, 0 <= 150 AND 0 < 3 , 130 <= 190 AND 1 < 3 , 60 <= 190 AND 1 < 3) { tabla[c][ff + 1] = vpc;//[0,1] = 10, [1,1] = 0, [2,2] = 130, [3,2] = 60 c++;//C = 1 , 2 , 3 , 4 dos++;// DOS = 1 , 2 , 1 , 2 } } if (dos == 2)// SI { for (i = 0; i < c; i++) { sf = sf + tabla[i][ff + 1];//0,1 SF = 10 , SF = 190 } if (sf <= costo[nc][ff + 1])//10<=150, 190<= 190 { vpf = costo[nc][ff + 1] - sf;// VPF = 150 - 10 = 140, 190-190 = 0, if (vpf < costo[c][3] && c < nc) { tabla[c][ff + 1] = vpf;//2,1 = 140 ff++;// FF = 1 dos = 0; } } } sc = sf = 0; } while (c != nc);// 1 , 2 , 3, 4 diferente de 4 } void Inicializar() { ind[nc][0] = ind[nc][1] = ind[nc][2] = 1000; ind[0][3] = ind[1][3] = ind[2][3] = 1000; ind[3][3] = 1000; } void IndicadorFilaColumna() { mc = mf = 1; CARLOS HERRERA Pgina 10
for (h = 0; h < nc; h++){ for (i = 0; i < 3; i++)// I= 0 < 3 { if (tabla[h][i] > 0)// [3,0] = 0 > 0 , [3,1] = 0 > 0 , [3,2] = 60 > 0 cc++;// 0 } if (cc > mc) // { ic = h;// IC = H = 0 mc = cc;// MC = 2 } cc = 0;// CC = 0 } cci = 2; for (h = 0; h < 3; h++)// H = 0, 1, 2, { for (i = 0; i < nc; i++)// I = 0,1,2,3 { cf++;// CF = } } if (cf > mf)// MF = 1 : 4 > 2 { iff = h;// IFF 2 mf = cf;// MF = 4 } cf = 0;// CF = 0 }
if (mc >= mf) // 2 > 4 { reg = ind[ic][3] = 0; for (i = 0; i < 3; i++) { if (tabla[ic][i] > 0) { ind[nc][i] = costo[ic][i] - ind[ic][3]; } } for (h = 0; h < nc; h++) { reg = 0; for (i = 0; i < 3; i++) { if (tabla[h][i] > 0) { CARLOS HERRERA Pgina 11
if (ind[h][3] != 1000) { ind[nc][i] = costo[h][i] - ind[h][3]; } else { if (ind[nc][i] != 1000) { ind[h][3] = costo[h][i] - ind[nc][i]; } else { reg = 1; } } } if (reg == 1) { h--; } } } else { reg = ind[nc][iff] = 0; for (i = 0; i < nc; i++) // i < 4 { if (tabla[i][iff] > 0) { ind[i][3] = costo[i][iff] - ind[nc][iff]; } } for (h = 0; h < 3; h++) { reg = 0; for (i = 0; i < nc; i++) { if (tabla[i][h] > 0) { if (ind[nc][h] != 1000) { ind[i][3] = costo[i][h] - ind[nc][h]; } else { if (ind[i][3] != 1000) { ind[nc][h] = costo[i][h] - ind[i][3]; } else { reg = 1; } } } } if (reg == 1) { h--; CARLOS HERRERA Pgina 12
} } } } int IndicadorCasillero() { for (h = 0; h < nc; h++) { for (i = 0; i < 3; i++) { ind[h][i] = costo[h][i] - ind[h][3] - ind[nc][i]; if (ind[h][i] > 0) { cm = h; fm = i; mi = costo[h][i] * ind[h][i]; } } } //Indicador para Maximo sp = 0; for (h = 0; h < nc; h++) { for (i = 0; i < 3; i++) { if (ind[h][i] > 0) { mult = costo[h][i] * ind[h][i]; if (mult > mi) { cm = h; fm = i; mi = mult; } sp++; } } return (sp); } void SeleccionRuta() { i = 0; do { if (i != fm && tabla[cm][i] > 0) { h = 0; do { if (h != cm && tabla[h][i] > 0) { if (tabla[h][fm] > 0) { if (tabla[h][fm] - tabla[cm][i] > 0) { CARLOS HERRERA Pgina 13
tabla[cm][fm] = tabla[cm][i]; tabla[cm][i] = 0; tabla[h][i] = tabla[h][i] + tabla[cm][fm]; tabla[h][fm] = tabla[h][fm] - tabla[cm][fm]; } else { tabla[cm][fm] = tabla[h][fm]; tabla[cm][i] = tabla[cm][i] - tabla[h][fm]; tabla[h][i] = tabla[h][i] + tabla[cm][fm]; tabla[h][fm] = 0; } h = nc - 1; i = 2; } } h++; } while (h != nc); } i++; } while (i != 3); } void Respuesta(int indicador) { qmx = ir = 0; ArrayList<Object> array = new ArrayList<Object>(); for (h = 0; h < 3; h++) { for (i = 0; i < nc; i++) { qmx = (costo[i][h] * tabla[i][h]) + qmx; x[ir] = tabla[i][h]; ir++; } } for (i = 0; i < (nc * 3); i++) { array.add("X" + (i + 1) + " = " + x[i]); } array.add("" + qmx);
CARLOS HERRERA Pgina 14
//Llenar el textfield con el resultado Q if (indicador == 1) { txtQ1 = "Q = " + array.get(array.size() - 1); } if (indicador == 2) { txtQ2 = "Q = " + array.get(array.size() - 1); } } public int OtraRespuesta() { cresp = 0; for (h = 0; h < nc; h++) { for (i = 0; i < 3; i++) { if (ind[h][i] == 0 && tabla[h][i] == 0) { cresp++; } } } return (cresp); } public void NuevaRespuesta() { for (h = 0; h < nc; h++) { for (i = 0; i < 3; i++) { if (ind[h][i] == 0 && tabla[h][i] == 0) { pc = h; pf = i; i = 3; h = nc; } } } ii = 0; do { if (ii != pf && tabla[pc][ii] > 0) { hh = 0; do { if (hh != pc && tabla[hh][ii] > 0) { if (tabla[hh][pf] > 0) { if (tabla[hh][pf] - tabla[pc][ii] > 0) { CARLOS HERRERA Pgina 15
if (sp == 0) { //Esta es la matriz de la 1era respuesta: tabla Respuesta(1); present.presentarEnTabla(tabla, nc, indicadorPresentarTabla, costo); //presentarEnTabla(tabla); } CARLOS HERRERA Pgina 16
if (sp != 0) { SeleccionRuta(); } } while (sp != 0); spp = OtraRespuesta(); for (i = 0; i < spp; i++) { NuevaRespuesta(); Respuesta(2); indicadorPresentarTabla++; present.presentarEnTabla(tabla, nc, indicadorPresentarTabla, costo); //presentarEnTabla(tabla); } } Interfaz de Clculo del mnimo
int salir, c, dos, f, sc, vpc, i, sf, vpf, mf, mc, h, cc, ic, reg, sumao, ir, qmx, indicadorPresentarTabla = 0; int iff, cci, cf, vi, vp, nc = 4; int[][] costo = new int[6][6]; int[][] tabla = new int[5][5]; int[][] ind = new int[6][6]; int cm, fm, mi, mult, sp, cresp, pc, pf, ii, hh, spp, gf, gc, sumad; int[] x = new int[15]; char[] texto = new char[4]; public static String txtQ1 = "", txtQ2 = "";
PresentarResultados1 present = new PresentarResultados1(this, true); CARLOS HERRERA Pgina 17
public Minimo() { initComponents(); Image icono = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("imagenes/icono.png")); setIconImage(icono); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(490, 385); setLocationRelativeTo(null); } public void ValorInicial() { salir = vi = 1; do { vp = costo[nc][0] - vi;//160 - 1 = 159 if (vp <= costo[nc][0] && vp <= costo[1][3]) { tabla[0][0] = vi;//=70 tabla[1][0] = vp;//=90 salir = 0; } else { vi++; } } while (salir != 0); LlenarTablaInicial(0); } void LlenarTablaInicial(int ff)//FF = 0 { c = dos = 0; do { //c =0, c = 1, 2, 3 , 4 //dos =0, dos =1, 0, 1 // FF = 1 for (f = 0; f <= ff; f++) //0 <= 0 , [0 <= 1, 1 <= 1], [0 <= 1, 1 <= 1] { sc = sc + tabla[c][f } CARLOS HERRERA Pgina 18
MANUAL DE USUARIO La interfaz de inicio es la siguiente:
Podemos elegir entre calcular mnimo o mximo. Tambin encontramos la opcin de salir. Si elegimos el mximo:
Llenamos los datos que nos solicite y luego le damos clic en calcular. Una vez hecho esto, se habilitar el botn de ver resultados, podemos darle clic y ver la respuesta mxima. Nos aparecer la siguiente ventana:
CARLOS HERRERA Pgina 27
Si damos clic en observaciones, nos saldr este mensaje:
Si elegimos el mnimo:
CARLOS HERRERA Pgina 28
Llenamos los datos que nos solicite y luego le damos clic en calcular. Una vez hecho esto, se habilitar el botn de ver resultados, podemos darle clic y ver la respuesta mxima. Nos aparecer la siguiente ventana:
Si damos clic en observaciones, nos saldr este mensaje: