Você está na página 1de 44

APRESENTAO

A simulao largamente utilizada para mostrar na prtica uma


srie de situaes que ajudam

nas

tomadas de deciso de uma determinada

empresa ou orgo, situaes estas que no poderiam ou no deveriam ser


realizadas realmente, devido, principalmente, a riscos proporcionados, ao tempo
disponvel para a realizao, aos custos que sero dispensados para a sua
realizao. Como exemplos poderamos citar:
- acidentes nucleares;
- vos em condies no favorveis;
- viagens espaciais;
- acidentes de trnsito;
- tempo gasto para desenvolvimento de determinada atividade;
- dentre outras.

Vale lembrar que os resultados obtidos pela simulao no so


100% confiveis, exatamente por se tratar de uma SIMULAO, e no de um
acontecimento real.

Desta forma, o que apresentaremos neste projeto um modelo


de simulao que determina a melhor rota de deslocamento de uma cidade para
outra. Nesse modelo utilizaremos as rodovias do estado do Paran onde, em
princpio, definimos um sentido de orientao (Oeste Leste), uma velocidade
mdia de deslocamento (padro 80 Km/h), e cadastramos aproximadamente 70
cidades em nosso arquivo de estradas. As sadas do modelo sero dadas de acordo
com as rotas existentes (caso a rota informada no exista, ou qualquer outra
situao impossvel, o sistema retornar uma resposta adequada s entradas do
usurio), mostrando as cidades que faro parte da melhor rota possvel entre a
cidade origem e a cidade destino, para isso ser utilizado o Princpio da Otimalidade

de Bellman visto em sala de aula, vale lembrar que pelo Principio da Otimalidade de
Bellman no necessariamente ser encontrada a melhor rota, pois por esse princpio
cada deciso tomada com base na deciso anterior, e nem sempre esse conjunto
de decises ser a melhor. Para que se encontre realmente a melhor rota possvel
entre uma cidade e outra deveramos construir um modelo baseado em

busca

exaustiva, que no o caso desse projeto.

Apresentaremos aqui tpicos que mostraro como os dados


foram coletados, tratados e como o modelo foi formulado. Ao final deste projeto ser
apresentado o cdigo fonte em pascal do modelo com comentrios nas rotinas mais
importantes.

Finalmente, queremos consignar aqui os nossos agradecimentos


ao orientador deste projeto, o Prof JOS DOMINGOS DUARTE da UNIVERSIDADE
CATLICA DE BRASLIA, cuja orientao ministrada em sala de aula foi
imprescindvel para que pudssemos concluir este modelo de simulao.

Para facilitar a avaliao do modelo foi desenhado um mapa com


a malha de cidades que o modelo atual est abrangendo, com as respectivas
rodovias e quilometragem. O mapa est na prxima pgina.

******* mapa de rodovias do parana

INTRODUO

Devido s grandes diferenas financeiras, sociais e culturais


entre os estados que compem o Brasil possvel notar a diversificao entre a
situao das rodovias do nosso pas.

As rodovias federais mantm um certo

equilbrio entre elas pois so mantidas pelo Governo Federal, porm nas rodovias
estaduais e municipais pode-se encontrar um abismo ao se sair de um estado e
entrar em outro.

As rodovias de So Paulo so um belo exemplo dessa situao,


so consideradas as melhores rodovias do pas, mas tm o incoveniente de se pagar
diretamente (pedgios) para andar por elas. Quando se est em So Paulo e viaja-se
por exemplo para Minas Gerais podemos perceber a hora que samos do estado de
So Paulo simplesmente pela mudana da qualidade e espaamento entre as
rodovias dos mesmos, as rodovias de Minas Gerais so mais estreitas e tem mais
buracos, mas tm a vantagem de no se pagar diretamente pela sua utilizao,
porm essa economia pode custar caro, as possibilidades de acidentes so maiores,
o veculo mais sacrificado, leva-se mais tempo para percorrer determinado
percurso, etc. No entanto, a maioria das rodovias do pas so como s rodovias de
Minas Gerais e o Paran no foge essa regra apesar de ser um estado bastante
desenvolvido culturalmente e socialmente. Foi com base nas rodovias do Paran que
esse projeto foi desenvolvido, no entanto ele ser aberto para que futuramente
outros estados ou todo o Brasil possa ser includo.

Nosso modelo tem por objetivo mostrar o melhor caminho de


deslocamento de uma cidade para outra dentro do estado do Paran de acordo com
a necessidade do usurio, isto , se o usurio deseja percorrer o caminho mais curto,
o sistema oferecer a opo de menor caminho independentemente do tipo de
estrada e do fluxo de carros, mas, se por outro lado ele desejar ir pelo caminho mais

rpido, o sistema oferecer a opo de caminho mais rpido sendo que nesta opo
a variao de velocidade ser de acordo com o fluxo e/ou com o tipo de estrada
naquele percurso.

por isso que a simulao se torna bastante interessante, uma


vez que nem sempre possvel prever o que pode ocorrer durante o percurso, o
usurio ser levado a buscar um nmero maior de rotas alternativas para chegar ao
destino desejado.

Para o desenvolvimento deste modelo, foram feitas vrias


pesquisas, para que, na medida do possvel, o modelo pudesse oferecer ao usurio
uma resposta mais prxima da realidade, dando assim uma maior confiabilidade ao
sistema, a maior parte dos dados foi coletada diretamente no DNER.

Sendo assim, esperamos que o modelo permita ao usurio obter


uma melhor performance no deslocamento entre duas ou mais cidades, com ganho
de tempo, e/ou custo (dinheiro, quilometragem, consumo de combustvel).

FORMULAO DO PROBLEMA

Para nos deslocarmos de um lugar para outro necessrio


verificar a melhor forma de faz-lo para que no tenhamos perda de tempo e que
tenhamos o menor custo possvel. Para isso seria necessrio um meio de obter os
caminhos que nos levariam a nosso destino e que alm disso nos oferecesse uma
forma de melhorar o rendimento da viagem de acordo com as nossas necessidades
e com a situao atual das estradas.

Devido a esse fato percebe-se que com a simulao do percurso


perfeitamente possvel obter uma prvia de tempo, quilometragem e dos custos
que sero necessrios para o cumprimento da viagem, o que, de outra forma, s
seria possvel, fazendo todos os percursos existentes, cronometrando o tempo e
calculando os custos de cada fase, o que consumiria muito tempo

