MiniProj:C:2012:Rendu

De wiki-prog
Aller à : navigation, rechercher

MiniProj:C:2011 Rendu

La date du rendu est Lundi 23 avril 2012 à 23h42.

Cette page décrit la procédure de rendu.

L'interface de rendu se trouve à l'adresse: http://rendu.infoprepa.epita.fr/EPITA2015/index.php?TP=20120418

L'interface est toujours la même, il vous faut donc le pass que je vous ai fourni, si vous ne l'avez pas envoyer moi un mail avec dans le sujet les balises [IP][MPC01][PASS] et votre login.

Le suffixe du rendu est "donjon2012", donc le format du dossier (et de la tarball, donc) est le suivant:

  • Dossier: login-donjon2012
  • Tarball: login-donjon2012.tar.bz2

Bien évidement, votre rendu doit compiler avec la commande make (la moulinette teste GNU et BSD make au cas où ... ) Votre code peut utiliser l'intégralité de la libc (attention tout de même aux extensions non standard) et c'est tout. Normalement, la moulinette tourne sur un FreeBSD, mais si je m'aperçois qu'il y a des (trop) problèmes, je la ferai tourner sur un Linux similaire aux Fedora de vos rack. Dans tous les cas, la machine est en 64bits et supporte les mêmes versions de gcc que vos racks.

L'interface de rendu se souvient de votre dernier rendu et vous réaffiche donc le rapport lorsque vous vous connectez.

Cas particulier

Algo de sup

Si vous êtes (encore) coincé sur les graphes, voici une pseudo-implantation de l'algorithme A* en C (attention, plusieurs opérations sont sans définition.) Cette implantation n'a pas été testée:

/* the graph structure is kept abstract, a state is a vertex of the
   graph plus distance and direct ancestor information. */
 
/* open and close set are abstract structures working as set. Open is
   also supposed to be ordered */
 
/* h(t_state s) is the heuristic function: it returns a float (or
   double.) Normally your heuristic should be aware of the full graph
   and of the destination of your path finding. */
 
void astar(t_graph g, int src, int dst)
{
  t_state		cur;
  t_adj			adj;
  t_state_list		successors;
  t_open_set		opened; // state to be treated
  t_closed_set		closed; // state already treated
  // We get the source state
  cur = get_state(g, src);
  // By default, state have an infinite distance, we fix it to 0 for
  // the source.
  set_dist(0, cur);
  // Source state is its own ancestor.
  set_ancestor(cur, cur);
  opened = empty_oset();
  closed = empty_cset();
  do
    {
      // closed the current state
      add_cset(cur, closed);
      // get successors of the current state
      successors = get_succ(cur, g);
      // iterate on successors
      while ((adj = next(successors)))
	{
	  // If adj->state is not closed and current path is sheeper
	  // we update the state.
	  if (!isin_cset(adj->state, closed)
	      && get_dist(adj->state) > get_dist(cur) + get_cost(adj))
	    {
	      // update distance
	      set_dist(get_dist(cur) + get_cost(adj), adj->state);
	      // update weight of the state (distance + heuristic)
	      set_weight(get_dist(adj->state) + h(adj->state), adj->state);
	      // current state is the new ancestor of adj->state
	      set_ancestor(cur, adj->state);
	      // open set is ordered using weight and not distance,
	      // this is the difference with Dijkstra's algorithm.
	      update_oset(adj->state, opened);
	    }
	}
 
      // done with current, go to next.
      // get_min returned the minimal element of an ordered open set,
      // or NULL if the set is empty.
      cur = get_min(opened);
    }
  while (cur && !is_state(dst,cur));
 
  // Now, if cur != NULL, it is the destination state and we can
  // extract the full path using get_ancestor recursively until we
  // reach the source state.
}

Le code précédant décrit une version abstraite de l'algorithme: la méthode d'accès aux sommets et aux successeurs (et la nature de la liste de successeurs), la gestion des éléments ouverts et fermés et la gestion des états (sommets en cours de traitement) sont cachés au travers des opérations utilisées dans la fonction (leur nom se veut parlant et le commentaire les accompagnants devrait suffire pour comprendre le code.)

Examples suplémentaires

Voici un donjon simple avec beaucoup d'arc et possibilité de circuit:

ROOMS: 11
MONSTER: 10 420000
BREWERY: 5 5
ARCS
ARC: 1 1 2
ARC: 1 1 3
ARC: 1 1 4
ARC: 1 1 5
ARC: 1 1 6
ARC: 1 1 7
ARC: 1 1 8
ARC: 1 1 9
ARC: 1 1 10
ARC: 2 1 1
ARC: 2 1 3
ARC: 2 1 4
ARC: 2 1 5
ARC: 2 1 6
ARC: 2 1 7
ARC: 2 1 8
ARC: 2 1 9
ARC: 2 1 10
ARC: 3 1 1
ARC: 3 1 2
ARC: 3 1 4
ARC: 3 1 5
ARC: 3 1 6
ARC: 3 1 7
ARC: 3 1 8
ARC: 3 1 9
ARC: 3 1 10
ARC: 4 1 1
ARC: 4 1 2
ARC: 4 1 3
ARC: 4 1 5
ARC: 4 1 6
ARC: 4 1 7
ARC: 4 1 8
ARC: 4 1 9
ARC: 4 1 10
ARC: 5 1 1
ARC: 5 1 2
ARC: 5 1 3
ARC: 5 1 4
ARC: 5 1 6
ARC: 5 1 7
ARC: 5 1 8
ARC: 5 1 9
ARC: 5 1 10
ARC: 6 1 1
ARC: 6 1 2
ARC: 6 1 3
ARC: 6 1 4
ARC: 6 1 5
ARC: 6 1 7
ARC: 6 1 8
ARC: 6 1 9
ARC: 6 1 10
ARC: 7 1 1
ARC: 7 1 2
ARC: 7 1 3
ARC: 7 1 4
ARC: 7 1 5
ARC: 7 1 6
ARC: 7 1 8
ARC: 7 1 9
ARC: 7 1 10
ARC: 8 1 1
ARC: 8 1 2
ARC: 8 1 3
ARC: 8 1 4
ARC: 8 1 5
ARC: 8 1 6
ARC: 8 1 7
ARC: 8 1 9
ARC: 8 1 10
ARC: 9 1 1
ARC: 9 1 2
ARC: 9 1 3
ARC: 9 1 4
ARC: 9 1 5
ARC: 9 1 6
ARC: 9 1 7
ARC: 9 1 8
ARC: 9 1 10
ARC: 10 1 1
ARC: 10 1 2
ARC: 10 1 3
ARC: 10 1 4
ARC: 10 1 5
ARC: 10 1 6
ARC: 10 1 7
ARC: 10 1 8
ARC: 10 1 9
ARC: 10 1 11

Vous pouvez tester ce donjon avec la commande:

PATH 5 1 11

Le chemin le plus court fait 280000 sommets. L'une des refs met entre 1.07s et 1.13s (avec l'entrée standard redirigée sur /dev/null, sans la redirection elle met aux alentours de 1.24s) pour trouver le chemin sur ma machine (attention, il s'agit de l'ancienne ref, la nouvelle va plus vite ... )

Un autre plus simple:

# Salles
ROOMS: 10
MONSTER: 4 4
MONSTER: 9 20
BREWERY: 7 5
DEAD: 3

# couloirs
ARCS
ARC: 1 1 2
ARC: 1 1 3
ARC: 2 1 4
ARC: 2 1 5
ARC: 3 30 6
ARC: 4 1 5
ARC: 5 6 2
ARC: 5 1 6
ARC: 6 1 7
ARC: 7 1 8
ARC: 8 1 6
ARC: 8 1 9
ARC: 9 1 10

Encore un simple:

ROOMS: 13
MONSTER: 6 5
BREWERY: 4 10
DEAD: 3
DEAD: 5

ARCS
ARC: 1 1 2

ARC: 2 1 3
ARC: 2 1 7
ARC: 2 1 8

ARC: 3 1 4

ARC: 4 1 5
ARC: 4 1 9
ARC: 4 1 10

ARC: 5 1 6

ARC: 7 1 3
ARC: 7 5 4
ARC: 7 1 8
ARC: 7 1 9

ARC: 8 1 3
ARC: 8 5 4
ARC: 8 1 7
ARC: 8 1 10

ARC: 9 1 5
ARC: 9 2 11

ARC: 10 1 5
ARC: 10 1 12

ARC: 11 1 5
ARC: 11 1 6
ARC: 11 1 7
ARC: 11 1 13

ARC: 12 1 5
ARC: 12 1 6
ARC: 12 1 8

Avec par exemple la commande:

PATH 5 1 13