UNIVERSIDAD TÉCNICA DE MACHALA UNIDAD ACADÉMICA DE INGENIERÍA CIVIL CARRERA DE INGENIERIA DE SISTEMAS TEMA: DESARROLLA
Views 78 Downloads 0 File size 757KB
UNIVERSIDAD TÉCNICA DE MACHALA UNIDAD ACADÉMICA DE INGENIERÍA CIVIL CARRERA DE INGENIERIA DE SISTEMAS
TEMA:
DESARROLLAR UN PROGRAMA QUE PERMITA RESOLVER EL MÉTODO DE TRANSPORTE: MÁXIMO Y MÍNIMO
Autor: CARLOS HERRERA DIAZ
Profesor: Ing. Gustavo Hilzinger
2014
INDICE INTRODUCCIÓN ............................................................................................................................... 3 MARCO TEÓRICO ............................................................................................................................ 4 CODIFICACIÓN ................................................................................................................................. 6 MANUAL DE USUARIO .................................................................................................................26 BIBLIOGRAFÍA................................................................................................................................29
CARLOS HERRERA
Página 2
INTRODUCCIÓN
Este trabajo de programación tiene como propósito desarrollar un software que permita optimizar los costos en cuanto al método de transporte, ya sea la optimización máxima o la optimización mínima.
La Investigación de operaciones utiliza la programación lineal para hacer frente a los problemas de transporte. La programación lineal es un proceso de planificación matemática que consiste en la asignación de recursos de la manera más eficiente. Esto incluye el capital físico y humano.
Los problemas de transporte con respecto a la investigación de operaciones trabajan con la distribución física de productos de un lugar a otro. Debido a los costos involucrados en el transporte de mercancías, es de gran interés para las empresas del rubro optimizar su eficiencia
CARLOS HERRERA
Página 3
MARCO TEÓRICO Es un método de programación lineal para la asignación de artículos de un conjunto de origines a un conjunto de destinos de tal manera que se optimice la función objetivo. Esta técnica es particularmente usada en organizaciones que producen el mismo producto en numerosas plantas y que envía sus productos a diferentes destinos (Centros de distribución, almacenes). También se aplica en distribución, análisis de localización de plantas y programación de la producción. Se han desarrollado diferentes enfoques para resolver este problema de distribución, tales como: El método de la esquina noroeste, el método modificado de la esquina noroeste (celda mínima), método del trampolín (Cruce de arroyo, stepping stone), método de la distribución modificada (MODI), método de aproximación de Vogel y el método simplex. Se cubrirán únicamente en estas notas los siguientes métodos: a) Esquina Noroeste b) Modificado de la esquina Noroeste. c) Aproximación de Vogel. d) Del trampolín (Stepping stone) El transporte desempeña un papel importante en la economía y en las decisiones administrativas. Con frecuencia la disponibilidad de transporte económico es crítica para la sobre-vivencia de una empresa.
El modelo de transporte busca determinar un plan de transporte de una mercancía de varias fuentes a varios destinos. Los datos del modelo son: 1. 2.
Nivel de oferta en cada fuente y la cantidad de demanda en cada destino. El costo de transporte unitario de la mercancía a cada destino.
CARLOS HERRERA
Página 4
Como solo hay una mercancía un destino puede recibir su demanda de una o más 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 suposición básica del modelo es que el costo del transporte en una ruta es directamente proporcional al número de unidades transportadas. La definición de “unidad de transporte” variará dependiendo de la “mercancía” que se transporte.
Ejemplo Problema de transporte Supóngase 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 varía con las diferentes combinaciones. El problema es determinar la cantidad que cada planta debe mandar a cada almacén con el fin de minimizar el costo total de transporte. La manera más fácil 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 intuición dice que debe haber una manera de obtener una solución. Se conocen las fuentes y los destinos, las capacidades y demandas y los costos de cada trayectoria. Debe haber una combinación óptima que minimice el costo (o maximice la ganancia). La dificultad estriba en el gran número de combinaciones posibles.
CARLOS HERRERA
Página 5
CODIFICACIÓN Detallaremos los algoritmos y las líneas de código 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?", "Método 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
Página 6
private void btnMinimoActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Minimo minimo = new Minimo(); minimo.setVisible(true); dispose(); }
Interfaz de Cálculo del máximo
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
Página 7
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 calcularán el resultado: public void ValorInicial() { salir = vi = 1; do { vp = costo[nc][0] - vi;//160 - 1 = 159 if (vp 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
Página 14
tabla[pc][pf] = tabla[pc][ii]; tabla[pc][ii] = 0; tabla[hh][ii] = tabla[hh][ii] + tabla[pc][pf]; tabla[hh][pf] = tabla[hh][pf] - tabla[pc][pf]; } else { tabla[pc][pf] = tabla[hh][pf]; tabla[pc][ii] = tabla[pc][ii] - tabla[hh][pf]; tabla[hh][ii] = tabla[hh][ii] + tabla[pc][pf]; tabla[hh][pf] = 0; } hh = nc - 1; ii = 2; } } hh++; } while (hh != nc); } ii++; } while (ii != 3); } public void iniciarMetodoTransporte(){ construirMatrizCostos(); ValorInicial(); do { Inicializar(); IndicadorFilaColumna(); sp = IndicadorCasillero();
if (sp == 0) { //Esta es la matriz de la 1era respuesta: tabla Respuesta(1); present.presentarEnTabla(tabla, nc, indicadorPresentarTabla, costo); //presentarEnTabla(tabla); }
CARLOS HERRERA
Página 15
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 Cálculo del mínimo
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
Página 16
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 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--; } } } } 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];
CARLOS HERRERA
Página 20
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) { 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];
CARLOS HERRERA
Página 21
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 array = new ArrayList(); 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); if (indicador == 1) { txtQ1 = "Q = " + array.get(array.size() - 1); } if (indicador == 2) { txtQ2 = "Q = " + array.get(array.size() - 1); } }
CARLOS HERRERA
Página 22
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) { tabla[pc][pf] = tabla[pc][ii]; tabla[pc][ii] = 0; tabla[hh][ii] = tabla[hh][ii] + tabla[pc][pf]; tabla[hh][pf] = tabla[hh][pf] - tabla[pc][pf]; } else { tabla[pc][pf] = tabla[hh][pf]; tabla[pc][ii] = tabla[pc][ii] - tabla[hh][pf]; tabla[hh][ii] = tabla[hh][ii] + tabla[pc][pf]; tabla[hh][pf] = 0;
CARLOS HERRERA
Página 23
} hh = nc - 1; ii = 2; } } hh++; } while (hh != nc); } ii++; } while (ii != 3); } public void iniciarMetodoTransporte(){ construirMatrizCostos(); ValorInicial(); do { Inicializar(); IndicadorFilaColumna(); sp = IndicadorCasillero if (sp == 0) { Respuesta(1); present.presentarEnTabla(tabla, nc, indicadorPresentarTabla, costo); } 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); } } public void construirMatrizCostos() { try { costo[0][0] = Integer.parseInt(txt00.getText().trim());
CARLOS HERRERA
Página 24
costo[0][1] = Integer.parseInt(txt10.getText().trim()); costo[0][2] = Integer.parseInt(txt20.getText().trim()); costo[0][3] = Integer.parseInt(d1.getText().trim()); costo[1][0] = Integer.parseInt(txt01.getText().trim()); costo[1][1] = Integer.parseInt(txt11.getText().trim()); costo[1][2] = Integer.parseInt(txt21.getText().trim()); costo[1][3] = Integer.parseInt(d2.getText().trim()); costo[2][0] = Integer.parseInt(txt02.getText().trim()); costo[2][1] = Integer.parseInt(txt12.getText().trim()); costo[2][2] = Integer.parseInt(txt22.getText().trim()); costo[2][3] = Integer.parseInt(d3.getText().trim()); costo[4][0] = Integer.parseInt(o1.getText()); costo[3][0] = costo[4][0]; costo[4][1] = Integer.parseInt(o2.getText()); costo[3][1] = costo[4][1]; costo[4][2] = Integer.parseInt(o3.getText()); costo[3][2] = costo[4][2]; sumao = costo[nc][0]+costo[nc][2]+costo[nc][1]; sumad = costo[0][3]+costo[1][3]+costo[2][3]; if (sumad > sumao) { JOptionPane.showMessageDialog(this, "Las demandas no deben ser mayores que las ofertas", "Método Transporte", 0); } else if (sumad != sumao) { costo[3][0] = costo[3][1] = costo[3][2] = 0; costo[3][3] = sumao - sumad; costo[4][3] = sumao; nc = 4; } else { nc = 3; } } catch (Exception error) { JOptionPane.showMessageDialog(null, "¡Ha ocurrido un error, revise los datos!\n" + error.getMessage(), "Método Transporte", 0); } }
CARLOS HERRERA
Página 25
MANUAL DE USUARIO La interfaz de inicio es la siguiente:
Podemos elegir entre calcular mínimo o máximo. También encontramos la opción de salir. Si elegimos el máximo:
Llenamos los datos que nos solicite y luego le damos clic en calcular. Una vez hecho esto, se habilitará el botón de ver resultados, podemos darle clic y ver la respuesta máxima. Nos aparecerá la siguiente ventana:
CARLOS HERRERA
Página 26
Si damos clic en observaciones, nos saldrá este mensaje:
Si elegimos el mínimo:
CARLOS HERRERA
Página 27
Llenamos los datos que nos solicite y luego le damos clic en calcular. Una vez hecho esto, se habilitará el botón de ver resultados, podemos darle clic y ver la respuesta máxima. Nos aparecerá la siguiente ventana:
Si damos clic en observaciones, nos saldrá este mensaje:
CARLOS HERRERA
Página 28
BIBLIOGRAFÍA
http://www.monografias.com/trabajos-pdf4/metodo-transporte/metodotransporte.pdf
http://hemaruce.angelfire.com/intro_transporte.htm
http://www.ehowenespanol.com/problemas-investigacion-operaciones-transportehechos_80650/
CARLOS HERRERA
Página 29