54
Projeto: SOLUÇAO DE PROBLEMAS DE LOCALIZAÇÃO E ROTEAMENTO EM REDES COM SISTEMA DE INFORMAÇÕES GEOGRÁFICAS Processo : FAPESP – 01/02786-4 Bolsista: Mariana Quissak Bartelega Peixoto Orientador : Prof. Dr. Edson Luiz França Senne Instituição : Unesp - Universidade Estadual Paulista Campus de Guaratinguetá, Faculdade de Engenharia RELATÓRIO FINAL DE ATIVIDADES Resumo Este projeto visa desenvolver uma ferramenta para o processo de tomada de decisão envolvendo problemas de localização de facilidades e roteamento de veículos em redes. Pretende-se desenvolver tal ferramenta com base na plataforma computacional do sistema de informações geográficas TransCAD. Os problemas de localização de facilidades e de roteamento de veículos justificam a atenção por serem comuns em diversas aplicações e serem considerados de difícil solução. Para a solução desses problemas pretende-se utilizar procedimentos já disponíveis no sistema TransCAD, assim como procedimentos já desenvolvidos pelo orientador. Pretende-se dar ênfase a aplicações no ambiente urbano, levando em consideração dados e mapas digitalizados já disponíveis.

2002-transcad aprende

  • Upload
    yawar21

  • View
    248

  • Download
    5

Embed Size (px)

Citation preview

Page 1: 2002-transcad aprende

Projeto: SOLUÇAO DE PROBLEMAS DE LOCALIZAÇÃO E ROTEAMENTO EM REDES COM SISTEMA DE INFORMAÇÕES GEOGRÁFICAS Processo: FAPESP – 01/02786-4 Bolsista: Mariana Quissak Bartelega Peixoto Orientador: Prof. Dr. Edson Luiz França Senne Instituição: Unesp - Universidade Estadual Paulista Campus de Guaratinguetá, Faculdade de Engenharia

RELATÓRIO FINAL DE ATIVIDADES Resumo

Este projeto visa desenvolver uma ferramenta para o processo de tomada de decisão

envolvendo problemas de localização de facilidades e roteamento de veículos em redes.

Pretende-se desenvolver tal ferramenta com base na plataforma computacional do sistema de

informações geográficas TransCAD. Os problemas de localização de facilidades e de

roteamento de veículos justificam a atenção por serem comuns em diversas aplicações e

serem considerados de difícil solução. Para a solução desses problemas pretende-se utilizar

procedimentos já disponíveis no sistema TransCAD, assim como procedimentos já

desenvolvidos pelo orientador. Pretende-se dar ênfase a aplicações no ambiente urbano,

levando em consideração dados e mapas digitalizados já disponíveis.

Page 2: 2002-transcad aprende

2

Relatório de Bolsa de Iniciação Científica Área: Engenharia de Produção

FAPESP – Fundação de Amparo à Pesquisa do Estado de São Paulo

SOLUÇAO DE PROBLEMAS DE LOCALIZAÇÃO E ROTEAMENTO EM REDES COM SISTEMA DE INFORMAÇÕES GEOGRÁFICAS

Processo FAPESP – 01/02786-4

Mariana Quissak Bartelega Peixoto Bolsista

Prof. Dr. Edson Luiz França Senne Orientador

Unesp - Campus de Guaratinguetá Faculdade de Engenharia

Maio, 2002

Page 3: 2002-transcad aprende

3

1. Resumo do Projeto Aprovado 1.1. Introdução

Problemas de localização tratam de decisões sobre onde localizar facilidades em uma

rede, considerando que existem clientes a serem atendidos, de forma a otimizar um

determinado critério (Love et al., 1988; Mirchandani and Francis, 1990; Francis et al., 1992;

Drezner, 1995). O termo “facilidades” pode se referir a fábricas, depósitos, escolas, etc.,

enquanto “clientes” pode se referir a depósitos, unidades de vendas, estudantes, etc.

As aplicações de localização, em geral, são divididas para os setores público e privado.

No caso do setor público, as aplicações procuram maximizar a satisfação dos clientes. São

exemplos de aplicações para o setor público, a localização de escolas, postos de saúde, corpo

de bombeiros, centrais de ambulâncias, viaturas de polícia, pontos de ônibus, entre outros. No

caso do setor privado, as aplicações envolvem, em geral, fábricas, depósitos, torres de

transmissão, lojas de franquias, dentre outras.

Problemas de roteamento aparecem em uma série de serviços, como entrega bancária,

entrega postal, entrega de mercadorias, rotas de ônibus escolar, coleta de lixo, serviço de

entregas noturnas, operações de frete, dentre outros. A solução destes problemas pode

diminuir bastante o custo de distribuição, causando uma grande economia tanto para o setor

público como para o setor privado. No entanto, muitos destes problemas são difíceis de

resolver. Estas duas características fazem com que haja uma extensa literatura sobre

problemas de roteamento (Christofides et al., 1979; Bodin et al., 1983; Gendreau et al., 1997).

No problema clássico de roteamento de veículos, consideram-se n clientes

espacialmente distribuídos, cada um com uma demanda de mercadorias. As mercadorias são

entregues a partir de um depósito por uma frota de veículos homogêneos. Cada veículo realiza

um percurso saindo do depósito e entregando as mercadorias para um subconjunto de clientes,

satisfazendo as necessidades de demanda de cada um e retornando ao depósito. A rota de cada

veículo deve obedecer a algumas restrições como: a quantidade de mercadoria entregue não

deve exceder a capacidade do veículo e o tempo limite para realizar uma rota não deve ser

ultrapassado. O problema de roteamento de ve ículos pretende traçar rotas para os veículos,

determinando para quais clientes deve-se fornecer a mercadoria, de forma a não violar as

restrições e otimizar alguma função-objetivo. Normalmente, três funções-objetivo podem ser

consideradas:

Page 4: 2002-transcad aprende

4

− minimizar a distância total percorrida (ou o tempo gasto) por todos os veículos;

− minimizar o número de veículos;

− minimizar uma combinação de custo de veículos e distância percorrida.

Estas áreas – localização de facilidades e roteamento de veículos – têm despertado

crescente interesse por parte de planejadores, principalmente quando uma base de dados geograficamente referenciada pode ser usada. O uso de SIG – Sistema de Informações Geográficas (Fischbeck, 1994) para resolver problemas de localização e roteamento, levando-se em conta a capacidade de armazenar, exibir e manipular dados espacialmente distribuídos e a possibilidade de integração de novos algoritmos aos SIGs, iniciou-se há poucos anos. O ESRI (Environmental Systems Research Institute), por exemplo, integrou alguns problemas de localização não-capacitados a seu sistema de informações geográficas ARC/INFO (ESRI, 1997). A integração baseou-se na heurística de Teitz & Bart (1968) para solução do problema das p-medianas. Outro exemplo ocorre com o sistema TransCAD que utiliza heurísticas “gulosas” e heurísticas de troca para resolver alguns problemas de localização, dispondo também de procedimentos para a solução de problemas de roteamento de veículos, inclusive problemas com restrições de tempo, múltiplos depósitos e frotas heterogêneas (Caliper, 1999b).

1.2. Objetivos do Projeto

Os objetivos deste projeto são os seguintes:

− Estudar o sistema de informações geográficas TransCAD (Caliper, 1999c) no que se

refere à solução de problemas de localização de facilidades e roteamento de veículos;

− Promover integrações de algoritmos de localização de facilidades e roteamento de

veículos já desenvolvidos ao sistema de informações geográficas TransCAD, de modo que

a interação do usuário com as soluções dos problemas possa ser feita diretamente sobre

mapas que representem redes urbanas, e comparar as soluções obtidas por esses novos

algoritmos com as soluções obtidas pelos procedimentos disponíveis no sistema

TransCAD;

− Construir protótipos de Sistemas de Apoio à Decisão para problemas de localização de

facilidades e roteamento de veículos usando dados geo-referenciados já disponíveis para

redes urbanas e o sistema TransCAD.

Pretende-se a solução dos seguintes problemas com o sistema TransCAD:

Page 5: 2002-transcad aprende

5

− p-medianas capacitado e não-capacitado;

− localização considerando custos fixos e os casos capacitado e não-capacitado;

− roteamento de veículos (caso clássico e variações).

1.3. Atividades e Cronograma de Desenvolvimento

As seguintes atividades serão desenvolvidas no projeto:

(a) Levantamento bibliográfico sobre problemas de localização e roteamento.

(b) Estudo do sistema de informações geográficas TransCAD.

(c) Estudo da linguagem de desenvolvimento GISDK (Caliper, 1999a).

(d) Utilização de algoritmos já existentes e integração de novos algoritmos de localização e

roteamento ao TransCAD, visando a construção de Sistemas de Apoio à Decisão.

(e) Desenvolvimento de aplicações-piloto considerando dados e mapas já existentes.

(f) Elaboração de relatórios e divulgação de resultados.

Pretende-se que tais atividades sejam executadas no período de 1 ano, segundo o

cronograma:

Meses

Atividade 01 02 03 04 05 06 07 08 09 10 11 12

a X X

b X X X X X

c X X X

d X X X X X

e X X X X

f X X X

2. Desenvolvimento das Atividades do Projeto As atividades (a) e (b) - “Levantamento bibliográfico sobre problemas de localização

e roteamento”, e “Estudo do Sistema de Informações Geográficas TransCAD” propostas no item 1.3 deste relatório foram tratadas no relatório parcial, e portanto, não serão

Page 6: 2002-transcad aprende

6

detalhadamente explicadas neste relatório. Serão citados apenas os tópicos que serão de fato utilizados nesta segunda etapa do projeto.

2.1. Problemas de Localização e Roteamento – Resumo 2.1.1. Geoprocessamento

Geoprocessamento é o uso automatizado de informação que de alguma forma está

