Hi Gillaume, On 04/03/2012 07:22 AM, Guillaume Lemaître wrote: > Thanks for your prompt reply. Should I open a ticket? I attach here the > HammingVisitor example modified to use my own Cost class.
I have fixed this problem in the development version available in the git repository. Attached I'm sending you a slightly modified version of your example (I added an initialization of the distance of the source vertex to Cost(), otherwise it would have been None, and imported the copy module), which works for me without a problem. Cheers, Tiago -- Tiago de Paula Peixoto <[email protected]>
#!/usr/bin/python
#-*- coding: utf-8 -*-
import graph_tool.all as gt
from numpy.random import random
import copy
class Cost(object):
"""Coût de construction, rassemblant différents critères : distance Ã
l'origine (nombre de pas), suivi de terrain, etc.
"""
# Somme des écart par rapport au suivi de terrain optimal
suivi = 0
# Nombre de cases parcourues
longueur = 0
# Nombre de virages
virage = 0
def __add__(self, autre):
retour = copy.copy(self)
retour += autre
return retour
def __cmp__(self, autre):
return cmp(self.suivi, autre.suivi) \
or cmp(self.longueur, autre.longueur) \
or cmp(self.virage, autre.virage)
def __hash__(self):
return hash(str(self))
def __iadd__(self, autre):
self.suivi += autre.suivi
self.longueur += autre.longueur
self.virage += autre.virage
return self
def __repr__(self):
return str(self.suivi) \
+ "|" + str(self.longueur) \
+ "|" + str(self.virage)
def __str__(self):
return "suivi : " + str(self.suivi) \
+ " longueur : " + str(self.longueur) \
+ " virage : " + str(self.virage)
INFINITE_COST = Cost()
INFINITE_COST.suivi = float("inf")
INFINITE_COST.longueur = float("inf")
INFINITE_COST.virage = float("inf")
class HammingVisitor(gt.AStarVisitor):
def __init__(self, g, target, state, weight, dist, cost):
self.g = g
self.state = state
self.target = target
self.weight = weight
self.dist = dist
self.cost = cost
self.visited = {}
def examine_vertex(self, u):
for i in xrange(len(self.state[u])):
nstate = list(self.state[u])
nstate[i] ^= 1
if tuple(nstate) in self.visited:
v = self.visited[tuple(nstate)]
else:
v = self.g.add_vertex()
self.visited[tuple(nstate)] = v
self.state[v] = nstate
self.dist[v] = self.cost[v] = INFINITE_COST
for e in u.out_edges():
if e.target() == v:
break
else:
e = self.g.add_edge(u, v)
self.weight[e] = Cost()
self.weight[e].suivi = int(15 * random())
self.weight[e].longueur = int(15 * random())
self.weight[e].virage = int(15 * random())
self.visited[tuple(self.state[u])] = u
def edge_relaxed(self, e):
if self.state[e.target()] == self.target:
self.visited[tuple(self.target)] = e.target()
raise gt.StopSearch()
def h(v, target, state):
retour = Cost()
retour.suivi = sum(abs(state[v].a - target)) / 2
return retour
if __name__ == "__main__":
g = gt.Graph(directed=False)
state = g.new_vertex_property("vector<bool>")
v = g.add_vertex()
state[v] = [0] * 10
target = [1] * 10
weight = g.new_edge_property("object")
dist = g.new_vertex_property("object")
cost = g.new_vertex_property("object")
visitor = HammingVisitor(g, target, state, weight, dist, cost)
dist[g.vertex(0)] = Cost()
dist, pred = gt.astar_search(g, g.vertex(0), weight, visitor, dist_map=dist,
cost_map=cost,
heuristic=lambda v: h(v, list(target), state),
zero = Cost(),
infinity = INFINITE_COST,
implicit=True)
# We can now observe the best path found, and how many vertices and edges
# were visited in the process.
ecolor = g.new_edge_property("string")
vcolor = g.new_vertex_property("string")
ewidth = g.new_edge_property("double")
ewidth.a = 2
for e in g.edges():
ecolor[e] = "black"
for v in g.vertices():
vcolor[v] = "white"
v = visitor.visited[tuple(target)]
while v != g.vertex(0):
vcolor[v] = "black"
p = g.vertex(pred[v])
for e in v.out_edges():
if e.target() == p:
ecolor[e] = "red"
ewidth[e] = 4
v = p
vcolor[v] = "black"
gt.graph_draw(g, size=(10,10), vsize=0.25, vprops={"fillcolor": vcolor},
eprops={"color": ecolor}, penwidth=ewidth,
output="astar-implicit.pdf")
signature.asc
Description: OpenPGP digital signature
_______________________________________________ graph-tool mailing list [email protected] http://lists.skewed.de/mailman/listinfo/graph-tool
