Problema do Caminho Hamiltoniano

Documentos relacionados
(Sistema Especialista)

Universidade Federal do ABC BCM Processamento da Informação Prática Projeto Campo Minado Primeiro Quadrimestre de 2018

Aula 7 Modularização. Processamento da Informação. Universidade Federal do ABC

Lista Ligada de Produtos parte 2 Data Máxima de Entrega: 17/11/2018

Não utilize caracteres acentuados ou especiais para nomes de pastas e arquivos.

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Um Minotauro Perdido & Percolação

MAC 115 Introdução à Ciência da Computação ROTHELO

Trabalho Prático 2 Mundo dos Blocos Alocação Dinâmica / Listas Encadeadas

Laboratório 3 Comandos de repetição while, do-while e for

SCC0503 (Algoritmos e Estruturas de Dados II) Prof. Moacir P. Ponti Junior. Trabalho 2

Classes e Objetos. Sintaxe de classe em Java

Linguagem de Programação III

Trabalho B Campo Minado

Quinto Trabalho Prático. Este trabalho tem como objetivo indexar arquivos de dados usando um índice árvore-b.

Classes, Herança e Interfaces

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Processamento da Informação Estruturas de seleção simples e composta

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

MAC2166 Introdução à Computação para Engenharia Escola Politécnica Primeira Prova 05 de abril de 2010

Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça Prática 01

PMR Computação para Automação. PMR Computação para Mecatrônica. Exercício Programa 2 - Versão Package BancoDeDados

Sistema Rodoviário Tabajara

DURAÇÃO DA PROVA: 2 horas

Fundamentos de programação

RESPOSTA: import java.util.arraylist; import java.util.list; class CarrinhoDeCompras2 { List<Produto> produtos;

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

Aula 1 Conceitos Básicos

Working 05 : Modularização

Aula 08 Estruturas de Condição. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Descrição do Algoritmo LZ77

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

DURAÇÃO DA PROVA: 2 horas

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

//conteúdo do arquivo pacote.h

Trabalho de LP 15/07/2013. Prof. Flávio Miguel Varejão

MAC-115 Introdução à Computação para Ciências Exatas e Tecnologia IO Terceiro Exercício-Programa Entregar até 09/11/2007

1, caso haja uma mina na posição (i, j),

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

Algoritmos e Estruturas de Dados II. Trabalho Prático 4

INSTRUÇÕES DE REPETIÇÃO

1 Introdução e Conceitos básicos

double x; x = enigmab1(100);

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Métodos em Java. Prof. Esp. André Aparecido da Silva (Aulas 31 a 33) Disponível em:

Simulado de Linguagem de Programação Java

Estruturas de Dados II. Caixeiro Viajante

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

DURAÇÃO DA PROVA: 2 horas

Quarto Trabalho Prático. Este trabalho tem como objetivo indexar arquivos de dados usando um índice simples ou linear. Descrição de páginas de disco

Unidade 8: Sobrecarga de Funções e Vetores e Matrizes (Arrays) Prof. Daniel Caetano

Aula 08 Encapsulamento. Disciplina: Programação Estruturada e Orientada a Objetos Prof. Bruno Gomes

7 a Lista de Exercícios Assunto: Funções e passagem por referência com vetor e matriz (Tópico 7)

Estrutura de Dados Funções e Procedimentos

Introdução à Computação II (Noturno) BCC Unesp Rio Claro/SP 2015 em PDF via Moodle: Escolha apenas 5 exercícios para entrega Exercício 01 (Pilhas)

Laboratório de programação II

Objetivo: Aplicar a técnica de encapsulamento no sistema de gestão acadêmica

MULTITHREADING. Prof.: Michele Nasu Tomiyama Bucci

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Primeiro Trabalho de IA/SI: Buscas. Entrega: 03/03/2019 (2 semanas)

1 Da aula teórica ao Java

AULA 14 ESTRUTURA DE DADOS

Segunda Parte do Trabalho Prático (Parte II) Valor: 70%

DIRETORIA ACADÊMICA DE GESTÃO E TECNOLOGIA DA INFORMAÇÃO DIATINF TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TADS

Caixeiro Viajante. Estruturas de Dados II. Prof. a Mariella Berger. 1. Objetivo

PCS LABORATÓRIO DE PROGRAMAÇÃO ORIENTADA A OBJETOS PARA A ENGENHARIA ELÉTRICA

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Algoritmos e Estruturas de Dados II. Trabalho Prático 3

Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert

Prova 2 - Computação

Recursividade. Objetivos do módulo. O que é recursividade

Algoritmos, Estruturas de Dados e Tipos Abstratos de Dados (TADs)

Aula 4 Estruturas de Controle

Primeiro Trabalho Prático Turma A. Descrição do Trabalho. Considere os seguintes dados a respeito de um livro:

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

Computação 1 - Python Aula 7 - Teórica: Estrutura de Repetição com teste de parada: while 1/ 23

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

BCC202 - Estrutura de Dados I

SSC 0721 Teste e Inspeção de Software

Engenharia de Software Aula 21. Revisão da Prova 2. Eduardo Figueiredo.

Unidade 7: Documentação de Código A Importância dos Comentários Prof. Daniel Caetano

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

MAC 2166 Introdução à Computação para Engenharia Escola Politécnica Primeiro Semestre de 2003 Primeira Prova 2 de abril de 2003

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

ALGORITMOS. Professor: Diego Oliveira. Aula 06 - Tipos Primitivos de Dados

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Terceiro Exercício Programa (EP3) Campo Minado

Segundo Trabalho Prático Turma A

Enums em Java: utilização e persistência

Departamento de Ciência de Computadores Estruturas de Dados (CC114)

Interfaces POO. Prof. Marcio Delamaro

Transcrição:

Universidade de São Paulo Escola de Artes, Ciências e Humanidades Bacharelado em Sistemas de Informação Introdução à Ciência da Computação II Professores Luciano Digiampietri e Fábio Nakano Data de entrega: 20/10/2012 EXERCÍCIO PROGRAMA 2 Problema do Caminho Hamiltoniano Neste trabalho você deverá implementar/completar uma classe que encontre a solução ótima para o problema do Caminho Hamiltoniano. O problema do Caminho Hamiltoniano consiste em encontrar o menor caminho que passe por todas as cidades, dados: (a) um mapa com um conjunto de cidades e a distância entre cada cidade e suas vizinhas e (b) [para este problema específico] uma cidade de origem e uma cidade de destino. O objetivo é identificar o menor caminho que parta da cidade de origem, chegue na cidade de destino passando exatamente uma vez por todas as cidades do mapa. A solução ótima para este problema pode ser encontrada utilizando a estratégia de backtracking e tem complexidade exponencial no número de cidades. Você deve implementar a solução empregando essa estratégia. A título de informação, sabe-se que soluções exponenciais tem desempenho pobre, no sentido de que solucionar problemas relativamente pequenos toma mais tempo que o aceitável e que aumentar a capacidade de processamento (por exemplo 10 ou 100 vezes) permite tratar problemas com uns poucos elementos a mais. É possível evitar uma implementação com complexidade exponencial utilizando a estratégia gulosa para a solução deste problema, infelizmente esta solução nem sempre será ótima. Por isso, neste EP será utilizada a estratégia de backtracking de forma a sempre se obter soluções ótimas. Para este problema, sempre que houver mais de uma solução com distância mínima, você poderá escolher entre qualquer uma dessas soluções ótimas. O método para identificar a solução ótima deverá retornar um arranjo de objetos do tipo Cidade, indicando qual será o caminho percorrido (a primeira cidade deverá ser a origem e a última a cidade destino). A seguir são apresentados alguns exemplos (a numeração corresponde aos mapas que já estão disponíveis no código do EP2). Os caminhos serão apresentados como sequências dos nomes das cidades e entre o nome de duas cidades aparecerá a distância entre elas. Exemplo 1: Y X O menor caminho hamiltoniano de Y para X será: Y [] X. Distância do caminho: O menor caminho hamiltoniano de X para Y será: X [] Y. Distância do caminho:

Exemplo 2: A C 6.0 B Menor caminho hamiltoniano de C para A será: C [6.0] B [] A. Distância do caminho: 11.5 Menor caminho hamiltoniano de B para C será: B [] A [] C. Distância do caminho: 8.5 Exemplo 3: E F E F E F 20.0 6.0 20.0 6.0 20.0 6.0 H G H G H G O menor caminho hamiltoniano de E para a G será: E [] F [20.0] H [] G. Distância do caminho: 30.0 O menor caminho hamiltoniano de E para a H será: E [] F [6.0] G [] H. Distancia do caminho: 16.0 Exemplo 4: I 2.5 J 4.0 8.0 5.0 M 3.5 6.5 K L

I 2.5 J I 2.5 J 4.0 8.0 5.0 4.0 8.0 5.0 M 3.5 6.5 K M 3.5 6.5 K L Menor caminho hamiltoniano partindo da cidade I para Menor caminho hamiltoniano partindo da cidade J para a J: I [3.5] L [] K [] M [4.0] J. Distância do a M: J [2.5] I [3.5] L [] K [] M. Distância do caminho: 16.0 caminho: 14.5 L O sistema será composto pelas seguintes classes (muitas delas já implementadas, disponibilizadas juntamente com o código do EP). A classe hachurada é aquela que vocês precisarão implementar/completar. A solução de cada aluno deve compilar e executar corretamente considerando a versão original das demais classes (isto é, as demais classes não devem ser modificadas). Caminho Nome Tipo Resumo classe abstrata Classe que contém o método para a solução ótima do problema do caminho hamiltoniano. Cidade classe Classe que descreve uma cidade: nome, arranjo de distâncias (cidades vizinhas e suas distâncias) para a cidade atual. Distancia classe Classe que contém dois atributos distância e cidade e serve para representar a distância de uma cidade vizinha. ExecutaTestes classe Classe executável (que possui método main) que pode ser usada para testar as demais classes. Mapa classe Classe que contém o arranjo das cidades de um mapa e alguns métodos auxiliares. A seguir cada uma das classes é detalhada. Classe Caminho Classe abstrata que deve ser completada pelo aluno. Há um método que deve ser completo, além disso cada aluno poderá adicionar atributos e/ou métodos auxiliares. Cada aluno não deverá mudar a assinatura do método encontrarmelhorcaminho. O método encontrarmelhorcaminho deverá retornar um arranjo com todas as cidades do mapa e na ordem que o caminho deverá ser percorrido (começando pela cidade origem, terminando pela destino e sem repetir cidades). /* Este metodo deve retornar o caminho mais curto que passe por * todas as cidades do mapa apenas uma vez, * comecando pela Cidade origem e terminando na Cidade destino. * O caminho deve ser retornado na forma de um arranjo de cidade. public static Cidade[] encontrarmelhorcaminho(mapa mapa, Cidade origem, Cidade destino){ //TODO COMPLETAR

Classe Cidade Classe que representa uma cidade. Uma cidade é composta por 3 atributos, um construtor e dois métodos. Atributos: public String nome; // Nome da cidade public boolean cidadevisitada = false; // atributo auxiliar que pode ser utilizado para marcar se uma cidade foi visitada durante o backtracking public Distancia[] vizinhas; // arranjo que contem as distancias das cidades vizinhas (cada objeto do tipo Distancia contem uma cidade e uma distancia) /* Construtor da classe Cidade Cidade(String nomedacidade){ nome = nomedacidade; /* metodo para complementar o contrutor, adicionando o arranjo de cidades vizinhas void adicionararranjodedistancias(distancia[] vizinh){ vizinhas = vizinh; /* metodo para verificar se uma dada cidade eh vizinha da cidade atual boolean ehvizinha(cidade cidade1){ for (int i=0;i<vizinhas.length;i++){ if (vizinhas[i].cidade == cidade1) return true; return false; Classe Distancia Esta classe serve para unir dois atributos: distancia (do tipo double) e cidade (do tipo Cidade). Esta classe serve para indicar uma cidade vizinha (e sua distância), dada uma cidade qualquer. A classe possui apenas dois atributos e um contrutor. Cidade cidade; // atributo para indicar uma Cidade double distancia; // atributo para indicar a distancia entre duas cidades /* contrutor da classe Distancia Distancia(Cidade cid, Double dist){ cidade = cid; distancia = dist; Classe ExecutaTestes Classe executável (possuidora do método main) e que chama três conjuntos de teste para o EP2. Possui um atributo estático para indicar qual conjunto de testes será executado: CONJUNTO_DE_TESTE. O primeiro conjunto de dados é composto por 6 mapas diferentes (e um total de 20 testes). Para o segundo e terceiro conjuntos de dados, os mapas são gerados aleatoriamente e por isso os resultados irão variar. Para o primeiro conjunto de dados, as saídas esperadas estão no arquivo saida1.txt. O tempo de execução é impresso apenas de maneira informativa, mas é importante tomar cuidado para não desenvolver uma solução muito ineficiente (isto é, que fique testando diversos caminhos impossíveis, por exemplo). Durante os testes, todo teste que demorar para executar mais de 100 vezes o tempo da solução gabarito será considerado incorreto.

Classe Mapa Esta classe contem um mapa (isto é, um arranjo de Cidades) e alguns métodos auxiliares. Cidade[] cidadesdomapa; // arranjo com todas as cidades do mapa /* construtor da classe Mapa Mapa (Cidade[] cids){ cidadesdomapa = cids; /* metodo para retornar o numero de cidades do mapa atual public int numerodecidades(){ return cidadesdomapa.length; /* dado um caminho, calcula a distancia total deste caminho static double calculardistanciadocaminho(cidade[] caminho){... /* retorna a distancia entre duas cidades, caso sejam vizinhas, ou -1 caso contrario * Dica: eh possivel (e recomendavel) implementar uma boa solucao sem utilizar este metodo static double distanciaduascidades(cidade cidade1, Cidade cidade2){ double distancia = -1; Distancia temp; for (int i=0;i<cidade1.vizinhas.length;i++){ temp = cidade1.vizinhas[i]; if (temp.cidade == cidade2) return temp.distancia; System.err.println("As cidades " + cidade1 + " e " + cidade2 + " nao sao vizinhas."); return distancia; /* metodo que imprime as cidades e distancias entre as cidades de * um dadao caminho static void imprimircaminho(cidade[] caminho){... /* metodo que gera mapas aleatorios, dados o numero de cidades e o numero de * ligacoes (estradas) entre as cidades static Mapa geradordemapa(int cidades, int ligacoes){...

Regras de Elaboração e Submissão Este trabalho é individual, cada aluno deverá implementar e submeter via COL sua solução. A submissão será feita via um arquivo zip ou rar (o nome do arquivo deverá ser o número USP do aluno, por exemplo 1234567.zip). Este arquivo deverá conter APENAS o arquivo Caminho.java Além deste enunciado, você encontrará na página da disciplina um zip contendo todos os arquivos envolvidos neste trabalho (note que o arquivo Caminho.java a ser implementado também está disponível no site, você precisará apenas completá-lo). Qualquer tentativa de cola implicará em nota zero para todos os envolvidos. Guarde uma cópia do trabalho entregue e verifique, no Col, se o arquivo foi submetido corretamente. A data de entrega é 20 de outubro (sábado) até às 23:00h (com um hora de tolerância), não serão aceitos trabalhos entregues após esta data (não deixe para submeter na última hora). Se necessário, implemente na classe Caminho métodos auxiliares e crie atributos. Estes métodos e atributos deverão ser estáticos (static) (lembre-se de zerar/inicializar os atributos necessários em cada execução do método encontrarmelhorcaminho). Não crie nenhuma classe nova. Não utilize conceitos ou classes que não foram estudados em aula. Só complemente a implementação da classe solicitada (e, no máximo, implemente métodos auxiliares e/ou crie atributos na própria classe). Caso o EP não compile a nota do trabalho será zero. É importante que você teste seu trabalho executando a classe ExecutaTestes (note que ela não testa todas as funcionalidades do método implementado, por exemplo, ela não verifica se na sua solução não há cidades repetidas em um único caminho). Preencha o cabeçalho existente no início do arquivo Caminho.java (há espaço para se colocar turma, nome do professor, nome do aluno e número USP do aluno). Todas as classes pertencem ao pacote ep2_2012 Todos os mapas terão no mínimo duas cidades e sempre haverá ao menos um caminho entre as cidades utilizadas como origem e destino nos testes. Todas as distâncias entre as cidades serão positivas.