vinculada a um determinado lugar no espaço, seja por meio de um simples endereço ou por coordenadas. Vários sistemas fazem parte do Geoprocessamento dentre os quais o GIS é o sistema que reúne maior capacidade de processamento e análise de dados espaciais. Estes sistemas se aplicam a qualquer tema que manipule dados ou informações vinculadas a um determinado lugar no espaço e que possam ser representados em um mapa, como casas, escolas, hospitais, etc. A utilização destes sistemas produz informações que permitem tomar decisões sobre problemas espaciais, como os problemas de localização e roteamento em redes. 2.1.2. Problemas de Localização Em um problema de localização, uma ou mais facilidades servem clientes espacialmente distribuídos. O objetivo na solução de um problema deste tipo é determinar a melhor localização para as facilidades a fim de otimizar uma função de custo (tempo, distância, valor financeiro...) previamente determinada, ou então determinar o número de facilidades necessárias para que uma função de custo seja otimizada. A função de custo (ou função-objetivo) pode ser, por exemplo, minimizar a distância média entre as facilidades e os clientes ou minimizar o tempo médio gasto para visitar um certo número de clientes a partir de uma ou mais facilidades. 2.1.3. Problemas de Roteamento

O problema de roteamento de veículos (PRV) é o mais comum dentre os problemas de

roteamento. Consiste basicamente em estabelecer e organizar rotas ou itinerários eficientes para veículos realizarem entregas de mercadorias. Em outras palavras, dispõe-se de uma frota de k veículos, idênticos ou não, e deseja-se atender um conjunto de n clientes, cada um com uma demanda específica. Todos os veículos devem partir e retornar a uma mesma origem (normalmente denominada depósito) e cada cliente deve ser visitado uma única vez.

O objetivo geral é minimizar o “custo total” de transporte no atendimento aos clientes, isto é, minimizar custos fixos, custos operacionais e o número de veículos envolvidos no transporte.

Page 7: 2002-transcad aprende

7

Alguns fatores importantes dificultam a construção e solução dos problemas de roteamento:

- Frota heterogênea: veículos com diferentes capacidades de carga; - Janelas de tempo: representam o intervalo de tempo no qual a entrega da

mercadoria deve ocorrer. Um exemplo típico deste problema ocorre na distribuição de bebidas para restaurantes. Por exemplo, não seria conveniente para o restaurante receber suas mercadorias no horário do almoço. Portanto, janelas de tempo em um PRV possuem valores limites para iniciar a entrega.

- Viagens longas: a circulação entre cidades geralmente força os veículos a circularem mais de um dia. Devem então ser estabelecidas regras especiais na formação da rota que tornam o problema muito mais complexo.

- Horários de início e fim das atividades: Alguns dos problemas requerem que todos os veículos devam começar e terminar na mesma hora. Outros permitem diferentes especificações de horário de início e final para as rotas de cada um dos veículos, o que os tornam mais realistas, pois na prática, nem sempre é possível que todos os veículos deixem o depósito simultaneamente.

- Questão de assimetria: em um PRV, a questão de assimetria é um fator muito importante. Um problema é assimétrico quando o caminho para ir de i até j é diferente do caminho de j até i. Um exemplo prático disso ocorre com ruas de mão única e locais separados por uma serra.

2.2. Estudo do Sistema de Informações Geográficas TransCAD

Foi feito um estudo detalhado sobre o Sistema de Informações Geográficas TransCAD, e os resultados preliminares obtidos foram mostrados no relatório parcial de atividades. A seguir, serão re-apresentados e detalhadamente explicados alguns tópicos e funções com maior importância nesta etapa do projeto. 2.2.1 Seleções – “Selections Sets”

Criar uma seleção é apenas destacar, com cores e padrões diferentes, determinadas

entidades no mapa.

Além dos três botões na “Toolbox”, pode-se fazer seleção através do botão . Com

este botão é possível criar uma seleção usando uma condição com os dados dos campos de

uma tabela. Por exemplo, deseja-se selecionar todos os trechos de ruas com o número de

milhas superior a 1.35, numa seleção que iremos chamar de Teste, o usuário deve proceder da

seguinte maneira:

Page 8: 2002-transcad aprende

8

É aqui que coloca-se a condiçãodesejada para se fazer a seleção

Neste local,coloca-se o nomeda seleção

Com “Create Set”é especificado quea seleção vai sercriada

Isto são listas, dos campos, dosoperadores, das funções e dosvalores, que ajudam na formação dacondição.

Aqui aparece ascondições usadasanteriormente

Figura 1 – Trabalhando com seleções

É importante salientar que a condição deve utilizar informações contidas nos campos

que existem na tabela. Neste caso, o número de milhas para cada trecho da rua é fornecido

pelo campo “Miles”. A seleção Teste destacará todos os trechos de ruas com um comprimento

maior que 1.35 milhas.

Em “Selection Method” existem outras opções de métodos de seleção, como: “Add to

Set”, usada quando se deseja que a condição seja adicionada a uma seleção que já existe e que

está especificada em “Set Name”; “Remove from Set”, usada quando se quer remover da

seleção especificada em “Set Name” os trechos que satisfazem a condição digitada; e

“Subset”, quando se deseja criar uma subseleção.

As condições podem utilizar operadores lógicos como “or” (ou) e “and” (e). Assim,

quando se deseja selecionar todos os trechos de ruas com o número de milhas iguais a 1.00 ou

2.00, pode-se usar a seguinte condição: Miles = 1 or Miles = 2. Caso seja desejado selecionar

os trechos que tenham número de milhas igual a 3.00, mas que tenham o nome “George

Parks”, a condição será: Miles = 3 and Name = “George Parks”.

Com a ferramenta de seleção, disponível em “Selection” no menu “Tools”, pode-se

visualizar, criar, remover ou alterar características de seleções de um determinado “layer”.

Page 9: 2002-transcad aprende

9

Adiciona“labels”

somente naseleção.

Seleção corrente,de nome Teste

Com um clique neste botãoé possível visualizaras seleçõesexistentes para este“layer”.Este número fornece a quantidade

de entidades selecionadas nestaseleção, no caso Teste.

Com um clique nestebotão, consegue-sevisualizar somente aseleção corrente. Paravoltar ao normal,clique de novo.

Ao clicar este botão, oTransCAD mostra aseleção inteira no mapa.

Muda estilo daseleção.

Renomeia aseleção.

Apaga aseleção

Adiciona umanova seleção

Figura 2 – Seleções

Não é necessário que nada de especial seja feito para salvar uma seleção. Elas são

salvas automaticamente sempre que o mapa onde elas estiverem presentes for salvo.

Para executar uma seleção em uma camada, baseada em outra camada, utiliza-se o

comando “Select by Location” no menu “Dataview”. Por exemplo, caso o usuário queira

selecionar numa camada de rodovias os trechos contidos num determinado estado, ele deverá

primeiramente criar uma seleção com o estado desejado e mudar a camada de trabalho para a

de rodovias; em seguida, no menu “Dataview” escolher o item “Select by Location” e

finalmente preencher a janela como pode ser visto abaixo:

Nome do “layer” e da seleção em que será baseadaseleção. No exemplo, o “layer” é Estados e a seleção“Selection” contém o estado desejado.

Aqui, determine o modocomo a seleção deverá serfeita, isto é, qual o critérioa ser utilizado paraexecução da seleção. Nocaso, são selecionados ostrechos de rodovias queestão tocando (“touching”)o estado selecionado.

Nome da seleção queestá sendo criada,com os trechos quetocam o estadodesejado.

Figura 3 – “Selec by Location”

Page 10: 2002-transcad aprende

10

A seguir, encontra-se um exemplo de seleções criadas a partir de um mapa disponível

no TransCAD. Os triângulos verdes indicam uma seleção e os quadrados vermelhos outra.

Figura 4 – Exemplo de Seleções

Este recurso será bastante utilizado na solução dos problemas de localização de

facilidades e de roteamento de veículos, tratados mais adiante neste relatório.

2.2.2 – Redes e Obtenção de Menores Caminhos Uma rede (“network”) é uma estrutura especial de dados que armazena importantes características de um sistema de transporte. O TransCAD utiliza-se dos arquivos geográficos para construir os mapas dos sistemas de transporte e as redes para resolver os problemas relacionados a estes sistemas. Menores caminhos (“Shortest paths”) são rotas, sobre uma rede de transportes, nas quais o custo geral é o menor possível. Este custo se refere a qualquer combinação de fatores como distância, tempo, ou até custo financeiro de uma viagem. Encontrar os menores caminhos em uma rede é o principal bloco de construção de muitos algo ritmos e modelos sofisticados, e será, portanto, bastante citado neste trabalho.

2.2.2.1. - Redes

Redes são utilizadas para analisar a maneira como pessoas e mercadorias fluem de uma localidade até outra. Elas são representadas através de ‘grafos’ (representações abstratas de um sistema de transporte).

Uma rede é definida como um conjunto de nós e ligações. Nós são as localidades de onde o fluxo começa, termina ou se ramifica. Ligações são percursos que transportam o fluxo, de nó para nó.

Page 11: 2002-transcad aprende

11

Cada nó e cada ligação em uma rede possuem um número de identificação (ID). No TransCAD, as ligações e os nós geralmente correspondem às características de, respectivamente, linhas e pontos (“endpoints”) de um arquivo geográfico.

Uma camada de linhas em um mapa consiste em um conjunto de linhas, cada qual tendo início e fim em pontos denominados “endpoints”, cada um dos quais definido por coordenadas. § Criando uma Rede:

Uma rede é sempre criada a partir de uma camada de linhas. Para tanto, após selecionar a camada de linhas com a qual deseja-se construir a rede, deve-se selecionar a opção Networks/Paths-Create a partir do menu de opções. É aberta então, uma caixa de diálogos referentes à criação da rede:

Figura 5 – Criando uma Rede

Nesta caixa de diálogos, o usuário deve escolher as características a serem incluídas na

rede. Deve também informar o nome do campo correspondente ao comprimento de cada percurso. Caso seja necessário, mais de um campo pode ser adicionado à rede. § Utilizando uma rede:

O TransCAD permite que qualquer número de diferentes redes sejam criadas. Porém, para ativar uma das redes criadas, basta abri- la a partir do menu de opções: File/Open. 2.2.2.2. – Encontrando o Menor Caminho em uma Rede

O TransCAD é capaz de encontrar o menor (ou o melhor) caminho na movimentação de

um ponto até outro em uma rede. O menor caminho é aquele que minimiza o valor total do custo de um determinado atributo, como distância, tempo ou custo financeiro.

Page 12: 2002-transcad aprende

12

