Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
P-Centros
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.
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; } }
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: