Meu primeiro programa em Ruby
Este blog deixou de ser mantido, mas o autor continua escrevendo aqui. Não deixe de assinar o novo feed!
Antes de pegar esse troço de RoR pra aprender, eu decidi começar a estudar o ‘core’ da linguagem. Pois bem! Nada melhor do que implementar um algoritmo besta para iniciar o aprendizado de uma linguagem de programação.
O algoritmo besta que escolhi para isso é uma adaptação sub-desenvolvida da resolução do PCV. Nada de sofisticado: apenas vai pegando os nós vizinhos, escolhe o de menor custo e bola pre frente.
Bom.. o código não está tão ‘bonito’ quanto eu gostaria que estivesse.. mas não está tão ruim assim.
Bom…. aí vai o código!
-
-
#!/usr/bin/ruby
-
-
# ——–
-
# Classe para a resolução do Problema do Caixeiro Viajante,
-
# seguindo o algoritmo de construção por vizinho mais próximo.
-
#
-
# Autor: Daniel Fernandes Martins
-
# ——–
-
class Pcv
-
-
# Métodos Get
-
attr_reader :n , :h , :l , :matrix
-
-
# Método Set e Get
-
attr_accessor :i
-
-
# Inicializa o objeto
-
def initialize()
-
@h = Array.new
-
@l = @i = 0
-
end
-
-
# Seta o grafo a ser utilizado no algoritmo
-
def matrix=(value)
-
if value.is_a? Array
-
@matrix = value
-
@n = (1 .. value.length).each {|e|}.collect
-
end
-
end
-
-
# Implementação do algoritmo
-
def process
-
@n.delete @i
-
@h << @i
-
-
# Enquanto ainda existirem elementos a serem verificados…
-
while @n.any?
-
-
minor = nil
-
j = nil
-
-
# Encontra o menor elemento em N
-
@n.each do |v|
-
if (minor == nil || @matrix[@i-1][v-1] < minor)
-
&& @matrix[@i-1][v-1] != 0
-
minor = @matrix[@i-1][v-1]
-
j = v
-
end
-
end
-
-
# J é o vizinho mais próximo
-
-
# Adiciona J ao caminho e ajusta o custo do caminho atual
-
@h << j
-
@l += minor
-
@i = j
-
-
# Remove J do vetor de elementos disponíveis
-
@n.delete j
-
end
-
-
# Fecha o ciclo
-
@l += @matrix[@i-1][ @h[0]-1 ]
-
end
-
end
-
-
# ——–
-
# Métodos utilitários
-
# ——–
-
def print_header
-
puts “”
-
puts “Problema do Caixeiro Viajante”
-
puts “”
-
end
-
-
def print_array (array)
-
array.each { |v| print “#{v} “}
-
puts “”
-
end
-
-
def print_matrix (matrix)
-
matrix.each { |i| print_array i }
-
end
-
-
def print_result (pcv)
-
print “Caminho.: “
-
print_array pcv.h
-
-
puts “Custo…: #{pcv.l}“
-
puts “”
-
end
-
-
def read_initial_node (pcv)
-
begin
-
print “Digite o no inicial (1-5): “
-
pcv.i = gets.to_i
-
end while pcv.i < 1 || pcv.i > 5
-
end
-
-
# ——–
-
# Loop principal
-
# ——–
-
begin
-
-
# Criação de um objeto para resolução do problema
-
pcv = Pcv.new();
-
-
print_header
-
-
puts “Matriz de teste”
-
puts “***************”
-
puts “”
-
-
# Grafo a ser calculado
-
matrix = Array.new
-
matrix << [0, 1, 2, 7, 5]
-
matrix << [1, 0, 3, 4, 3]
-
matrix << [2, 3, 0, 5, 2]
-
matrix << [7, 4, 5, 0, 3]
-
matrix << [5, 3, 2, 3, 0]
-
pcv.matrix = matrix
-
-
# Mostra a matrix na tela
-
print_matrix pcv.matrix
-
puts “”
-
-
# Usuário indica o primeiro nó
-
read_initial_node (pcv)
-
-
# Calcula e mostra o resultado
-
pcv.process
-
-
puts “”
-
puts “Resultado”
-
puts “*********”
-
-
print_result (pcv)
-
print “Calcular novamente (S/N)? “
-
end while gets.chomp.upcase == “S”
-
*PS: Os nomes das variáveis (i, j, l, etc) estão assim pois eu segui um documento que explicava o algoritmo utilizando tipo uma linguagem matemática. É, tá zuado, mas tá bão! ![]()


29 de agosto de 2007 às 6:06 pm
legal teu codigo,mas é desktop? tem mais algum codigo ai? tem algum manual,tutorial?se puder mandar no meu email depois.. valeu
29 de agosto de 2007 às 6:10 pm
Não, esse é o código completo. É apenas um programa que roda em linha de comando, nada mais.
[]s
12 de dezembro de 2007 às 10:50 pm
ola!
preciso urgentemente da resolucao desse problema em linguagem C.
voce tem algo que eu possa usar?
obrigado.
valeu.
12 de dezembro de 2007 às 11:34 pm
Olá Rui!
Infelizmente, eu não tenho nada para te oferecer. Mas veja, o algoritmo tá todo aí… é fácil transcrevê-lo para C, mesmo não conhecendo Ruby (a linguagem que utilizei neste código). E os comentários também devem facilitar ainda mais as coisas.
Abraço
25 de março de 2008 às 11:16 am
Grande, estou iniciando em ruby, e estou fazendo contato com os rubyeros… hehe
se tiver outros exemplos para q eu possa aprimorar meu estudo, seria de muita ajuda!
valeu!
abs