O algoritmo utilizado pelo TransCAD no cálculo do menor caminho pressupõe que a ordem na qual as localidades devem ser visitadas é dada.

Considerando o mapa mostrado na figura abaixo, deseja-se calcular o menor percurso a ser percorrido, partindo do ponto PARTIDA, passando pelos PONTOS 1, 2 e 3, e chegando ao ponto CHEGADA.

Figura 6 – Teste do algoritmo do “Menor Caminho”

Para solucionar um problema como este, o TransCAD utiliza-se da ferramenta “Shortest Path”, no meu de opções (Network/Paths – Shortest Path). A execução deste comando é simples, bastando clicar nos pontos de partida, de passagem e de chegada, na ordem em que eles devem ser visitados. O programa mostra o resultado obtido desenhando, no mapa, o caminho a ser percorrido, levando em conta a rede que conecta esses pontos.

Utilizando-se então do comando “Shortest-Path”, obtém-se para o exemplo anterior o seguinte resultado:

Figura 7 – Resultado encontrado pelo algoritmo do “Menor Caminho”

Page 13: 2002-transcad aprende

13

2.2.2.3. – Problema do Caixeiro Viajante – “Traveling Salesman Problem” (TSP)

Muitos dos problemas de transporte consistem em determinar a melhor maneira de realizar uma seqüência de paradas ou entregas. É o que acontece, por exemplo, com ônibus escolares que devem, todo dia, buscar as crianças em suas residências e levá- las à escola, ou então com vendedores que planejam visitar seus clientes em lugares diferentes.

Problemas como estes apresentam o mesmo tipo de estrutura – minimizar os custos quando se deseja realizar visitas em um grupo de paradas (“stops”), não importando a seqüência com que estas paradas sejam visitadas. Estes tipos de problemas recebem o nome de “Problemas do Caixeiro Viajante”, tratado também neste relatório como TSP (Traveling Salesman Problem) .

O TransCAD soluciona este tipo de problema, encontrando o caminho de menor custo

a partir de uma rede. Para tanto, o ponto de partida deve ser especificado. Este ponto é denominado de depósito (“depot”), e os pontos a serem visitados de paradas (“stops”). O resultado do percurso é denominado de percurso (“tour”). O percurso sempre começa e termina em um depósito.

Para solução de um problema do Caixeiro Viajante, uma rede deve ser criada (com as

características que serão utilizadas). Em seguida, deve ser preparada uma “Seleção” (a partir dos comandos de seleção previamente explicados) contendo o depósito e as paradas a serem visitadas. O depósito deve ser sempre o primeiro elemento da seleção.

O resultado de um problema como este pode ser mostrado pelo programa de algumas formas diferentes:

- O percurso é desenhado no mapa; - O custo do percurso é mostrado na tela; - As direções a serem seguidas são mostradas pelo “Note Pad”.

Considere como exemplo o mapa mostrado na Figura 8. Supõe-se que um ônibus escolar

deve, toda manhã, buscar um certo número de crianças e levá-las à escola, percorrendo a menor distância possível. No mapa, estão identificadas a escola e as residências das crianças (triângulos verdes).

Page 14: 2002-transcad aprende

14

Figura 8 – Mapa para teste do algoritmo do “Problema do Caixeiro Viajante”

Utilizando o comando “Traveling Salesman Problem”, a partir do menu de opções (Networks/Paths-Traveling Salesman Problem) o programa fornece graficamente o percurso a ser percorrido, e também um arquivo com as direções a serem seguidas (figuras 9 e 10):

Figura 9 – Resultado obtido para o problema do Caixeiro Viajante

Page 15: 2002-transcad aprende

15

Start East on PEARL ST 0.14 Kilometers (0.14 Kilometers).

Continue North on BROAD ST 0.39 Kilometers (0.53 Kilometers).

Turn Right East on WALL ST 0.35 Kilometers (0.88 Kilometers).

Turn Right West on WATER ST 0.08 Kilometers (0.96 Kilometers).

Turn Left South on GOUVERNEUR LN 0.06 Kilometers (1.02 Kilometers).

Turn Left East on FRONT ST 0.45 Kilometers (1.47 Kilometers).

Turn Left North on FULTON ST 0.29 Kilometers (1.76 Kilometers).

Turn Right North on GOLD ST 0.08 Kilometers (1.84 Kilometers).

Turn Left North on BEEKMAN ST 0.11 Kilometers (1.95 Kilometers).

Turn Left South on WILLIAM ST 0.08 Kilometers (2.03 Kilometers).

Turn Right West on ANN ST 0.13 Kilometers (2.16 Kilometers).

Turn Left West on NASSAU ST 0.28 Kilometers (2.44 Kilometers).

Turn Right West on LIBERTY ST 0.42 Kilometers (2.86 Kilometers).

Turn Left South on WASHINGTON ST 0.37 Kilometers (3.23 Kilometers).

Turn Right West on JOSEPH P WARD ST 0.06 Kilometers (3.30 Kilometers).

Continue West on (unknown) 0.04 Kilometers (3.34 Kilometers).

Turn Left South on S ST VIADUCT 0.30 Kilometers (3.64 Kilometers).

Turn Right North on BATTERY PL 0.20 Kilometers (3.84 Kilometers).

Sharp Right East on 1ST PL 0.04 Kilometers (3.88 Kilometers).

Backtrack West on 1ST PL 0.04 Kilometers (3.93 Kilometers).

Sharp Left South on BATTERY PL 0.47 Kilometers (4.40 Kilometers).

Turn Right South on BROADWAY 0.06 Kilometers (4.46 Kilometers).

Continue South on WHITEHALL ST 0.10 Kilometers (4.56 Kilometers).

Figura 10 – Direções a serem seguidas

2.3 Estudo da linguagem de desenvolvimento GISDK 2.3.1 Introdução

O TransCAD foi criado para permitir aos usuários desenvolverem e integrarem seus próprios modelos e estabelecer conexões com outros sistemas de informações. Usando o GISDK (Geographic Information System Developer’s Kit) programas externos podem ser conectados ao TransCAD para solucionar problemas de roteamento, logística, ou localização. Isto permite construir aplicações personalizadas utilizando mapeamento, visualização, ou qualquer outra ferramenta de análise do TransCAD.

Page 16: 2002-transcad aprende

16

Figura 11 – Adicionando modelos personalizados ao TransCad

A linguagem GISDK permite que sejam criados programas que auxiliem na resolução de problemas geográficos. Estes programas são criados a partir de uma interface personalizada contendo menus, barras de fe rramentas e caixas de diálogos programados para responder às ações do usuário da maneira desejada.

Existem três modos diferentes de utilização da linguagem GISDK: - Criando “add- ins”, que permitem estender a capacidade do programa TransCAD,

permitindo, por exemplo, criar atalhos para operações que são sempre executadas; - Construindo “custom applications”, utilizando uma interface totalmente personalizada,

permitindo uma maior simplicidade da utilização do TransCAD pelos clientes; - Criando “server applications”, que permitem adicionar mapas e análises a outros

programas. “Add-Ins” são criados a partir da escrita, compilação e instalação de macros ou caixas de diálogos. Uma vez instaladas, o usuário pode executá- las a partir do menu de opções Tools – Add-Ins. Este tipo de aplicação pode ser bastante simples, como por exemplo a criação de macros que são executados apenas quando são selecionados, sem nenhuma interação do usuário, ou muito complexos, onde mostram, por exemplo, uma caixa de diálogos que possib ilita ao usuário escolher as configurações e opções desejadas para executar a macro (são geralmente barras de ferramentas personalizadas, constituídas de botões).

O GISDK permite que sejam criadas aplicações do programa utilizando uma interface própria – “Custom Applications”, na qual o programador especifica os menus, barras de ferramentas, caixas de diálogos e faz com que a aplicação responda da maneira desejada. Não são todos os algoritmos do TransCAD que estão disponíveis para serem utilizados em uma “Custom Applications”. Os algoritmos da solução de problemas de localização de facilidades

Page 17: 2002-transcad aprende

17

e de roteamento de veículos, por exemplo, não podem ser adicionados em uma “Custom Application”.

Uma “Server Application” é uma aplicação do GISDK que fornece serviços a outros programas. Uma “Server Application” utiliza os recursos gráficos e as capacidades de análise do TransCAD como parte do próprio programa. Ela pode ser utilizada, por exemplo, para mostrar mapas em outros programas (sistemas de apoio a decisões, aplicações de marketing, aplicações na internet). Estes programas (“cliente”), podem ser escritos em Visual Basic, C, C++, ou qualquer outra linguagem de programação. Uma “Server Application” não possui uma interface gráfica, pois ela apenas fornece serviços a outros programas. Elas são criadas a partir da escrita de macros que contenham as tarefas requeridas pelo “programa cliente” e são inicializadas sempre que forem requisitadas pelo servidor.

2.3.2 A Plataforma e a Interface

Para um usuário, o TransCAD é um programa como outro programa qualquer do

ambiente Windows. Para um programador da linguagem GISDK, entretanto, o TransCAD deve ser dividido em duas partes distintas: a plataforma e a interface com o usuário (UI –“ User Interface”).

A plataforma é o centro do sistema de informações geográficas (GIS) e do sistema de gerenciamento de dados (DBMS), que são utilizados para construir mapas e realizar as análises destes mapas e dados.

A interface com o usuário é o conjunto de menus, caixas de diálogos e ferramentas, que permitem o acesso do usuário às capacidades do programa.

A plataforma está armazenada em um arquivo executável (TCW.EXE) e em várias bibliotecas (DLLs). As UIs estão armazenadas em um banco de dados, denominados de “Banco de Dados da Interface com o Usuário” (“UI Database”). A plataforma e o banco de dados da interface são inseparáveis; um não pode ser utilizado sem o outro.

2.3.3 A Compilação

Quando programas em GISDK são escritos, eles são armazenados em arquivos textos, conhecidos como “resource files”. Estes arquivos possuem extensão .RSC. Todos os programas escritos em GISDK devem ser compilados antes de serem executados. O programa responsável em compilar os “resource files” é chamado de “resource compiler”. Este compilador está armazenado no “Bando de Dados da Interface com o Usuário”. O compilador pode compilar um simples arquivo ou um grupo de arquivos de uma vez. Para que um grupo de arquivos seja compilado, deve ser criada uma lista contendo o nome dos arquivos a serem compilados. Esta lista deve ser um arquivo texto com extensão .LST, que contenha o nome de todos os arquivos a serem compilados, um por linha.

Page 18: 2002-transcad aprende

18

Os compiladores buscam nos arquivos escritos pelo programador erros de vários tipos, incluindo erros de sintaxe, pontuação, erros de declaração, dentre outros. Se erros são detectados, o compilador cria um arquivo listando os erros encontrados, localizando-os pela linha em que são encontrados. Este arquivo de erro possui o mesmo nome do “resource file”, e uma extensão .ERR, e é sempre armazenado no mesmo diretório que o próprio “resource file”.

A compilação pode ser feita de três maneiras: - Através dos botões da barra de ferramentas do GISDK; - Através do programa RSCC.EXE; - Através da função LoadResourceFile( ) presente na linguagem GISDK. 2.3.3.1 - Compilação através da Barra de Ferramentas: A barra de ferramentas do GISDK é um add- in que contém as ferramentas utilizadas

para compilar e acessar as aplicações do GISDK. Ela é acessada a partir do menu de opções do TransCAD: Tools – Add-Ins...

Figura 12 – Barra de Ferramentas GISDK

(1) Compila o “resource file”

(2) Testa a macro ou a caixa de diálogos

(3) Compile resource file(s) to a stand-alone UI database

(4) Executa um ou mais comandos imediatamente

2.3.3.2 - Compilação através do Stand-alone Resource Compiler: Os programas podem ser compilados através do prompt de comandos do DOS ou a

partir do Gerenciador de Programas do Windows, utilizando a versão “stand-alone” do compilador (RSCC.EXE).

Este programa aceita a linha de comando da seguinte maneira: rscc {-c} -u uidbname fname1.rsc fname2.rsc...

onde: - O sinalizador –u indica que a entrada seguinte na linha de comando (uidbname) é o

atalho e o nome do arquivo (sem extensão) do Banco de Dados da Interface (UI database);

(1)

(2) (3)

(4)

Page 19: 2002-transcad aprende

19

- fname1.rsc, fname2.rsc, etc. são os nomes dos “resource files” a serem compilados;

- O sinalizador opcional –c indica que o UI database deve ser limpo antes da compilação.

2.2.3.3 - Compilação através da função LoadResourceFile( ): Os próprios programas escritos pelo programador podem usar a função

LoadResourceFile( ) para compilar arquivos. A função permite que o programador escolha qual “resource file” deseja compilar e qual “UI database” deseja usar.

2.3.4. Recursos da Linguagem GISDK: Os recursos da linguagem GISDK correspondem aos blocos de construção de add- ins e de aplicações. Podem ser de cinco tipos: macros, caixa de diálogos, caixa de ferramentas, barra de ferramenta e menus. 2.3.4.1. Macros

Macros funcionam como subrotinas que são executadas quando um usuário escolhe um item do menu ou clica em algum ícone da barra de ferramentas. Uma macro possui um nome, argumentos opcionais e uma série de condições que estabelecem sua função. Sua estrutura básica pode ser escrita como:

Macro "Nome_Macro" {(argumento1, argumento2, ...)}

<condições>

endMacro

O nome das macros podem conter qualquer combinação de letras, números e espaços. Caso seja requerido pelo programador, elas podem retornar um valor, através da função Return( ).

2.3.4.2. Caixa de Diálogos: Este recurso define a aparência e a operação de uma caixa de diálogo, como

normalmente são encontradas nas aplicações Windows. Uma caixa de diálogos contém controles através dos quais os usuários podem interagir com o programa, e macros que indicam a lógica que deve ser executada.

Caixas de diálogos são mostradas na tela quando são selecionadas pelo usuário a partir de um item do menu de opções ou de um botão da barra de ferramentas.

Page 20: 2002-transcad aprende

20

As caixas de diálogos paralisam qualquer aplicação: enquanto elas estão visíveis, o usuário não pode clicar em menus, mapas, dataviews, etc. Elas podem ser removidas da tela quando é executada a função Return(). Estas geralmente respondem quando o usuário seleciona os botões com opção “OK” ou “CANCELAR”.

A estrutura de uma caixa de diálogos é apresentada a seguir:

Dbox "Dbox_Nome" {(argumento1, argumento2...)}

{{{{posição_horizontal} , posição_vertical} , largura} , altura}

{opções}

<itens da caixa de diálogos>

endDbox 2.3.4.3. Caixas e Barras de Ferramentas: Caixas de ferramentas são caixas de diálogos que permanecem na tela enquanto o

usuário interage com mapas, menus, dataviews, etc. Uma caixa de ferramentas, diferentemente da caixa de diálogos, não paralisa a aplicação.

A estrutura de uma caixa de ferramentas é apresentada a seguir:

Dbox "Dbox_Nome" {(argumento1, argumento2...)}

{{{{posição_horizontal} , posição_vertical} , largura} , altura}

{opções}

ToolBox

<itens da caixa de diálogos>

endDbox

As barras de ferramentas possuem formato horizontal e se localizam sob a barra do menu contendo os itens da caixa de diálogos. Somente uma barra de ferramentas pode ser utilizada por vez, mas diversas barras de ferramentas podem ser ativadas e desativadas alternadamente, através das funções ShowDbox() e HideDbox().

A definição de uma barra de ferramentas é:

Toolbar "toolbar nome" {(argumento1, argumento2...)}

<itens da caixa de diálogos>

endToolbar

2.3.4.4. Menus:

Page 21: 2002-transcad aprende

21

O recurso “Menu” é utilizado para definir menus ou sub-menus em uma aplicação. O formato é dado por:

Menu "menu nome" {opções}

<itens do menu>

endMenu 2.3.5. Elementos da Linguagem GISDK: Quando um usuário escolhe um item de um menu, ou seleciona um botão de uma caixa de diálogos, estes devem desenvolver alguma ação. Estas ações são descritas usando uma seqüência de declarações que devem satisfazer determinadas condições. Estas condições podem ser estabelecidas por constantes, variáveis, operadores, etc. 2.3.5.1. Constantes: As constantes na linguagem GISDK podem ser números (inteiros e reais), “strings”, ou constantes booleanas (Verdadeiro/Falso).

2.3.5.2. Variáveis: Na linguagem GISDK não é necessário que as variáveis sejam declaradas antes de

serem utilizadas. O nome das variáveis deve começar com uma letra, porém pode conter letras, números e o símbolo sublinhado (“underscore”).

As variáveis podem ser do tipo: - Inteiro (valores entre –2.147.482.648 e 2.147.482.647) - Real (valores entre -3.4E-38 e -3.4E+38) - String (máximo de 512 caracteres) - Array (qualquer número de elementos de tipos diferentes) - Compound (variáveis compostas) - Boolean (Verdadeiro/Falso) - Null

2.3.5.3. Operadores: § Operadores Aritméticos: Os operadores aritméticos combinam expressões de números inteiros e reais. São

quatro operadores: + → adição - → subtração, negação

Page 22: 2002-transcad aprende

22

* → multiplicação / → divisão § Operadores Lógicos: Os operadores lógicos realizam operações booleanas e retornam valores booleanos

(Verdadeiro ou Falso). São eles: & (ou AND) → conjunção | (ou OR) → disjunção ! (ou NOT) → negação lógica § Operadores Relacionais: Os operadores relacionais retornam valores booleanos (Verdadeiro ou Falso). São eles: = (ou eq) → igualdade <> (ou ne) → desigualdade > (ou gt) → maior que < (ou lt) → menor que >= (ou ge) → maior que ou igual a <= (ou le) → menor que ou igual a contains → contém a seqüência de caracteres.

2.3.6. Exemplos desenvolvidos

Nesta etapa do projeto, visando uma melhor familiarização com a linguagem, foram criados exemplos de programas utilizando a linguagem de desenvolvimento GISDK.

Para os programas elaborados, foi utilizado como exemplo o mapa da cidade de Nova Iorque, disponível no ambiente TransCAD.

Page 23: 2002-transcad aprende

23

Figura 13– Mapa da cidade de Nova Iorque

Ø 1º Programa:

. Neste primeiro programa elaborado em GISDK, foi criado um atalho para abrir o mapa em questão. Deste modo, ao executar a macro “ABRIR” (ver programa a seguir), o mapa desejado é aberto. Outras macros úteis foram também construídas neste programa, as quais, quando executadas, fecham o mapa em questão ou efetuam o término do TransCAD.

//******************************************************************** //Objetivo Abrir o mapa "nycity" a ser utilizado Macro "ABRIR" SetMapUnits("Miles") SetSearchPath("tutorial\\") // Abre o mapa a ser utilizado OpenMap("c:\\Mariana\\TransCad\\Gisdk\\nycity.map",) // Muda o tamanho do mapa mostrado SetWindowSizePixels(, 600, 450) //Largura - Comprimento // Muda a camada para "Streets" SetLayer("Streets") EndMacro //******************************************************************** //Objetivo: O macro FECHAR é utilizado para fechar mapas (File-Close) Macro "FECHAR"

Page 24: 2002-transcad aprende

24

Name=GetMapNames() For i = 1 to name.length do CloseMap(name[i]) End Return(0) // Qualquer valor não nulo impede que o mapa seja fechado endMacro //******************************************************************** // Objetivo: Sair do TransCad Macro "SAIR" Exit() EndMacro

Ø 2º Programa:

- Objetivo: Mostrar na tela do programa, os bairros da cidade de Nova Iorque com mais de 60.000 habitantes, verificando se o usuário deseja imprimi- los.

// nome do arquivo: prog2.rsc // mapa utilizado: c:\mariana\transcad\gisdk\nycity.map // layer ativa: 5-Digit Zip // Objetivo: Mostra na tela os bairros com mais de 60.000 habitantes, // verificando se o usuário deseja imprimí-los. // MACRO Macro "Imprimir maiores bairros" curr_map = GetMap() lyr = GetLayer() // A variável bairro_id recebe os dados da primeira linha do dataview do // layer em uso, onde a população foi organizada em ordem decrescente em // relação ao número de habitantes. bairro_id = GetFirstRecord(lyr + "|", {{"Population","Descending"}}) while bairro_id <> null do pop = lyr.Population If pop > 60000 then do // A variável bairro_scope encontra no mapa a área correspondente ao bairro // em questão (armazenado pela variável bairro_id. bairro_scope = GetRecordScope(bairro_id) // Seta a área em questão do mapa, e redesenha-o. SetMapScope(curr_map, bairro_scope) RedrawMap() name = lyr.Name Answer = RunDbox("Imprimir", name) If Answer = "Sim" then PrintMap()

Page 25: 2002-transcad aprende

25

end // Encontra o próximo estado. Caso tenha terminado, a variável bairro_id // recebe "null" bairro_id = GetNextRecord(lyr + "|", bairro_id, {{"Population","Descending"}}) end endMacro // CAIXA DE DIÁLOGOS dBox "Imprimir" (bairro_name) title: "Imprimir Bairro" //Prepara o texto a ser mostrado init do str = "Você deseja imprimir o bairro " + bairro_name +"?" enditem text 1,1,40,3 // localização e tamanho do texto na caixa de diálogos variable: str // A variável str contém um texto a ser mostrado align: center framed // Coloca uma margem ao redor do texto // Botão "Sim". Deve ser clicado para imprimir o mapa do bairro // correspondente button "Sim" 1, 5, 9 // A localização e o tamanho do botão do Return("Sim") enditem // Botão "Não". Deve ser clicado para não imprimir o mapa do bairro // correspondente button "Não" 31, 5, 9 do Return("Nao") enditem endDbox

- Resultado: Ao executar o programa, o TransCad mostra na tela, um a um, os bairros do

mapa que contenham mais de 60.000 habitantes, e pergunta ao usuário se deseja imprimir cada um dos bairros.

Page 26: 2002-transcad aprende

26

Figura 14 – Resultado do Programa: Imprimir bairros com mais de 60.000 habitantes?

Ø 3º Programa: - Objetivo: Calcular a distância retilínea entre dois pontos quaisquer de um mapa. Para

tanto, ao executar o programa, o usuário deve clicar nos dois pontos desejados. //************************************************************* // Nome do arquivo: distancia.rsc //Objetivo: Calcular a distância entre 2 pontos quaisquer //************************************************************* dbox "DISTANCIA" toolbox init do SetMapUnits("Kilometers") m1 = GetMapUnits("Plural") LayerPt="Localidades" setLayer(LayerPt) lyr = GetLayer() ShowMessage("Clique nos 2 pontos desejados: ") // Os nºs. indicam a largura de cada uma das 4 divisões da barra de status SetStatusBar({30, 30, 20, 20}) SetStatus(1, lyr + "-" + m1,) Enditem //************************************************ Tool 25, 2 Icons: "bmp\\help_m.bmp" Cursor: "bmp\\stop2_2.bmp"do

Page 27: 2002-transcad aprende

27

SetStatus(2, "Calculo da distância - Ponto 1",) // A variável C1 armazena a cordenada do mapa digitada pelo usuário C1 = ClickCoord() //Cria-se uma seleção de nome "Origem", com os pontos distantes // até 100Km da variável C1 N = SelectbyCoord("Origem","Several",C1,100) // A variável PONT armazena o primeiro dado da camada de pontos // da seleção "Origem" criada PONT=GetFirstRecord(LayerPt + "|Origem",) ShowMessage("1º Registro: - ID= " + PONT) //A variável ID1 armazena os dados (latitude, longitude e nome //referentes ao primeiro registro. ID1 = GetRecordValues(LayerPt,PONT,{"Longitude","Latitude","Name"}) //[1º elemento] é a posição da variável armazenada (1=Longitude, 2=Latitude //3=Name, [2º elemento] se for [1] corresponde ao nome do campo // se for [2] corresponde ao registro do campo showmessage (ID1[3][2]) //Cood espera os resultados da latitude e longitude C1= Coord(ID1[1][2],ID1[2][2]) // [1][2]=longitude, [2][2]=latitude if N>1 then showmessage(string(N)) showmessage("Clique no 2o ponto desejado:") SetStatus(2, "Distância entre capitais-pto 2",) C2 = ClickCoord() setview(LayerPt) N = selectbycoord("Destino","Several",C2,100) PONT=getfirstrecord(LayerPt+"|Destino",) ID2 = getrecordvalues(LayerPt,PONT,{"Longitude","Latitude","Name"}) SetStatus(4, ID2[3][2],) SetStatus(2, ID1[3][2]+" - "+ID2[3][2],) //coord espera os argumentos em Long, Lat C2= Coord(ID2[1][2],ID2[2][2]) // [1][2]=longitude, [2][2]=latitude if N>1 then showmessage(string(N)) dist=getdistance (C1,C2) //Calcula a distância entre os pontos dist=Format(dist,",*.0") //Distância em string showmessage("A distância entre " + ID1[3][2] + " e " + ID2[3][2] + " é : " + dist + m1) enditem //tool close do return() enditem enddbox

- Resultado: O programa informa ao usuário a distância entre os dois pontos desejados.

Page 28: 2002-transcad aprende

28

Ø 4º Programa: - Objetivo: Mostrar todas as informações referentes aos mapas abertos no TransCAD. //************************************************************** // Nome do arquivo: informações.rsc // Objetivo: Mostrar as informações sobre os mapas abertos. // Executar Dialog Box: "INFORMACOES" //************************************************************** dbox "INFORMACOES" title: "Informações sobre os mapas" init do mapas_disponiveis = GetWindows("map") mapa_escolhido = 1 camada_escolhida = 1 //Verifica se há mapas abertos no programa if mapas_disponiveis = null then do ShowMessage("Este comando só funciona se algum mapa estiver aberto") Return() end //Pega o nome de todas as camadas for k = 1 to ArrayLength(mapas_disponiveis[1]) do camadas = GetMapLayers(mapas_disponiveis[1][k], "all") lista = lista + {camadas[1]} end RunMacro("MOSTRAR DADOS") Enditem Frame "Dados do Mapa" 1.5, .5, 56, 10.5 Prompt: "Dados do Mapa" Text "Mapa..." 3, 1.5 Scroll List "Mapas disponíveis" 3, 2.7, 25, 8 List: mapas_disponiveis[1] Variable: mapa_escolhido do camada_escolhida = 1 RunMacro("MOSTRAR DADOS") Enditem Text "Camadas..." 31, 1.5 Scroll List "Camadas Ativas" 31, 2.7, 25, 8 List: lista[mapa_escolhido] Variable: camada_escolhida do RunMacro("MOSTRAR DADOS") enditem Button "Fechar" 60, 1, 10 do Return() EndItem Frame "Dados da Camada" 1.5, 11.5, 56, 9.3 Prompt: "Dados da Camada" Text"Nome..." 13, 12.5, 19 Prompt: "Nome:" Variable: lista[mapa_escolhido][camada_escolhida] Framed Text"Tipo..." 44, same, 12 Prompt: "Tipo:" Variable: tipo_camada Framed Text"Diretório..." 13, 14, 43 Prompt: "Diretório:" Variable: diretorio Framed Text"Arquivo..." 13, 15.5, 19 Prompt: "Arquivo:" Variable: nome_arquivo1 Framed

Page 29: 2002-transcad aprende

29

Text"Tamanho..." 44, same, 12 Prompt: "Tamanho:" Variable: i2s(filestat[6]) + " bytes" Framed Text"Criado em..." 13, 17, 19 Prompt: "Criado em:" Variable: filestat[7] Framed Text"Campos..." 44, same, 12 Prompt: "Campos:" Variable: recs Framed Text"Mapas..." 13, 18.5, 43, 2 Prompt: "Arquivo:" Variable: mapas Framed Macro "MOSTRAR DADOS" do camadas = GetLayerInfo(lista[mapa_escolhido][camada_escolhida]) tmp = SplitPath(camadas[10]) diretorio = tmp[1] + tmp[2] nome_arquivo1 = tmp[3] + tmp[4] // verificar se a camada está em outros mapas mapas = null for i = 1 to mapas_disponiveis[1].length do if ArrayPosition(lista[i], {lista[mapa_escolhido][camada_escolhida]}, ) > 0 then do mapas = mapas + mapas_disponiveis[1][i] + ", " end end mapas = Left(mapas, Len(mapas) - 2) tipo_camada = GetLayerType(lista[mapa_escolhido][camada_escolhida]) filestat = GetFileInfo(camadas[10]) recs = GetRecordCount(lista[mapa_escolhido][camada_escolhida], ) enditem endDBox

- Resultado: É aberta uma caixa de diálogos, informando ao usuário as informações

referentes aos mapas em uso, conforme mostra a figura 15.

Figura 15 – Informações sobre os mapas em uso

Page 30: 2002-transcad aprende

30

2.4 Construção de Sistemas de Apoio à Decisão

Esta etapa do projeto teve como objetivo realizar um interfaceamento entre algoritmos de localização e roteamento já criados pelo orientador e o TransCAD. Para tanto, foram estudadas maneiras para que este interfaceamento pudesse ser realizado.

Estudando a linguagem GISDK, constatou-se que a função RunProgram(), ao ser chamada, executa programas de qualquer tipo, e espera que a execução do programa seja finalizada.

O interfaceamento entre o algoritmo e o TransCAD foi realizado via criação e leitura de arquivos texto (.TXT).

2.4.1. Os Algoritmos – “Caixa Preta” Os algoritmos criados pelo orientador foram considerados como uma caixa preta, ou

seja, seu conteúdo e informações não foram de importância no desenvolvimento do projeto. As informações de importância para que o interfaceamento fosse realizado foram os dados de entrada e de saída do algoritmo, ou seja, quais dados eram necessários serem fornecidos para que o programa fosse executado, e que dados ele retornaria ao TransCAD.

O problema foi resumido então em fornecer os dados necessários ao programa, executá-lo, através da função RunProgram(), e interpretar os dados fornecidos por ele.

2.4.2. Problemas de Localização Para os problemas de localização (capacitado e não capacitado), os algoritmos exigem

como entrada a matriz de custos (geralmente, a matriz de distâncias), armazenada no arquivo matriz.txt, e um arquivo de dados (dados.txt) do mapa a ser utilizado, e retornam, como saída, um arquivo texto result.txt informando os “c lusters” encontrados.

Para a determinação da matriz de custos foi utilizada a função própria do TransCAD, acessada a partir do menu de opções Routing/Logistics – Cost Matrix. Para a criação desta matriz, foi necessário que, antes, fosse criada uma rede para o mapa em questão (Networks/Paths – Create). O arquivo de dados foi também criado pelo TransCAD, o qual utilizou os dados dos mapas já existentes. Este arquivo contém: o número de nós associados à rede, o número de “clusters” a serem formados, e a capacidade e a demanda de cada nó. O arquivo result.txt apresenta uma linha para cada “cluster” encontrado. Cada linha contém o número de identificação (ID) do “cluster”, o número de nós associados àquele “cluster”, e os números de identificação destes nós.

Exemplos de arquivos de entrada e saída podem ser encontrados a seguir:

Page 31: 2002-transcad aprende

31

Figura 16 – Dados de Entrada: Matriz de distâncias

Figura 17 – Dados de Entrada: Arquivo dados.txt

Figura 18 – Dados de Saída – “Clusters”

A distância entre os nós 1 e 2

é de 13.32 Km.

Cluster nº 5 – Mediana corresponde ao nó nº 700, com 5

nós associados, sendo eles os nós 701, 702, 703, 704, 705.

Número de nós associados

Número de “clusters” a serem formados

Demanda do nó

Capacidade do nó

Page 32: 2002-transcad aprende

32

Foram fornecidos pelo orientador dois programas: um deles para a solução de problema de localização não capacitado (pmed.exe), e o outro para a solução de problema capacitado (pmedcap.exe). Ambos exigiam como entrada o arquivo de dados e a matriz de custos, porém para o caso não capacitado, não era necessário que o arquivo de dados contivesse a capacidade e a demanda dos nós.

Assim, foi criada, utilizando as funções da linguagem GISDK, uma macro responsável por executar os programas criados pelo orientador e “interpretar” os dados fornecidos por eles.

/* Objetivo: Executar o programa de solução de problemas de localização não capacitado e “interpretar” os dados fornecidos por ele. Para a solução de problemas capacitados, substituir o arquivo Pmed.exe pelo arquivo PmedCAP.exe. O arquivo "c:\\Bolsistas\\Fapesp\\Mariana\\matriz.txt e c:\\Bolsistas\\Fapesp\\Mariana\\dados.txt armazenam os dados de entrada do programa. */ Macro "PMEDIANAS" ShowMessage ("Certifique-se de que os dados de entrada do programa estão armazenados no arquivo matriz.txt e dados.txt") //Para o problema capacitado, utilizar o arquivo Pmedcap.exe status = RunProgram("c:\\Bolsistas\\Fapesp\\Mariana\\Pmed.exe", ) //Lê a network já criada net_h = ReadNetwork("c:\\Bolsistas\\Fapesp\\Mariana\\network.net") layer=SetLayer("Endpoints") arquivolinha = OpenFile("c:\\Bolsistas\\Fapesp\\Mariana\\result.txt", "r") dim linha[100] nlinha=0 While !FileAtEOF(arquivolinha) do Nlinha=1+nlinha nlinha_s=IntToString(nlinha) linha[nlinha]=ReadLine(arquivolinha) end ShowMessage ("O número total de clusters é: " +nlinha_s) CloseFile(arquivolinha) arquivolinha=OpenFile("c:\\Bolsistas\\Fapesp\\Mariana\\ result.txt", "r") map_name=GetMap() icon=45 cor_red=1000 cor_green=3528 cor_blue=7520 dim pieces [nlinha] teste=0 var1=0 for i=1 to nlinha do linha[i]=ReadLine(arquivolinha) pieces[i] = ParseString(linha[i], " ")

Page 33: 2002-transcad aprende

33

//Medianas medianas = Subarray(pieces[i],1,1) mediana_i=S2I(medianas[1]) teste=1+teste teste2=String(teste) selec_med="Mediana_" + teste2 SelectByIDs(selec_med, "more", {mediana_i}) //Número de nós n_nos= SubArray(pieces[i],2,1) n_nos2=S2I(n_nos[1]) //Nós Associados nos= SubArray(pieces[i],3,n_nos2) var1=var1+1 var2=String(var1) selec_nos="Nós_" + var2 selec_cluster= "Cluster_" + var2 dim nos_int [n_nos2+1] for j=1 to n_nos2 do nos_i=S2I(nos[j]) SelectByIDs(selec_nos, "more", {nos_i}) SelectByIDs(selec_cluster, "more", {nos_i,mediana_i}) cor_red=cor_red+50000 cor_green=cor_green+1000 cor_blue=cor_blue+3000 nos_int[1]=mediana_i nos_int[j+1]=S2I(nos[j]) end SetDisplayStatus(selec_nos, "Active") SetIcon(selec_nos, "Font Character", "Caliper Cartographic|Bold|9", icon) SetIconColor(selec_nos, ColorRGB(cor_red,cor_green,cor_blue)) SetDisplayStatus(selec_med, "Active") SetIcon(selec_med, "Font Character", "Caliper Cartographic|Bold|9", 40) SetIconColor(selec_med, ColorRGB(cor_red,cor_green,cor_blue)) end EndMacro

2.4.3. Problemas de Roteamento Considerou-se como problemas de roteamento a determinação de “clusters” referentes a

cada um dos veículos disponíveis (atendendo suas capacidades) e a determinação de trajetos para cada um dos “clusters”, no qual o veículo parte de um nó de origem, visita todos os demais nós do seu “cluster” e retorna ao nó de origem.

Assim, para a solução de problemas de roteamento foi utilizado, primeiramente, o programa de localização capacitada (pmedcap.exe) e, em seguida, por meio da linguagem GISDK, utilizou-se a função TSP, que resolve o “Problema do Caixeiro Viajante”, para fornecer as rotas e as distâncias a serem percorridas em cada um dos “clusters”.

Page 34: 2002-transcad aprende

34

Portanto, foram acrescentadas as seguintes linhas no algoritmo GISDK de solução de problemas de localização:

// Problemas de Roteamento tsp = TSP(net_h, nos_int, 1) ShowMessage("A distância total percorrida na viagem " +String(i) + " é: " + String(tsp[1]) )

2.4.4. Construção de um Protótipo de Sistema de Apoio à Decisão Para a criação de um protótipo de sistema de apoio à decisão, foi criada uma “Custom

Application”, a qual permite uma fácil interação entre o usuário e o programa. Nesta “Custom Application” permite-se que o usuário escolha os mapas com os quais deseja trabalhar.

A figura 19 permite visualizar a interface principal da aplicação.

Figura 19 –Interface da Aplicação

Os menus permitem que o usuário realize funções como abrir, fechar e obter informações

sobre os mapas, conforme ilustra a figura 20.

Page 35: 2002-transcad aprende

35

Figura 20 – Menus de opções da aplicação

A seguir, encontra-se o código fonte do protótipo desenvolvido.

/* ****************************************************************** Projeto FAPESP - Interface - Custom Application Nome: Mariana Quissak Bartelega Peixoto Arquivo: ca_2.rsc Objetivo: Interface para a solução de problemas de p-medianas, Localização e roteamento, capacitado e não capacitado. ******************************************************************* */

Macro "INTERFACE" var1=RunDbox("INICIO") SetDefaults({{"Menu", "Menu Principal"}}) EndMacro

Menu "Menu Principal" MenuItem "Arquivos" text: "Arquivo" Menu "Arquivos" MenuItem "Mapa" text: "Mapa" Menu "Mapas" MenuItem "Opções" text: "Opções" Menu "Opcao" MenuItem "Ferramentas" text: "Ferramentas" Menu "Ferramentas"

EndMenu

Menu "Arquivos" Menuitem "Abrir Mapa" Macro "abre um mapa" Menuitem "Fechar Mapa" Macro "fecha um mapa" Separator Menuitem "Sair" do Exit() enditem

EndMenu

Menu "Mapas" Menuitem "Número de Mapas" Macro "contar mapas" Menuitem "Lista de Mapas" Dbox "lista de mapas" Menuitem "Propriedades" Dbox "INFORMACOES"

EndMenu

Menu "Opcao" MenuItem "P-Medianas não Capacitado" Macro "FUNCAO1" MenuItem "P-Medianas Capacitado" Macro "FUNCAO2"

Page 36: 2002-transcad aprende

36

Separator MenuItem "Localização" Dbox "AVISO" MenuItem "Localização Capacitado" Dbox "AVISO" Separator MenuItem "Roteamento não Capacitado" Macro "FUNCAO3" MenuItem "Roteamento Capacitado" Macro "FUNCAO4"

EndMenu

Menu "Ferramentas" MenuItem "Mostrar barra de ferramentas" Dbox "TOOLBOX" MenuItem "Recursos GISDK" Macro "Dbox Sampler"

EndMenu

Macro "FUNCAO1" RunMacro("PMEDIANAS",1,1)

EndMacro

Macro "FUNCAO2" RunMacro("PMEDIANAS",2,1)

EndMacro

Macro "FUNCAO3" RunMacro("PMEDIANAS",1,2)

EndMacro

Macro "FUNCAO4" RunMacro("PMEDIANAS",2,2)

EndMacro

Macro "abre um mapa" On escape do Return() end fnm = ChooseFile({{"Mapas", "*.map"}}, "Abrindo mapa", ) on error do ShowMessage("Impossível abrir o mapa " + fnm + ".") Return()

end

map = OpenMap(fnm, {{"Menu", "Menu Principal"}}) on error default

endMacro

Macro "fecha um mapa" typ = GetWindowType() if typ <> "Map" then do ShowMessage("Você não pode fechar essa janela!") Return() end CloseMap()

EndMacro

Macro "contar mapas" map_names = GetMapNames() n_maps = ArrayLength(map_names) output = "Existem " + string(n_maps) + " mapas abertos no momento." ShowMessage(output)

EndMacro

Dbox "lista de mapas" title: "Mapas abertos:" init do map_names = GetMapNames() map_idx = 1 if map_names = null then do ShowMessage("Não existe nenhum mapa aberto no momento!") Return() end

enditem scroll list 10, 1, 24, 8 prompt: "Mapas" list: map_names variable: map_idx button "OK" 36, 1, 9 do

Page 37: 2002-transcad aprende

37

SetMap(map_names[map_idx]) Return() enditem button "Cancelar" 36, 3, 9 do Return() enditem button "Fechar Mapa" 36, 5, 12 do CloseMap(map_names[map_idx]) map_names = GetMapNames() map_idx = 1 enditem

endDbox

dBox "INICIO" title: "Custom Application - Mariana" init do str = "Custom Application elaborada por *Mariana*" enditem text 1, 1, 40, 3 variable: str align: center framed button "Continuar" 20, 5 , 14 do Return() enditem

endDbox

dBox "TOOLBOX" right,center,27,17 title: "Opções" Toolbox Button "Abrir Mapa" 2, 1, 23 do RunMacro("ABRIR") enditem button "P-Medianas não Capacitado" 2, 3, 23 do RunMacro("PMEDIANAS",1,1) enditem button "P-Medianas Capacitado" 2, 5, 23 do RunMacro("PMEDIANAS",2,1) enditem button "Localização" 2, 7, 23 do RunDbox("AVISO") enditem button "Localização Capacitado" 2, 9, 23 do RunDbox("AVISO") enditem button "Roteamento não Capacitado" 2, 11, 23 do RunMacro("PMEDIANAS",1,2) enditem button "Roteamento Capacitado" 2, 13, 23 do RunMacro("PMEDIANAS",2,2) enditem button "X" 23, 15, 1 do Return() enditem

endDbox

Macro "ABRIR" SetMapUnits("Miles") SetSearchPath("tutorial\\") // Abre o mapa a ser utilizado OpenMap("c:\\Bolsistas\\Fapesp\\Mariana\\mapa.map",) // Muda o tamanho do mapa mostrado SetWindowSizePixels(, 600, 450) //Largura - Comprimento

EndMacro

Macro "PMEDIANAS" (argumento1, argumento2) /* O arquivo "c:\\Bolsistas\\Fapesp\\Mariana\\matriz.txt e

c:\\Bolsistas\\Fapesp\\Mariana\\dados.txt armazenam os dados de entrada do programa.

*/

Page 38: 2002-transcad aprende

38

ShowMessage ("Certifique-se de que os dados de entrada do programa

estão armazenados no arquivo matriz.txt e dados.txt") if argumento1=1 then do ShowMessage("Problema não capacitado") status = RunProgram("c:\\Bolsistas\\Fapesp\\Mariana\\Pmed.exe",

) end if argumento1=2 then do ShowMessage("Problema Capacitado") status = RunProgram("c:\\Bolsistas\\Fapesp\\Mariana\\Pmedcap.exe",

) end //Lê a network já criada net_h = ReadNetwork("c:\\Bolsistas\\Fapesp\\Mariana\\network.net") ShowMessage("Net Lida!") ShowMessage("Verificar se o arquivo result.txt está na pasta

correta") Layer=SetLayer("Endpoints")

arquivolinha = OpenFile("c:\\Bolsistas\\Fapesp\\Mariana\\ localizacao.txt", "r")

dim linha[100] nlinha=0 While !FileAtEOF(arquivolinha) do nlinha=1+nlinha nlinha_s=IntToString(nlinha) linha[nlinha]=ReadLine(arquivolinha) end ShowMessage ("O número total de clusters é: " +nlinha_s) CloseFile(arquivolinha) Arquivolinha = OpenFile("c:\\Bolsistas\\Fapesp\\Mariana\\ localizacao.txt", "r") map_name=GetMap() icon=45 cor_red=1000 cor_green=3528 cor_blue=7520 dim pieces [nlinha] teste=0 var1=0 for i=1 to nlinha do linha[i]=ReadLine(arquivolinha) pieces[i] = ParseString(linha[i], " ") //Medianas medianas = Subarray(pieces[i],1,1) mediana_i=S2I(medianas[1]) teste=1+teste teste2=String(teste) selec_med="Mediana_" + teste2 SelectByIDs(selec_med, "more", {mediana_i}) //Número de nós n_nos= SubArray(pieces[i],2,1) n_nos2=S2I(n_nos[1]) //Nós Associados nos= SubArray(pieces[i],3,n_nos2) var1=var1+1 var2=String(var1) selec_nos="Nós_" + var2

Page 39: 2002-transcad aprende

39

selec_cluster= "Cluster_" + var2 dim nos_int [n_nos2+1] for j=1 to n_nos2 do nos_i=S2I(nos[j]) SelectByIDs(selec_nos, "more", {nos_i}) SelectByIDs(selec_cluster, "more", {nos_i,mediana_i}) cor_red=cor_red+50000 cor_green=cor_green+1000 cor_blue=cor_blue+3000 nos_int[1]=mediana_i nos_int[j+1]=S2I(nos[j]) end SetDisplayStatus(selec_nos, "Active") SetIcon(selec_nos, "Font Character", "Caliper Cartographic|Bold|9", icon) SetIconColor(selec_nos, ColorRGB(cor_red,cor_green,cor_blue)) SetDisplayStatus(selec_med, "Active") SetIcon(selec_med, "Font Character", "Caliper Cartographic|Bold|9", 40) SetIconColor(selec_med, ColorRGB(cor_red,cor_green,cor_blue))

//Problemas de Roteamento if argumento2=2 then do tsp = TSP(net_h, nos_int, 1) ShowMessage("A distância total percorrida na viagem " +String(i) + " é: " + String(tsp[1]) )

end end

endMacro

Dbox "AVISO" Title: "AVISO" Toolbox Init do texto = "Este programa ainda está em construção." Enditem Text 1, 1, 40, 3 variable: texto align: center framed button "OK" 20, 5, 5 do Return ( ) enditem

endDbox

Dbox "INFORMACOES" title: "Informações sobre os mapas" init do mapas_disponiveis = GetWindows("map") mapa_escolhido = 1 camada_escolhida = 1 //Verifica se há mapas abertos no programa if mapas_disponiveis = null then do ShowMessage("Este comando só funciona se algum mapa estiver aberto") Return() end //Pega o nome de todas as camadas for k = 1 to ArrayLength(mapas_disponiveis[1]) do camadas = GetMapLayers(mapas_disponiveis[1][k], "all") lista = lista + {camadas[1]} end RunMacro("MOSTRAR DADOS")

Page 40: 2002-transcad aprende

40

Enditem Frame "Dados do Mapa" 1.5, .5, 56, 10.5 Prompt: "Dados do Mapa" Text "Mapa..." 3, 1.5 Scroll List "Mapas disponíveis" 3, 2.7, 25, 8 List: mapas_disponiveis[1] Variable: mapa_escolhido do camada_escolhida = 1 RunMacro("MOSTRAR DADOS") Enditem Text "Camadas..." 31, 1.5 Scroll List "Camadas Ativas" 31, 2.7, 25, 8 List: lista[mapa_escolhido] Variable: camada_escolhida do RunMacro("MOSTRAR DADOS") Enditem Button "Fechar" 60, 1, 10 Do Return() EndItem Frame "Dados da Camada" 1.5, 11.5, 56, 9.3 Prompt: "Dados da Camada" Text"Nome..." 13, 12.5, 19 Prompt: "Nome:" Variable: lista[mapa_escolhido][camada_escolhida] Framed Text"Tipo..." 44, same, 12 Prompt: "Tipo:" Variable: tipo_camada Framed Text"Diretório..." 13, 14, 43 Prompt: "Diretório:" Variable: diretorio Framed Text"Arquivo..." 13, 15.5, 19 Prompt: "Arquivo:" Variable: nome_arquivo1 Framed Text"Tamanho..." 44, same, 12 Prompt: "Tamanho:" Variable: i2s(filestat[6]) + " bytes" Framed Text"Criado em..." 13, 17, 19 Prompt: "Criado em:" Variable: filestat[7] Framed Text"Campos..." 44, same, 12 Prompt: "Campos:" Variable: recs Framed Text"Mapas..." 13, 18.5, 43, 2 Prompt: "Arquivo:" Variable: mapas Framed

Macro "MOSTRAR DADOS" do camadas = GetLayerInfo(lista[mapa_escolhido][camada_escolhida]) tmp = SplitPath(camadas[10]) diretorio = tmp[1] + tmp[2] nome_arquivo1 = tmp[3] + tmp[4] // verificar se a camada está em outros mapas mapas = null for i = 1 to mapas_disponiveis[1].length do if ArrayPosition(lista[i], {lista[mapa_escolhido][camada_escolhida]}, ) > 0 then do mapas = mapas + mapas_disponiveis[1][i] + ", " end end mapas = Left(mapas, Len(mapas) - 2) tipo_camada = GetLayerType(lista[mapa_escolhido][camada_escolhida]) Filestat = GetFileInfo(camadas[10]) recs = GetRecordCount(lista[mapa_escolhido][camada_escolhida], ) Enditem

EndDBox

2.4.5. Aplicação

Page 41: 2002-transcad aprende

41

O programa foi testado para diversos mapas de cidades pequenas, porém optou-se por apresentar neste relatório os resultados obtidos utilizando o mapa da cidade de Ribeirão Preto (figura 21), uma vez que este apresenta uma rede de médio porte (cerca de 800 nós), para os problemas não-capacitados. Os dados de entrada do programa foram gerados pelo TransCAD.

Figura 21 – Mapa da cidade de Ribeirão Preto”

Executando as funções da aplicação desenvolvida para a solução dos problemas de

localização não-capacitado, obteve-se os resultados mostrados pela figura 22.

Page 42: 2002-transcad aprende

42

Figura 22 – Solução do problema de localização não capacitado

A figura 22 mostra a solução de um problema de localização de 4 medianas. Os quatro

“clusters” encontrados estão representados na figura em cores distintas, sendo o nó mediana de cada “cluster” representado por um triângulo.

Para efeito de comparação, apresenta-se a seguir (figura 23), a solução obtida executando o algoritmo próprio do TransCAD.

Figura 23 – Solução do problema de localização não capacitado pelo TransCAD

Page 43: 2002-transcad aprende

43

Os custos das soluções apresentadas nas figuras 22 e 23 são mostradas na tabela a seguir.

Algoritmo Custo da Solução

TransCAD 368.24

P-Medianas (Senne e Lorena, 2000) 343.72

