Sei sulla pagina 1di 5

Facvest

P-Centros

Nome: Carlos Guilherme Coelho, Leonardo Bosquett 4Fase de Cincias de computao

Lages 18 de outubro de 2012

Definio de P-centro
Segundo The p-Centre Problem-Heuristic and Optimal Algorithms Zvi Drezner The Journal of the Operational Research Society Vol. 35, No. 8 (Aug., 1984), pp. 741-748

O problema de p-centro, ou minimax problema de localizao-alocao em local teoria terminologia, o seguinte: dado n pontos de demanda no plano e um peso associado a cada ponto de demanda, encontrar facilidades p novos no plano que minimizar a euclidiana ponderada mxima distncia entre cada ponto de demanda e sua maior facilidade nova.

Definio do algoritmo de Floyd-Warshall


O algoritmo de Floyd-Warshall recebe como entrada uma matriz de adjacncia que representa um grafo (V, E) orientado e valorado. O valor de um caminho entre dois vrtices a soma dos valores de todas as arestas ao longo desse caminho. As arestas E do grafo podem ter valores negativos, mas o grafo no pode conter nenhum ciclo de valor negativo. O algoritmo calcula, para cada par de vrtices, o menor de todos os caminhos entre os vrtices. Por exemplo, o caminho de menor custo. Algoritmo: ROTINA fw(Inteiro[1..n,1..n] grafo) # Inicializao VAR Inteiro[1..n,1..n] dist := grafo VAR Inteiro[1..n,1..n] pred PARA i DE 1 A n PARA j DE 1 A n SE dist[i,j] < Infinito ENTO pred[i,j] := i # Lao principal do algoritmo PARA k DE 1 A n PARA i DE 1 A n PARA j DE 1 A n SE dist[i,j] > dist[i,k] + dist[k,j] ENTO dist[i,j] = dist[i,k] + dist[k,j] pred[i,j] = pred[k,j] RETORNE dist

Algoritmo de Dijstra
O algoritmo de Dijkstra, concebido pelo cientista da computao holands Edsger Dijkstra em 1956 e publicado em 1959[1][2], soluciona o problema do caminho mais curto

num grafo dirigido ou no dirigido com arestas de peso no negativo, em tempo computacional O([m+n]log n) onde m o nmero de arestas e n o nmero de vrtices. O algoritmo que serve para resolver o mesmo problema em um grafo com pesos negativos o algoritmo de Bellman-Ford, que possui maior tempo de execuo que o Dijkstra. O algoritmo de Dijkstra assemelha-se ao BFS, mas um algoritmo guloso, ou seja, toma a deciso que parece tima no momento. Para a teoria dos grafos uma "estratgia gulosa" conveniente j que sendo P um menor caminho entre 2 vrtices U e V, todo subcaminho de P um menor caminho entre 2 vrtices pertencentes ao caminho P, desta forma construmos os melhores caminhos dos vrtices alcanveis pelo vrtice inicial determinando todos os melhores caminhos intermedirios. Nota: diz-se 'um menor caminho' pois caso existam 2 'menores caminhos' apenas um ser descoberto. O algoritmo considera um conjunto S de menores caminhos, iniciado com um vrtice inicial I. A cada passo do algoritmo busca-se nas adjacncias dos vrtices pertencentes a S aquele vrtice com menor distncia relativa a I e adiciona-o a S e, ento, repetindo os passos at que todos os vrtices alcanveis por I estejam em S. Arestas que ligam vrtices j pertencentes a S so desconsideradas. Um exemplo prtico do problema que pode ser resolvido pelo algoritmo de Dijkstra : algum precisa se deslocar de uma cidade para outra. Para isso, ela dispe de vrias estradas, que passam por diversas cidades. Qual delas oferece uma trajetria de menor caminho? Algoritmo: #include <string.h> //memset #include <vector> using namespace std; // MAXV uma constante que define a quantidade mxima de vrtices #define MAXV 100 // Lista de adjacncias // Para inserir uma aresta - partindo do vrtice 'i' ao vrtice 'j', com custo 'c' - na lista, podemos usar: // LAdj[i].push_back (make_pair (j, c)); vector < pair <int, int> > LAdj[MAXV]; // Armazena a distncia mnima partindo de um vrtice 'i' at todos os outros vrtices // dis[j] representa a menor distncia de 'i' a 'j'. int dis[MAXV]; // Calcula as distncias de 'Vi' a todos os outros vrtices de um grafo com 'V' vrtices e armazena-as em dis[] void dijkstra (int Vi, int V) {

// vis[i] informa se o vrtice 'i' j foi visitado/analisado ou no (inicialmente nenhum vrtice foi) char vis[MAXV]; memset (vis, 0, sizeof (vis)); // Inicialmente afirmamos que a menor distncia encontrada entre Vi e qualquer outro vrtice (exceto o prprio Vi) infinita memset (dis, 0x7f, sizeof (dis)); dis[Vi] = 0; while (1) { int i, n = -1; for (i = 0; i < V; i++) if (! vis[i] && (n < 0 || dis[i] < dis[n])) n = i; if (n < 0) break; vis[n] = 1; for (i = 0; i < LAdj[n].size (); i++) // Aresta n -> LAdj[n][i].first com custo LAdj[n][i].second if (dis[LAdj[n][i].first] > dis[n] + LAdj[n][i].second) dis[LAdj[n][i].first] = dis[n] + LAdj[n][i].second; } }

Menor distncia entre centros


A menor distncia entre centros se define por um conjunto de distncias onde a menor delas que liga dois pontos, sendo um deles um centro, escolhida. Dado problema pode ser descrito em um exemplo, Um grupo de caminhoneiros sempre faz uma reunio para definirem clientes e prioridades, porm eles querem economizar na viagem e precisam percorrer o menor caminho possvel para se encontrar, essa aplicao caberia para resoluo do problema, quando h muitos pontos que precisam ser avaliados. Em um plano cartesiano se define pela frmula: ( ) ( ) ( )

Com essa frmula possvel definir a menor distncia mxima entre dois pontos calculando cada distncia entre todos os pontos.

Vemos aqui dois centros (laranja), e dois viajantes que precisam chegar a um centro na menor distncia possvel. A aplicao dever fazer isso para todos os pontos colocados no plano cartesiano e calcular a menor rota para se chegar a um centro, como no exemplo:

Potrebbero piacerti anche