e recursos

financeiros que quase sempre no esto disponveis.

Sendo assim, propomos um modelo de simulao que oferece ao


usurio duas formas de se chegar cidade destino, que sero as seguintes:
- Percurso mais rpido (menor tempo), onde sero analisados o tipo de
estrada em cada fase do caminho, o fluxo de carros e a velocidade mdia impressa
pelo usurio durante o percurso ( para efeitos de entrada do usurio no sistema, o
usurio s ter que informar a velocidade mdia que se mantm em determinado
trecho de uma rodovia, inicialmente a velocidade ter padro de 80 Km/h, esse
prottipo no faz nenhum tipo de anlise quanto qualidade e o fluxo de carros da
rodovia envolvida no percurso, os clculos sero baseados somente na velocidade
mdia do trecho e na distncia ).
- Menor percurso (menor quilometragem), onde ser analisado apenas a
distncia existente entre as cidades envolvidas, o modelo escolher sempre a menor
distncia em cada trecho.

Todas as duas formas de anlise de percurso seguem o princpio da


Otimalidade de Bellman. Com essas duas formas de anlise ser possvel observar
que nem sempre o menor caminho o caminho mais rpido.

COLETA E PROCESSAMENTO DE DADOS

A coleta de dados uma etapa extremamente importante para


que o modelo alcance sucesso, isso se deve ao fato de que as sadas do modelo so
totalmente baseadas nos dados coletados, ou seja, erro na coleta implicaria
fatalmente em erro nos dados de sada.

Neste modelo de simulao procuramos obter dados bastante


concretos para que os resultados obtidos fossem o mais confiveis possveis. Para
isso fomos ao DNER - Departamento Nacional de Estradas de Rodagem - onde
conseguimos informaes quanto ao tipo e quais so as estradas existentes no
estado do PARAN, estradas estas que ligam diversas cidades dentro do estado, o
que nos levou a um enorme leque de possibidades para teste do modelo. Nesta
visita observamos que o DNER possui um projeto semelhante a este para todo o
pas, onde so utilizadas rodovias federais para o percurso, mas que infelizmente
no havia nehuma documentao disponvel

para podermos consultar. Fizemos

ainda entrevista com um engenheiro do DNER que nos falou das dificuldades
existentes para o desenvolvimento de um projeto deste porte devido ao grande
nmero de variveis envolvidas, o que nos deixou ainda mais preocupados e atentos
para que abordassemos

os aspectos que julgamos fundamentais para o

desenvolvimento do modelo.

Com os dados coletados foi necessrio transform-los em


informao inteligveis ao nvel de tratamento que ser dado pelo modelo.

Com base nas informaes que obtivemos possvel fazer com


boa preciso, uma anlise de custo (dinheiro, quilometragem, consumo de
combustvel) e de tempo gasto para o deslocamento de uma cidade outra.

Desta

forma

ser

possvel

analisar

os

resultados,

e,

consequentemente, ser possvel tomar uma deciso quanto ao caminho que se


deve escolher para se chegar ao destino desejado. Para isso compararemos o
caminho mais curto com o caminho mais rpido e observaremos qual ser o mais
adequado para a situao atual.

FORMULAO DO MODELO

O modelo consiste na simulao de um percurso dada uma


cidade origem e uma cidade destino oferecendo como resultado o caminho mais
curto ou o caminho mais rpido, de acordo com a escolha do usurio.

Para a formulao do modelo, levamos em considerao o tipo


de rodovia, a velocidade mdia da rodovia e a distncia entre as cidades. Desta
forma foi possvel fazer uma anlise quanto ao tempo e a distncia entre a cidade
origem e a cidade destino.

No desenvolvimento do modelo, a fase de coleta de dados foi


uma das fases de maior preocupao, uma vez que os dados podem ajudar a sugerir
hipteses, que podem ser usados na estimativa de parmetros e sem eles seria
impossvel testar a validade do modelo.

Para o modelo, cadastramos vrias cidades do estado do Paran


(aproximadamente 70) que estaro armazenadas em um arquivo e serviro como
entrada do sistema quando o mesmo for inicializado. O usurio far a escolha da
cidade origem e da cidade destino, e durante a simulao poder alterar a velocidade
para cada trecho do percurso, o que tornar a simulao mais interessante e com
uma veracidade maior, fazendo com que situaes inesperadas possam ser
contornadas durante a prpria simulao.

Os resultados ser apresentados mostrando-se as cidades


envolvidas no percurso, a distncia entre cada cidade, a velocidade mdia de cada
trecho, o tempo mdio necessrio para o percurso, a quantidade de combustvel
necessria, o valor em dinheiro e a distncia total percorrida.

Essa variedade de respostas ser de grande valia para o


usurio, pois ele poder simular o percurso de acordo com as suas reais
necessidades, buscando sempre o melhor caminho para a situao do momento

FORMULAO DO PROGRAMA DE COMPUTADOR

Na prxima pgina est desenhado o fluxograma genrico do


modelo, aps o fluxograma apresentaremos o cdigo fonte do programa totalmente
comentado. Procuramos fazer um programa simples mas que atendesse aos
quesitos levantados anteriormente. Vale relembrar que o modelo foi proposto para o
sentido Oeste Leste.

O programa foi desenvolvido utilizando uma linguagem genrica


e de fcil entendimento: o Turbo Pascal 5.5.

O programa baseado em vrias estruturas montadas em forma


de rvore B, ou seja, sero criadas vrias rvores B onde os ramos das rvores
sero as bifurcaes das cidades que foram cadastradas. Essas estruturas so
montadas a partir da leitura do arquivo de estradas, a estrutura de cada cidade que
ser lida do arquivo para o array a seguinte:

TYPE
ESTRADA = RECORD
cidade : STRING[20];
proxima : STRING[20];
rodovia : STRING[5];
distancia : REAL;
veloci_media : REAL;
prox_no : INTEGER;
bifurca : INTEGER;
pontvolta : INTEGER;
END;

O campo cidade armazena o nome da cidade atual, o campo proxima