Para o problema não-capacitado de roteamento de veículos (ou seja, problemas de roteamento que cons ideram a capacidade dos veículos como ilimitada), o programa forneceu a distância total a ser percorrida por um veículo, saindo do ponto correspondente à mediana, passando por todos os nós associados e retornando à ela. As rotas obtidas encontram-se na figura 24. As figuras 25, 26, 27 e 28 mostram de forma detalhada os resultados obtidos. É fornecido também pelo programa, um arquivo .TXT informando a ordem das ruas pela qual o veículo deve viajar. Apresenta-se, a seguir, um exemplo de tal arquivo, referente ao primeiro cluster.

Figura 24 – Solução do problema de roteamento não capacitado

Page 44: 2002-transcad aprende

44

Figura 25 – Roteamento não capacitado – CLUSTER 1

Page 45: 2002-transcad aprende

45

Figura 26 – Roteamento não capacitado – CLUSTER 2

Figura 27 – Roteamento não capacitado – CLUSTER 3

Page 46: 2002-transcad aprende

46

Figura 28 – Roteamento não capacitado – CLUSTER 4

Para os problemas capacitados, foi utilizado o mapa de algumas rodovias brasileiras, por apresentar uma rede de pequeno porte (cerca de 100 nós). Os resultados obtidos são mostrados nas figuras 29, 30, 31 e 32.

Page 47: 2002-transcad aprende

47

Figura 29 – Solução do problema de localização capacitado

De forma análoga à solução do problema de roteamento não capacitado, foram obtidas as rotas a serem percorridas por um veículo, saindo do ponto correspondente à mediana, e visitando todos os nós associados ao cluster, e retornando à ela.

Page 48: 2002-transcad aprende

48

Figura 30 – Solução do problema de roteamento capacitado

Page 49: 2002-transcad aprende

49

Figura 31 – Roteamento capacitado – CLUSTER 1

Page 50: 2002-transcad aprende

50

Figura 32 – Roteamento capacitado – CLUSTER 2

Para efeito de comparação mostra-se a seguir (figura 33) o resultado obtido executando o algoritmo próprio do TransCAD.

Page 51: 2002-transcad aprende

51

Figura 33 – Solução do problema de localização capacitado pelo TransCAD

Os custos das soluções apresentadas nas figuras 29 e 33 são mostradas na tabela a

seguir.

Algoritmo Custo da Solução TransCAD 753.21

P-Medianas (Senne e Lorena, 2000) 751.57 2.5 Comentários Finais

O projeto foi desenvolvido de acordo com o cronograma proposto. Na primeira etapa do projeto foi feito um levantamento bibliográfico sobre problemas de localização, os quais foram posteriormente utilizados na execução dos algoritmos utilizados pelo TransCAD. Este levantamento bibliográfico foi feito através da consulta em artigos, fornecidos pelo orientador, e pesquisas em sites na Internet. Foi feito também um estudo aprofundado do software TransCAD, e de todos os recursos por ele oferecidos. Este estudo baseou-se nas explicações fornecidas pelo “Manual do Usuário” do TransCAD bem como informações extras fornecidas pelo comando “Help” no meu de opções do programa.

Page 52: 2002-transcad aprende

52

Na segunda etapa do projeto, foi realizado um estudo aprofundado da linguagem de desenvolvimento GISDK, a fim de acoplar novos algoritmos ao sistema de informações geográficas TransCAD e criar interfaces gráficas que permitam, de forma simples, interação do usuário com o programa. Para tal estudo, foi utilizado o manual de programação “GISDK – Geographic Information System Developer’s Kit” e, principalmente, o sistema de ajuda fornecido pelo programa. Neste estudo foram criados pequenos programas para facilitar a interação do usuário com o TransCAD.

Após a assimilação da linguagem, foi possível que programas mais complexos, utilizando as mais variadas funções da linguagem GISDK, fossem criados, e que um sistema de apoio à decisão fosse construído.

Por apresentar inúmeras funções, compreender e assimilar a linguagem GISDK não foram tarefas fáceis, uma vez que o único recurso disponível foi o comando “Help” do programa, o qual apenas mostra como cada função deve ser utilizada, não dando uma “visão geral” de quais são os recursos disponíveis na linguagem.

No desenvolvimento do projeto encontrou-se dificuldade em obter mapas de grandes cidades que pudessem ser utilizados, pois, além de serem compatíveis com o TransCAD, estes mapas deveriam conter as informações necessárias para a solução dos problemas (demanda e capacidade de cada nó).

Outro problema surgiu em função das limitações oferecidas pela linguagem GISDK. Conforme comentado anteriormente, algumas funções disponíveis no TransCAD não estão disponíveis na linguagem GISDK, o que limita a construção de “Customs Applications”. Por este motivo, não foi possível, por exemplo, que a matriz de custos fosse gerada dentro da “Custom Application”, uma vez que a linguagem GISDK não apresenta nenhuma função que execute tal tarefa.

Como o sistema TransCAD apresenta um ambiente geral de desenvolvimento, em vez de utilizar uma “Custom Application” para desenvolver sistemas de apoio à decisão, os programas de solução de problemas de localização e roteamento poderiam ser acessados dentro do TransCAD, desde que fossem previamente compilados como add-ins. A desvantagem, neste caso, é que o usuário não irá dispor de um ambiente específico para a solução de seus problemas de localização e roteamento, devendo se habituar com a interface (bem mais complexa) do TransCAD.

O Sistema de Apoio à Decisão criado permite que o usuário estabeleça a aplicação desejada, bem como escolher os mapas pertinentes a esta aplicação. 3. Referências Bibliográficas

Bodin, L.; Golden, B.; Assad, A.; Ball, M. Routing and scheduling of vehicles and crews: the

state of the art. Computers and Operations Research, 10(2): 65-211, 1983.

Page 53: 2002-transcad aprende

53

Brandeau, M.L.; Chiu, S.S. An overview of representative problems in location research.

Management Science, vol 35 p.645 – 673, 1989

Caliper. GISDK Programmer’s Guide. Caliper Corporation, Newton, MA, 1999(a).

Caliper. Routing and Logistics with TransCAD 3.6. Caliper Corporation, Newton, MA,

1999(b).

Caliper. TransCAD User’s Guide. Caliper Corporation, Newton, MA, 1999(c).

Christofides, N.; Mingozzi, A.; Toth, P. The vehicle routing problem. In: Combinatorial

Optimization, Christofides, N.; Mingozzi, A.; Toth P. and Sandi C. (eds.). John Wiley,

1979.

Drezner, Z. (ed.) Facility Location: A Survey of Applications and Methods, Springer-Verlag,

NY, 1995.

ESRI. Understanding GIS: The ARC/INFO Method. Environmental Systems Research

Institute, Inc., Redlands, CA, 1997.

Fischbeck P. GIS: More than a Map. OR/MS Today, 42-45, Aug. 1994.

Francis, R.L.; McGinnis, L.F.; White, J.A. Facility Layout and Location: An Analytical

Approach, Prentice Hall, NJ, 1992.

Gendreau, M.; Laporte G.; Potvin, J.Y. Vehicle routing: modern heuristics. In: Local Search

in Combinatorial Optimization. E. Aarts and J.K. Lenstra (eds.), p. 311-336. John Wiley,

1997.

Lorena, L.A.N.; Senne, E.L.F. A Lagrangean/Surrogate Heuristic for Uncapacitated Facility

Location Problems. In: VIII CLAIO - Latin-Iberian-American Congress on Operations

Research and System Engineering e XXVIII SBPO - Simpósio Brasileiro de Pesquisa

Operacional, Rio de Janeiro, Ago. 1996.

Lorena, L.A.N.; Senne, E.L.F. Improving traditional subgradient scheme for Lagrangean

relaxation: an application to location problems, International Journal of Mathematical

Algorithms, 1: 133-151, 1999.

Lorena, L.A.N.; Senne, E.L.F. Local search heuristics for capacitated p-median problems. In:

17th European Conference on Operational Research, Budapest, Hungary, July, 2000.

Lorena, L.A.N.; Senne, E.L.F.; Paiva, J.A.C.; Marcondes, S.P.B. Integração de um Modelo de

p-Medianas a Sistemas de Informações Geográficas. In: 31º Simpósio Brasileiro de

Pesquisa Operacional, Juiz de Fora, MG, Out. 1999. Anais, p. 635-647.

Love, R.F.; Morris, J.G.; Wesolowsky, G.O. Facilities Location: Models and Methods, North

Holland, NY, 1988.

Page 54: 2002-transcad aprende

54

Mirchandani, P.B.; Francis, R.L. (eds.) Discrete Location Theory, Wiley Interscience, NY,

1990.

Pinto, A.A.; Senne, E.L.F. Utilização de Sistema de Informações Geográficas para Análise de

Redes. In: 11º Congresso de Iniciação Científica da Unesp, Araraquara, SP, Out. 1999.

Resumos, p. 36.

Senne, E.L.F.; Lorena, L.A.N. Lagrangean/Surrogate Heuristics for Facility Location

Problems. In: EURO XV - INFORMS XXXIV Joint International Meeting. Barcelona,

Espanha, Jul. 1997. Abstracts, p. 128.

Senne, E.L.F.; Lorena, L.A.N. Lagrangean/Surrogate Heuristics for p-Median Problems. In:

Computing Tools for Modeling, Optimization and Simulation: Interfaces in Computer

Science and Operations Research, M. Laguna and J.L. Gonzalez-Velarde (eds.), Kluwer

Academic Publishers, p. 115-130, 2000.

Senne, E.L.F.; Olivo, A.A. Um Ambiente Gráfico para Resolução de Problemas de

Roteamento. In: 24º Simpósio Brasileiro de Pesquisa Operacional, Salvador, BA, Nov.

1992. Anais, p. 86-90.

Slater, P.J. Locating a facility to service areas within a network. Standart Laboratories,

Albuquerque, New Mexico, 1979, p. 523-524.

Teitz, M.B.; Bart, P. Heuristic methods for estimating the vertex median of a weighted graph.

Operations Research, 16: 955-961, 1968.

Zocarato, C.A.; Senne, E.L.F. Análise de Redes Urbanas com Sistema de Informações

Geográficas. In: 11º Congresso de Iniciação Científica da Unesp, Araraquara, SP, Out.

1999. Resumos, p. 132.