Documente Academic
Documente Profesional
Documente Cultură
“PROTELGAS”
Resumen:
Se realizó una aplicación en Android que hizo uso del algoritmo de Johnson aplicado
a la instalación de gas natural en hogares de la ciudad de La Paz. Obtando por el camino corto
y económico.
Introducción:
El presente proyecto tiene como objetivo hacer uso del algoritmo de Johnson para
determinar el camino más corto de la instalación de los tubos de gas, de esta manera encontrar
el camino mas barato para el cliente, desde la entrada del hogar, hasta su cocina o calefones.
Para este propósito se realizó la programación de una aplicación en Android.
Problema:
Esta aplicación ayudará a las diferentes empresas de gas a hacer una cotización
instantánea. Obteniendo asi una respuesta mucha más rápida y certera al cliente. Esto ayuda
mucho en terminos de tiempo.
Objetivo General:
Desarrollar una aplicación en Android que permita identificar la instalación de tubos
de gas más corta, para validar mis conceptos adquiridos en la materia análisis de algoritmos.
Objetivos Específicos
Generar una herramienta útil para resolver un problema de la actualidad.
Aplicar los conocimientos adquiridos en la materia para demostrar su utilidad y
aplicabilidad
Crear una aplicación de fácil entendimiento para cualquier usuario.
Marco Teórico
¿Qué es un algoritmo?
Un algoritmo es un conjunto de operaciones que tienen como objetivo encontrar una
solución a un tipo de problema relacionado con las matemáticas, la informática, etc. “Un
algoritmo típico tiene carácter finito, es preciso, tiene tanto una entrada como una salida y es
eficaz en la resolución de un problema”. (Definición ABC, 2016).
¿Qué es el algoritmo de Johnson?
UNIVERSIDAD CATÓLICA BOLIVIANA “SAN PABLO” ANÁLISIS DE ALGORITMOS
NOMBRE: Camila Lémuz Mujica
El algoritmo de Johnson es una forma de encontrar el camino más corto entre todos los
pares de vértices de un grafo dirigido disperso. Permite que las aristas tengan pesos negativos,
si bien no permite ciclos de peso negativo. Funciona utilizando el algoritmo de Bellman-
Ford para hacer una transformación en el grafo inicial que elimina todas las aristas de peso
negativo, permitiendo por tanto usar el algoritmo de Dijkstra en el grafo transformado. Su
nombre viene de Donald B. Johnson, quien fuera el primero en publicar la técnica en 1977.
¿Cómo se aplica?
El algoritmo de Johnson consiste en los siguientes pasos:
1. Primero se añade un nuevo nodo q al grafo, conectado a cada uno de los nodos del
grafo por una arista de peso cero.
3. Seguidamente, a las aristas del grafo original se les cambia el peso usando los valores
calculados por el algoritmo de Bellman-Ford: una arista de u a v con tamaño w(u, v),
da el nuevo tamaño w(u, v) + h(u) – h(v)
4. Por último, para cada nodo s se usa el algoritmo de Dijkstra para determinar el camino
más corto entre s y los otros nodos, usando el grafo con pesos modificados.
“Sistema de compilación flexible basado en Gradle, un emulador rápido con varias funciones, un
entorno unificado en el que puedes realizar desarrollos para todos los dispositivos Android,
Instant Run, para aplicar cambios mientras tu app se ejecuta sin la necesidad de compilar un
nuevo APK, Integración de plantillas de código y GitHub, para ayudarte a compilar funciones
comunes de las apps e importar ejemplos de código, Gran cantidad de herramientas y
frameworks de prueba, Herramientas Lint para detectar problemas de rendimiento, uso,
compatibilidad de versión, Compatibilidad con C++ y NDK, Soporte integrado para Google Cloud
Platform, que facilita la integración de Google Cloud Messaging y App Engine.“ (Studio, 2016)
Código Fuente
String nom; }
x = in.readInt();
} ni=in.readInt();
nd=in.readInt();
return y;
@Override
} }
@Override
dest.writeString(nom);
public void setNi(int ni) {
dest.writeInt(ni);
this.ni = ni;
dest.writeInt(nd);
}
}
//genera el parce para mandar a otro
@SuppressWarnings("unused")
activity http://www.parcelabler.com/
public static final
protected Nodo(Parcel in) {
Parcelable.Creator<Nodo> CREATOR = new
UNIVERSIDAD CATÓLICA BOLIVIANA “SAN PABLO” ANÁLISIS DE ALGORITMOS
NOMBRE: Camila Lémuz Mujica
Parcelable.Creator<Nodo>() { x2,int y2,String nom2,int atributo){
@Override this.x1=x1;
this.nom1=nom1;
@Override
this.nom2=nom2;
public Nodo[] newArray(int size) {
holgura=0;
return new Nodo[size];
}
}
};
public int getX1(){return x1;}
}
public int getY1(){return y1;}
Para la arista
public int getX2(){return x2;}
import android.os.Parcel;
public int getY2(){return y2;}
import android.os.Parcelable;
public int getAtributo(){return atributo;}
import
public String getNom1(){return nom1;}
android.support.annotation.AttrRes;
public String getNom2(){return nom2;}
@Override
//genera el parce para mandar a otro
activity http://www.parcelabler.com/ public Arista[] newArray(int size) {
x1 = in.readInt(); }
y1 = in.readInt(); };
x2 = in.readInt(); @Override
nom1 = in.readString(); }
nom2 = in.readString();
holgura=in.readInt(); @Override
dest.writeInt(y1);
dest.writeInt(x2);
dest.writeInt(y2);
public static final Creator<Arista>
CREATOR = new Creator<Arista>() { dest.writeInt(atributo);
@Override dest.writeString(nom1);
UNIVERSIDAD CATÓLICA BOLIVIANA “SAN PABLO” ANÁLISIS DE ALGORITMOS
NOMBRE: Camila Lémuz Mujica
dest.writeString(nom2); }
dest.writeInt(holgura); }
import android.view.View;
setContentView(R.layout.activity_jhonson);
import android.widget.EditText;
init();
import android.widget.RelativeLayout;
}
import android.widget.Toast;
private void init(){
} cajaArista=caja.getText().toString().trim();
int
aux=Integer.parseInt(cajaArista);
@Override
break; lamina.addView(new
DibujaArista(getApplicationContext(),x1,y1,x
} 2,y2,cajaArista));
return super.onTouchEvent(event);
ventana.setPositiveButton("Aceptar", /*ventana.setNegativeButton("Cancelar",
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
@Override @Override
UNIVERSIDAD CATÓLICA BOLIVIANA “SAN PABLO” ANÁLISIS DE ALGORITMOS
NOMBRE: Camila Lémuz Mujica
public void onClick(DialogInterface }
dialog, int which) {
} if(Verifica(x,y,nodos.get(i).getX(),nodos.get(i)
.getY())){
public void nuevoNodo(){
vector[con]=i;
AlertDialog.Builder ventana=new
AlertDialog.Builder(this);
Toast.makeText(getApplicationContext(),"Sel
ventana.setMessage("Ingrese el Nombre
eciono:
del Nodo");
"+nodos.get(i).getNom(),Toast.LENGTH_SHO
ventana.setTitle("Nombre del Nodo"); RT).show();
ventana.setView(caja); pr=true;
ventana.setPositiveButton("Aceptar", break;
new DialogInterface.OnClickListener() {
}
@Override
}
public void onClick(DialogInterface
dialog, int which) {
if (con==2){
con=0;
nomPelota=caja.getText().toString().trim(); x1=nodos.get(vector[0]).getX();
nodos.add(new y1=nodos.get(vector[0]).getY();
Nodo(x,y,0,0,nomPelota));
x2=nodos.get(vector[1]).getX();
lamina.addView(new
y2=nodos.get(vector[1]).getY();
DibujaNodo(getApplicationContext(),x,y,RADI
O,nomPelota));
ventana.show();
UNIVERSIDAD CATÓLICA BOLIVIANA “SAN PABLO” ANÁLISIS DE ALGORITMOS
NOMBRE: Camila Lémuz Mujica
}else if(!pr){ }
nuevoNodo();
double dis=Math.sqrt((Math.pow((xx-
x),2))+(Math.pow((yy-y),2)));
if(dis>(RADIO+RADIO))
return false;
else
return true;
for(int i=0;i<aristas.size();i++){
if((aristas.get(i).getX1()==x1 &&
aristas.get(i).getY1()==y1 &&
aristas.get(i).getX2()==x2 &&
aristas.get(i).getY2()==y2) /*||
(listaLinea.get(i).getX1()==x2 &&
listaLinea.get(i).getY1()==y2 &&
listaLinea.get(i).getX2()==x1 &&
listaLinea.get(i).getY2()==y1)*/){
// posicion=i;
return false;
return true;