armazena o nome da prxima cidade a partir da cidade atual, esse campo utilizado
na hora de montar a rvore B dentro do array e na hora das pesquisas de rotas
possveis, o campo rodovia armazena o nome da rodovia, que s usado na hora
de montar o array e nas sadas do sistema, o campo distancia armazena a distncia
em quilmetros para a prxima cidade, o ponteiro prox_no aponta para o prximo
n a ser pesquisado (prxima cidade), caso ele seja o ltimo n ele ter o valor 0, o
ponteiro bifurca aponta para a prxima bifurcao dessa cidade, caso ele seja a
ltima bifurcao seu valor ser 0, o ponteiro pontvolta aponta para a bifurcao
anterior da cidade atual, caso ele seja a primeira bifurcao seu valor ser 0. Essa
a estrutura do array manipulado pelo programa.

{FLUXOGRAMA}

CDIGO DO PROGRAMA

{UNIVERSIDADE CATLICA DE BRASLIA


FACULDADE DE TECNOLOGIA
DEPARTAMENTO DE PROCESSAMENTO DE DADOS
DISCIPLINA: SIMULAO
PROF: JOS DOMINGOS DUARTE
ALUNO: XXXXXXXXXXXXXXX
MATRCULA: XXXXX
ESSE PROGRAMA APLICA O PRINCIPIO DA OTIMALIDADE DE BELLMAN
SOBRE UMA ESTRUTURA COMPOSTA POR VRIAS ARVORES B, O OBJETIVO
DO PROGRAMA TRAAR UMA ROTA TIMA PARTINDO DE UMA ORIGEM
AT UM DESTINO QUE O USURIO DEFINIR, O SENTIDO DE MOVIMENTAO
SEMPRE DE OESTE PARA LESTE.

PROGRAM estradas;
USES CRT;
CONST
tamanho = 100;

TYPE

{tamanho dos arrays utilizados}

{cada registro do array "parana" composto de todos}

ESTRADA = RECORD
cidade : STRING[20];
proxima : STRING[20];
rodovia : STRING[5];
distancia : REAL;
veloci_media : REAL;
prox_no : INTEGER;
bifurca : INTEGER;

{esses campos}

pontvolta : INTEGER;
END;

STR20 = STRING[20];

VAR

{declarao de variveis}

ARQ_TESTE : TEXT;

{arquivo onde est a base de dados das rodovias}

parana : ARRAY[1..tamanho] OF ESTRADA;


pilha : ARRAY[1..tamanho] OF INTEGER;
rod_possiveis : ARRAY[1..tamanho] OF INTEGER;
rota : ARRAY[1..tamanho] OF INTEGER;
arq_est : TEXT;
x,posic_origem,posic_destino,n,i,erro,conf_consumo,conf_comb : INTEGER;
cid,prox_cid,origem,destino : STRING[20];
consumo1,combustivel1,rod : STRING[5];
dist1 : STRING[7];
dist,velo,consumo,combustivel : REAL;
final,minimizar : CHAR;
encontrei,grava_alteracoes : BOOLEAN;

{ Esse procedimento inicializa o array "parana" que receber todos os dados


referentes a cada cidade, tambm inicializa a pilha utilizada no percorrimento da
rvore B, e tambm inicializa o array de rodovias possveis, esse array receber
todas as rodovias possveis entre uma cidade e outra que possibilitem chegar ao
destino desejado.

PROCEDURE inicializa_var;
BEGIN
FOR i := 1 TO tamanho DO

BEGIN
parana[i].cidade := ' ;
parana[i].proxima := '';
parana[i].rodovia := '';
parana[i].distancia := 0;
parana[i].veloci_media := 0;
parana[i].prox_no := 0;
parana[i].bifurca := 0;
parana[i].pontvolta := 0;
END;
FOR i := 1 TO tamanho DO
pilha[i] := 0;
FOR i := 1 TO tamanho DO
rod_possiveis[i] := 0;
END;

{ Esse procedimento serve para preencher o array "parana" com os dados


armazenados no arquivo "RODOVIAS.TXT", cada elemento desse array receber os
dados de um registro do arquivo, cada cidade ter um ponteiro (prox_no) para
apontar para a cidade seguinte na rodovia, outro ponteiro (bifurca) para apontar para
a prxima bifurcao dessa cidade, e outro ponteiro (pontvolta) que aponta para a
bifurcao anterior da cidade. Todos esses ponteiros so necessrios para que se
possa

percorrer

corretamente

PROCEDURE preenche_array;
BEGIN
ASSIGN(arq_est,'RODOVIAS.TXT');
RESET(arq_est);

todas

as

rvores

do

array.

n := 1;
WHILE NOT EOF(arq_est) DO
BEGIN
READLN(arq_est,cid,prox_cid,rod,dist1,velo);
VAL(dist1,dist,erro);
i := 1;
WHILE (parana[i].cidade <> '') AND (i <> tamanho) DO
BEGIN
IF parana[i].cidade = cid THEN
BEGIN
WHILE parana[i].bifurca <> 0 DO
i := parana[i].bifurca;
parana[i].bifurca := n;
parana[n].pontvolta := i;
i := tamanho;
END
ELSE
i := i + 1;
END;
parana[n].cidade := cid;
parana[n].proxima := prox_cid;
parana[n].rodovia := rod;
parana[n].distancia := dist;
parana[n].veloci_media := velo;
n := n + 1;
END;
CLOSE(arq_est);
n := 1;
WHILE (parana[n].cidade <> '') DO

BEGIN
i := 1;
WHILE (parana[i].cidade <> '') DO
BEGIN
IF (parana[i].proxima = parana[n].cidade) AND (parana[i].rodovia =
parana[n].rodovia) THEN
BEGIN
parana[i].prox_no := n;
i := tamanho;
END
ELSE
i := i + 1;
END;
n := n + 1;
END;
n := 1;
WHILE (parana[n].cidade <> '') DO
BEGIN
i := 1;
WHILE (parana[i].cidade <> '') DO
BEGIN
IF (parana[i].proxima = parana[n].cidade) AND (parana[i].prox_no = 0) THEN
parana[i].prox_no := n;
i := i + 1;
END;
n := n + 1;
END;
END;

{ Essa funo simplesmente verifica se a cidade passada como parmetro existe no


array "parana", a funo retornar a posio no array da cidade caso ela exista, se
no existir retornar 0 (zero).

FUNCTION procura_cidade(origdest : STR20) : INTEGER;


VAR
aux : INTEGER;

BEGIN
FOR i := 1 TO tamanho DO
IF parana[i].cidade = origdest THEN
BEGIN
aux := i;
procura_cidade := aux;
i := tamanho;
END;
IF parana[aux].cidade <> origdest THEN
procura_cidade := 0;
END;

{ Esse procedimento faz o empilhamento do elemento que foi passado como


parmetro, ou seja, esse elemento ser inserido na primeira posio do array e os
demais elementos j existentes sero empurrados uma posio para trs.

PROCEDURE empilha(elem : INTEGER);


BEGIN
FOR i := tamanho downto 2 DO
pilha[i] := pilha[i-1];
pilha[1] := elem;

END;

{ Esse procedimento faz o desempilhamento do primeiro elemento que fizer parte do


array, ou seja, o primeiro elemento ser descartado e os demais sero puxados uma
posio para frente. A pilha no entanto dever conter no mximo "tamanho - 1"
elementos, o ltimo elemento sempre dever ser 0 (zero) tanto na hora de empilhar
como na hora de desempilhar, tamanho uma constante definida no incio do
programa, seu valor nesse modelo 100.

PROCEDURE desempilha;
BEGIN
FOR i := 1 to tamanho-1 DO
pilha[i] := pilha[i+1];
END;

{ Essa funo serve para voltar para a primeira bifurcao da cidade que foi passada
como parmetro, a funo retornar a posio no array da primeira bifurcao dessa
cidade, para isso usa o ponteiro "pontvolta" que armazena a posio da bifurcao
anterior, a funo fica em loop at chegar na primeira bifurcao da cidade.
}

FUNCTION volta_primeiro_no(pri_no : INTEGER) : INTEGER;


BEGIN
WHILE parana[pri_no].pontvolta <> 0 DO
pri_no := parana[pri_no].pontvolta;
volta_primeiro_no := pri_no;
END;

{ Essa funo verifica se o destino em que se quer chegar possvel, devo dizer que
como esse programa funciona sobre o Principio da Otimalidade de Bellman o que
"destino" vira "origem" e vice-versa. Essa funo pesquisa toda a rvore B a partir da
origem que foi passada como parmetro, e verifica se o destino passado como
parmetro possvel, caso seja, ento a funo retornar TRUE, seno retornar
FALSE. Como essa funo chamada vrias vezes at completar a rota, o retorno
de TRUE e FALSE s se faz necessrio na primeira chamada, a partir da primeira
chamada, se ela for acionada novamente ela sempre retornar TRUE, visto que se
ela foi acionada novamente porque da primeira vez ela retornou TRUE, logo o
destino possvel. Considerando que no primeiro acionamento dessa funo ela
retornou TRUE ento o array "rod_possiveis" receber todas as bifurcaes
possveis da cidade atual que permitem chegar ao destino especificado, a
"PROCEDURE melhor_caminho"

analisar qual dessas bifurcaes dever ser

utilizada para minimizar "TEMPO" ou "DISTNCIA". Escolhida a bifurcao a ser


utilizada ento essa funo ser chamada novamente, e assim sucessivamente at
se

chegar

ao

destino

especificado.

FUNCTION procura_destino(dest1 : STR20; orig2:INTEGER) : BOOLEAN;


BEGIN
n := 1;
empilha(orig2);
x := pilha[1];
WHILE pilha[1] <> 0 DO
BEGIN
IF parana[x].cidade = destino THEN
BEGIN
WHILE pilha[2] <> 0 DO
desempilha;

rod_possiveis[n] := pilha[1];
n := n + 1;
IF parana[pilha[1]].bifurca <> 0 THEN
BEGIN
x := parana[pilha[1]].bifurca;
desempilha;
empilha(x);
END
ELSE
desempilha;
END
ELSE
BEGIN
IF parana[x].prox_no = 0 THEN
BEGIN
desempilha;
x := pilha[1];
WHILE (parana[x].bifurca = 0) AND (pilha[1] <> 0) DO
BEGIN
desempilha;
x := pilha[1];
END;
IF pilha[1] = 0 THEN
procura_destino := FALSE
ELSE
BEGIN
x := parana[x].bifurca;
desempilha;
empilha(x);

END;
END
ELSE
BEGIN
x := parana[x].prox_no;
x := volta_primeiro_no(x);
empilha(x);
END;
END;
END;
IF rod_possiveis[1] <> 0 THEN
procura_destino := TRUE;
END;

{ Esse procedimento faz a escolha da melhor rota utilizando o Princpio de Bellman,


essa "PROCEDURE" aciona a "FUNO procura_destino" quantas vezes forem
necessrias at se chegar ao destino, a cada retorno dessa funo o array "rota"
receber na prxima posio disponvel a posio no array "parana" da cidade
escolhida como rota tima, e assim sucessivamente at se chegar ao destino. Se na
primeira chamada que esta "PROCEDURE" fizer a "FUNO procura_destino" a
funo retornar FALSE ento o usurio ser informado que no possvel chegar ao
destino desejado a partir da cidade que ele informou como origem. Esse
procedimento ficar em loop enquanto a prxima cidade a partir da cidade atual for
diferente do destino desejado, quando a prxima cidade for igual ao destino ento
sero impressas em vdeo as cidades que fazem parte da rota escolhida pelo
programa, a distncia em km entre as cidades, as respectivas rodovias e a
velocidade mdia de cada trecho, logo depois ser calculado e impresso em vdeo os
seguintes dados:

- Kilometragem total;
- Tempo aproximado de percurso;
- Combustvel necessrio para se fazer a viagem;
- Quantidade em dinheiro necessria para pagar a gasolina;
Feito isso o controle do programa voltar ao programa principal que perguntar ao
usurio se ele deseja continuar ou deseja sair do programa.

PROCEDURE melhor_caminho;
VAR
z,k :INTEGER;
total : REAL;
tempo,tot_litros,tot_dinheiro : REAL;
tempo1 : INTEGER;
BEGIN
total := 0;
tempo := 0;
FOR i := 1 TO tamanho DO
rota[i] := 0;
posic_origem := volta_primeiro_no(posic_origem);
encontrei := procura_destino(destino,posic_origem);
k := 1;
IF encontrei = TRUE THEN
BEGIN
WHILE encontrei = TRUE DO
BEGIN
rota[k] := rod_possiveis[1];
z := 2;
WHILE rod_possiveis[z] <> 0 DO
BEGIN

IF UPCASE(minimizar) = 'D' THEN


BEGIN
IF parana[rod_possiveis[z]].distancia < parana[rota[k]].distancia THEN
rota[k] := rod_possiveis[z];
END
ELSE
BEGIN
IF ((parana[rod_possiveis[z]].distancia) / (parana[rod_possiveis[z]].veloci_media))
< ((parana[rota[k]].distancia) / (parana[rota[k]].veloci_media)) THEN
rota[k] := rod_possiveis[z];
END;
z := z + 1;
END;
FOR i := 1 TO tamanho DO
rod_possiveis[i] := 0;
total := total + parana[rota[k]].distancia;
tempo := tempo + ((parana[rota[k]].distancia / parana[rota[k]].veloci_media)
* 60);
IF parana[rota[k]].proxima = DESTINO THEN
BEGIN
CLRSCR;
WRITELN('

',destino, ' --> ',origem);

WRITELN(' ROTA UTILIZADA

DISTANCIA

FOR i := k DOWNTO 1 DO
BEGIN
WRITE(parana[rota[i]].proxima,' --> ',parana[rota[i]].cidade,' '
,parana[rota[i]].distancia:6:2,' Km',' ',parana[rota[i]].rodovia);
IF parana[rota[i]].veloci_media < 100 THEN
WRITE('

')

RODOVIA');

ELSE
WRITE(' ');
WRITELN(parana[rota[i]].veloci_media:5:2,' Km/h');
END;
encontrei := FALSE;
WRITELN('

TOTAL = ',total:8:2,' Km');

tempo1 := 0;
WHILE tempo >= 60 DO
BEGIN
tempo := tempo - 60;
tempo1 := tempo1 + 1;
END;
WRITE('TEMPO APROXIMADO DE PERCURSO = ');
IF tempo1 = 0 THEN
WRITELN(tempo:2:0,' minuto(s)')
ELSE IF tempo = 0 THEN
WRITELN(tempo1,' hora(s)')
ELSE
WRITELN(tempo1,' hora(s) e ',tempo:2:0,' minuto(s)');
tot_litros := total / consumo;
tot_dinheiro := tot_litros * combustivel;
WRITELN('COMBUSTIVEL NECESSARIO: ',tot_litros:6:2, ' litro(s)', '
QUANTIA NECESSARIA: R$',tot_dinheiro:7:2);
total := 0;
END
ELSE
BEGIN
posic_origem := volta_primeiro_no(parana[rota[k]].prox_no);
encontrei := procura_destino(destino,posic_origem);

END;
k := k + 1;
END;
END
ELSE
WRITELN('NO POSSVEL CHEGAR EM ',origem,' SAINDO DE ',destino);
END;

{ Esse procedimento serve somente para que o usurio informe a cidade de origem e
a cidade de destino, a varivel "destino" receber a origem que o usurio informou e
a varivel "origem" receber o destino que o usurio informou, isso se deve ao fato
de que o programa faz a pesquisa de trs para frente. Esse procedimento acionado
em dois casos:
1 Quando se quer mudar a velocidade entre duas cidades;
2 Quando se vai informar a cidade origem e a cidade destino da pesquisa a ser
efetuada;
A mensagem que passada como parmetro apenas para diferenciar quando se
est no primeiro ou no segundo caso;

PROCEDURE entra_cidades(msgem: STRING);


BEGIN
CLRSCR;
IF msgem <> '' THEN
WRITELN(msgem);
WRITE('ENTRE COM A CIDADE DE ORIGEM: ');
READLN(destino);
FOR i := 1 TO 20 DO
destino[i] := UPCASE(destino[i]);
FOR i := 1 TO 20 DO

IF LENGTH(destino) < 20 THEN


destino := destino + ' ';
WRITELN;
WRITE('ENTRE COM A CIDADE DE DESTINO: ');
READLN(origem);
FOR i := 1 TO 20 DO
origem[i] := UPCASE(origem[i]);
FOR i := 1 TO 20 DO
IF LENGTH(origem) < 20 THEN
origem := origem + ' ';
END;

{ Esse procedimento serve para receber as entradas do usurio quanto :


- Mudar velocidade entre duas cidades em especfico;
- Se deseja mudar a velocidade em toda uma rodovia;
Caso seja alterada alguma velocidade, essa alterao ser feita apenas no array,
nesse caso a varivel "grava_alteracoes" recebe TRUE para que quando o usurio
for sair do programa aparea a mensagem "DESEJA SALVAR EM DISCO AS
ALTERAES DE VELOCIDADE (S/N): ", se o usurio escolher "S" ento as
alteraes sero gravadas em disco, nesse caso quando o programa for executado
novamente sero carregados os novos valores.

PROCEDURE opcoes;
VAR
muda_vel : CHAR;
achei : BOOLEAN;
velo1 : STRING;
velo2 : REAL;
cont_vel : INTEGER;

rod1 : STRING[5];

BEGIN
minimizar := 'D';
REPEAT
CLRSCR;
WRITE('DESEJA MINIMIZAR TEMPO OU DISTANCIA (T/D): ');
READLN(minimizar);
UNTIL (UPCASE(minimizar) = 'T') OR (UPCASE(minimizar) = 'D');
IF UPCASE(minimizar) = 'T' THEN
BEGIN
REPEAT
CLRSCR;
WRITE('DESEJA ALTERAR A VELOCIDADE MEDIA DE ALGUMA
RODOVIA (S/N): ');
READLN(muda_vel);
UNTIL (UPCASE(muda_vel) = 'S') OR (UPCASE(muda_vel) = 'N');
IF UPCASE(muda_vel) = 'S' THEN
BEGIN
REPEAT
achei := FALSE;
entra_cidades('');
FOR i := 1 TO tamanho DO
IF (parana[i].cidade = origem) AND (parana[i].proxima = destino) THEN
BEGIN
achei := TRUE;
rod1 := parana[i].rodovia;
i := tamanho;
END

ELSE IF i = tamanho THEN


BEGIN
WRITELN('CIDADE DE ORIGEM E/OU DESTINO INEXISTENTES!!!');
WRITE('PRESSIONE ENTER PARA CONTINUAR');
READLN;
END;
UNTIL achei = TRUE;
REPEAT
CLRSCR;
WRITELN('DE ',destino, ' PARA ',origem);
WRITE('INFORME A NOVA VELOCIDADE: ');
READLN(velo1);
VAL(velo1,velo2,cont_vel);
grava_alteracoes := TRUE;
IF (cont_vel <> 0) OR (velo2 = 0) THEN
BEGIN
WRITELN('VELOCIDADE INVALIDA!!!!!');
WRITE('PRESSIONE ENTER');
READLN;
END;
UNTIL cont_vel = 0;
REPEAT
CLRSCR;
WRITELN('DESEJA MUDAR A VELOCIDADE DE TODA A RODOVIA');
WRITELN('"S" MUDA VELOCIDADE DE TODA RODOVIA E "N" SO
ENTRE AS CIDADES ESPECIFICADAS');
WRITE('ESCOLHA SUA OPCAO: ');
READLN(muda_vel);
UNTIL (UPCASE(muda_vel) = 'S') OR (UPCASE(muda_vel) = 'N');

IF UPCASE(muda_vel) = 'S' THEN


BEGIN
FOR i := 1 TO tamanho DO
IF parana[i].rodovia = rod1 THEN
parana[i].veloci_media := velo2;
END
ELSE
BEGIN
FOR i := 1 TO tamanho DO
IF (parana[i].cidade = origem) AND (parana[i].proxima = destino) THEN
BEGIN
parana[i].veloci_media := velo2;
i := tamanho;
END;
END;
origem := '';
destino := '';
END;
END;
END;

{ No programa principal inicialmente sero disparadas as rotinas de inicializao dos


arrays e de preenchimento do array "parana", o qual ser preenchido com os dados
do arquivo "RODOVIAS.TXT". imprecindvel que este arquivo esteja no mesmo
diretrio em que estiver o programa, para no dar erro na abertura do mesmo. Ser
pedido ao usurio que ele informe o consumo mdio do veculo e o valor do
combustvel, o usurio s ter acesso a essas duas entradas na primeira execuo
do programa, para se alterar esses valores deve-se carregar o programa novamente.

Essas entradas no ficaram no loop para no sobrecarregar o usurio com muita


digitao. Aps essas duas entradas entraremos no loop de execuo do programa,
aps a execuo do programa aparecer a mensagem "DESEJA CONTINUAR (S/N):
" se respondermos N e existirem alteraes nas velocidades das rodovias
aparecer a mensagem "DESEJA SALVAR EM DISCO AS ALTERACOES DE
VELOCIDADE (S/N):", caso seja informado "S" ento todo o array com os novos
valores ser descarregado no arquivo em disco, aps isso o programa ser
definitivamente

encerrado.

BEGIN
inicializa_var;
preenche_array;
grava_alteracoes := FALSE;
REPEAT
CLRSCR;
WRITE('ENTRE COM O CONSUMO MEDIO DO VEICULO (Km/l): ');
READLN(consumo1);
VAL(consumo1,consumo,conf_consumo);
WRITE('ENTRE COM O VALOR EM R$ DO COMBUSTIVEL (999.99): ');
READLN(combustivel1);
VAL(combustivel1,combustivel,conf_comb);
IF conf_consumo <> 0 THEN
WRITELN('VALOR CONSUMO INCORRETO - DEVE INFORMAR NUMERO
REAL DE 5 CASAS NO MXIMO');
IF conf_comb <> 0 THEN
WRITELN('VALOR PRECO INCORRETO - DEVE INFORMAR NUMERO
REAL DE 5 CASAS NO MXIMO');
IF (conf_consumo <> 0) OR (conf_comb <> 0) THEN

BEGIN
WRITE('PRESSIONE ENTER PARA CONTINUAR');
READLN;
END;
UNTIL (conf_consumo = 0) AND (conf_comb = 0);
REPEAT
CLRSCR;
opcoes;
final := 'S';
entra_cidades('DIGITE AS CIDADES QUE SERO UTILIZADAS PARA A
PESQUISA');
posic_origem := procura_cidade(origem);
posic_destino := procura_cidade(destino);

IF origem = destino THEN


WRITELN('CIDADE ORIGEM DEVE SER DIFERENTE DA CIDADE
DESTINO')
ELSE IF posic_origem = 0 THEN
WRITELN('CIDADE DE DESTINO INEXISTENTE')
ELSE IF posic_destino = 0 THEN
WRITELN('CIDADE DE ORIGEM INEXISTENTE')
ELSE
melhor_caminho;
WRITE('DESEJA CONTINUAR (S/N): ');
READLN(final);
UNTIL UPCASE(final) = 'N';
IF grava_alteracoes = TRUE THEN
BEGIN
REPEAT

CLRSCR;
WRITE('DESEJA SALVAR EM DISCO AS ALTERACOES DE VELOCIDADE
(S/N): ');
READLN(final);
UNTIL (UPCASE(final) = 'S') OR (UPCASE(final) = 'N');
IF UPCASE(final) = 'S' THEN
BEGIN
ASSIGN(arq_est,'RODOVIAS.TXT');
REWRITE(arq_est);
FOR i := 1 TO tamanho DO
BEGIN
STR(parana[i].distancia:7:1,dist1);
IF parana[i].cidade <> '' THEN
WRITELN(arq_est,parana[i].cidade, parana[i].proxima,
parana[i].rodovia,dist1,parana[i].veloci_media:5:2);
END;
CLOSE(arq_est);
END;
END;
END.
{ Fim do Programa }

ESTIMATIVA DE PARMETROS

VARIVEIS DE ENTRADA

- Consumo => (Consumo mdio do veculo em km/l);


- Combustvel => (Preo do combustvel em R$);
- Minimizar => (Tempo ou Distancia);
- Origem => (Cidade Destino - no programa Destino vira Origem);
- Destino => (Cidade Origem - no programa Origem vira Destino);
- Velo2 => (Velocidade mdia);

VARIVEIS DE SADA

- Parana[rota[i]].cidade e Parana[rota[i]].proxima => (Cidades envolvidas na rota);


- Parana[rota[i]].distancia => (Distncia em quilmetros de cada trecho da rota);
- Parana[rota[i]].rodovia => (Nome_de_cada_rodovia_utilizada_no_percurso);
- Parana[rota[i]].veloci_mdia => (Velocidade mdia em cada trecho);
- Total => (Quilometragem_total);
- Tempo e Tempo1 => (Tempo aproximado de percurso);
- Tot_litros => (Quantidade de combustvel necessrio para o percurso);
- Tot_dinheiro => (Quantia em dinheiro necessria para o percurso);

AVALIAO DO MODELO (VALIDAO)

Pela validao esperamos mostrar que o modelo uma


representao da realidade, e para isso foram realizados os seguintes testes:

Nota1: O consumo mdio do veculo e o preo do combustvel sero os mesmos


para todos os testes, o valor de cada um ser:
Consumo mdio do veculo = 13.5 kilmetros por litro
Preo do combustvel = R$ 0.59

Nota2: As sadas do sistema estaro dispostas no sentido real que OESTE =>
LESTE, porm a pesquisa do melhor caminho feita no sentido LESTE => OESTE,
esse tratamento transparente para o usurio, no entanto nas explicaes que
daremos a seguir utilizaremos a metodologia do programa, ou seja, LESTE =>
OESTE.

Teste1: Pretende-se ir de Foz do Iguau para Curitiba, nesse teste resolvemos


minimizar apenas a distncia, e os resultados foram os seguintes:

FOZ DO IGUACU --> CURITIBA


ROTA UTILIZADA

DISTANCIA RODOVIA

VELOCIDADE

FOZ DO IGUACU

--> CEU AZUL

97.00 Km

BR277

80.00 Km/h

CEU AZUL

--> CASCAVEL

48.00 Km

BR277

80.00 Km/h

CASCAVEL

--> LARANJEIRAS DO SUL 128.00 Km

BR277

80.00 Km/h

LARANJEIRAS DO SUL--> TRES PINHEIROS

55.00 Km

BR277

80.00 Km/h

TRES PINHEIROS

--> GUARAPUAVA

55.00 Km

BR277

80.00 Km/h

GUARAPUAVA

--> RELOGIO

45.00 Km

BR277

80.00 Km/h

RELOGIO

--> OSORIO SANTOS

138.00 Km

BR277

80.00 Km/h

OSORIO SANTOS

--> SAO LUIS DO PURINA

18.00 Km

BR277

80.00 Km/h

SAO LUIS DO PURINA--> CAMPO LARGO

24.00 Km

BR376

80.00 Km/h

CAMPO LARGO

--> ARAUCARIA

26.00 Km

PR423

80.00 Km/h

ARAUCARIA

--> CURITIBA

9.00 Km

PR421

80.00 Km/h

TOTAL =

643.00 Km

TEMPO APROXIMADO DE PERCURSO = 8 hora(s) e


COMBUSTIVEL NECESSARIO:

47.63 litro(s)

2 minuto(s)

QUANTIA NECESSARIA: R$

28.10

Teste2: Pretende-se ir de Foz do Iguau para Curitiba, nesse teste resolvemos


alterar a velocidade mdia do trecho PITANGA => GUARAPUAVA para 140 Km/h,
sendo assim resolvemos minimizar o tempo de percurso. Os resultados foram os
seguintes:

FOZ DO IGUACU --> CURITIBA


ROTA UTILIZADA

DISTANCIA RODOVIA

VELOCIDADE

FOZ DO IGUACU

--> CEU AZUL

97.00 Km

BR277

80.00 Km/h

CEU AZUL

--> CASCAVEL

48.00 Km

BR277

80.00 Km/h

CASCAVEL

--> CAMPO MOURAO

168.00 Km

BR369

80.00 Km/h

CAMPO MOURAO

--> IRETAMA

56.00 Km

BR487

80.00 Km/h

IRETAMA

--> BELA VISTA

20.00 Km

PR487

80.00 Km/h

BELA VISTA

--> PITANGA

31.00 Km

PR460

80.00 Km/h

PITANGA

--> GUARAPUAVA

84.00 Km

PR466

140.00 Km/h

GUARAPUAVA

--> RELOGIO

45.00 Km

BR277

80.00 Km/h

RELOGIO

--> OSORIO SANTOS

138.00 Km

BR277

80.00 Km/h

OSORIO SANTOS

--> SAO LUIS DO PURINA

18.00 Km

BR277

80.00 Km/h

SAO LUIS DO PURINA--> CAMPO LARGO

24.00 Km

BR376

80.00 Km/h

CAMPO LARGO

--> ARAUCARIA

26.00 Km

PR423

80.00 Km/h

ARAUCARIA

--> CURITIBA

9.00 Km

PR421

80.00 Km/h

TOTAL =

764.00 Km

TEMPO APROXIMADO DE PERCURSO = 9 hora(s) e


COMBUSTIVEL NECESSARIO:

56.59 litro(s)

6 minuto(s)

QUANTIA NECESSARIA: R$

33.39

Com esses dois testes conclui-se o seguinte: no primeiro teste a


nfase era diminuir o tamanho do percurso, no resultado observa-se que o percurso
de 643 km e o tempo aproximado de percurso de 8 horas e 2 minutos. J no
segundo teste a nfase era diminuir o tempo, mas ao contrrio do que se esperava o
tempo fez foi aumentar, isso se deve ao fato de que pelo Princpio da Otimalidade de
Bellman uma deciso tomada a partir da deciso tima tomada anteriormente,

consequentemente, o programa optou pelo trecho GUARAPUAVA => PITANGA,


onde a velocidade foi alterada para 140 km/h, pois leva menos tempo para percorrer
84 km 140 Km/h do que 55km a 80Km/h (GUARAPUAVA => TRS PINHEIROS).
Concluimos ento que nesse caso o teste1 ser o mais adequado para se efetuar
esse percurso.

O teste2 teve desempenho inferior porque a partir da deciso


tima de se passar por PITANGA a rota foi bastante alterada e o trecho a ser
percorrido aumentou em 131 Km, como nos demais trechos a serem percorridos a
velocidade mdia permaneceu inalterada o aumento de quilometragem resultou no
aumento de tempo.

Teste3: Pretende-se ir de Imba para Castro, nesse teste resolvemos minimizar a


distncia, e os resultados foram os seguintes:

IMBAU --> CASTRO


ROTA UTILIZADA

DISTANCIA RODOVIA

VELOCIDADE

IMBAU

--> CONCHAS VELHAS

90.00 Km

BR376

80.00 Km/h

CONCHAS VELHAS

--> PIRIQUITOS

11.00 Km

BR373

80.00 Km/h

PIRIQUITOS

-->

38.00 Km

PR151

80.00 Km/h

CASTRO
TOTAL =

139.00 Km

TEMPO APROXIMADO DE PERCURSO = 1 hora(s) e 44 minuto(s)


COMBUSTIVEL NECESSARIO:

10.30 litro(s)

QUANTIA NECESSARIA: R$

6.07

Teste2: Pretende-se ir de Imba para Castro, nesse teste resolvemos alterar a


velocidade mdia do trecho TIBAGI => CASTRO para 130 Km/h, sendo assim
resolvemos minimizar o tempo de percurso. Os resultados foram os seguintes:

IMBAU --> CASTRO


ROTA UTILIZADA
IMBAU

DISTANCIA RODOVIA
-->

TIBAGI

48.00 Km

PR340

VELOCIDADE
80.00 Km/h

TIBAGI

-->

CASTRO

60.00 Km
TOTAL =

8.00 litro(s)

130.00 Km/h

108.00 Km

TEMPO APROXIMADO DE PERCURSO = 1 hora(s) e


COMBUSTIVEL NECESSARIO:

PR340

4 minuto(s)

QUANTIA NECESSARIA: R$

4.72

A partir dos testes 3 e 4 chega-se a concluso de que nessa rota


TIBAGI => CASTRO, a otimizao por tempo se torna mais conveniente, pois o
tempo diminuiu em 40 minutos e a distncia em 31 Km. Portanto observa-se que pelo
Princpio da Otimalidade de Bellman muitas situaes podem ocorrer, e como uma
deciso depende da deciso tima tomada anteriormente, os resultados so
praticamente imprevisveis.

Obs: No caso dos testes 1 e 2, se os mesmos fossem realizados com busca


exaustiva a otimizao por tempo nunca poderia ter desempenho inferior
otimizao por distncia, a otimizao por tempo ter desempenho sempre igual ou
superior otimizao por distncia. No entanto, pelo Princpio da Otimalidade de
Bellman isso no se aplica.

Desta forma, temos a segurana de que nosso modelo atende


aos requisitos para os quais ele foi proposto com baixo custo, ganho de tempo e sem
riscos, o que justifica a simulao.

IDENTIFICAO DE PROBLEMAS E PROPOSTAS DE MELHORIAS

Como toda primeira verso de um projeto deste porte, o modelo


aqui proposto tambm possui pontos que podem e devem ser melhorados, o que, de
forma alguma, tira a sua qualidade e funcionalidade.

Um dos pontos que podem ser melhorados no que diz respeito


ao sentidos de deslocamento que o sistema oferece. Nesta verso, ele oferece
apenas o sentido Oeste Leste para deslocamento, futuramente poderia ser em
todos os sentidos.

Inserir no modelo a capacidade de avaliar o tipo de estrada e


estabelecer por si s uma velocidade mdia, tomando como base o fluxo de carros, a
situao da rodovia, a situao meteorolgica,etc.

O modelo tambm poderia ter sada em impressora, e atravs


disso disponibilizar ao usurio no s a rodovia tima pela Mtodo de Bellman, mas
tambm as rotas alternativas que devero ser consideradas em casos extremos
como por exemplo uma queda de barreira.

Pode-se tambm oferecer no s um estado, mas todo o pas ou


at mesmo alm das fronteiras brasileiras.

Outro ponto quanto a parte grfica do sistema, que ainda no


existe mas que pode ser feita, onde o mapa seria mostrado na tela e a escolha da
cidade origem e da cidade destino seria feita atravs de um click sobre as cidades
desejadas, onde o melhor percurso seria destacado dos demais mostrando o tempo
transcorrido de acordo com a velocidade escolhida. Ou seja, pode-se fazer melhorias

em vrios aspectos do modelo, mas devido ao tempo escasso no tivemos a


oportunidade de implementar o modelo com essas caractersticas.

CONCLUSO

Pelo modelo nota-se que o objetivo proposto foi alcanado, que


era o de simular o trajeto de uma cidade origem a uma cidade destino dentro do
estado do Paran, claro que com algumas limitaes, mas sempre oferecendo ao
usurio o melhor caminho a ser tomado de acordo com as suas necessidades e de
acordo com o mtodo descrito em sala de aula. Utilizamos dados o mais consistentes
possveis, dando assim maior credibilidade ao modelo de simulao.

Mostramos tambm pelo modelo que nem sempre o caminho


mais curto o caminho mais rpido, podendo-se fazer com isso uma srie de
experincias onde o desempenho do automvel poder ser o fator de deciso da
escolha do melhor caminho, para que, dependendo da diferena de tempo, um
automvel mais lento no atrapalhe o trnsito em uma via mais rpida.

Conclumos ainda que a simulao vale a pena quando se tem


um leque de possibilidades onde algumas oferecem ganho de tempo, outras
minimizam o custo, outras no oferecem nenhuma das duas, outras j oferecem as
duas e a deciso s seria possvel se se fizesse experimentos reais, o que no seria
muito aconselhvel devido ao alto custo.

Esta espcie de trabalho nos leva a perceber uma gama enorme


de possibilidades para o desenvolvimento de projetos mais arrojados e de maior
porte, que poderiam inclusive proporcionar ganhos no s experimentais e
intelectuais, mas financeiros.

Com isso, percebemos que a simulao no apenas uma


forma de se ganhar tempo e dinheiro, mas que existe o lado da pesquisa e de novas
descobertas que vo sendo explorados de forma pode-se dizer indireta, mas que

possibilita ganho de alternativas, de produtividade e de qualidade quando do


desenvolvimento do modelo real. Desta forma, a possibilidade de que novos modelos
de simulao surjam aumenta, fazendo com que atravs dos tempos se possa ter
um grande nmero de modelos j testados e validados e que possam oferecer uma
base mais consolidada para que novos sistemas sejam desenvolvidos.

Por tudo isso, pode-se dizer que a simulao alm de


interessante para ganho de tempo, como fonte de novas descobertas e para se
minimizar custos permite aos desenvolvedores despertarem o seu lado criativo e
assim promover seu desenvolvimento mental, que futuramente (curto, mdio ou
longo prazo) resultar em retorno financeiro.

Você também pode gostar