Wie - Graph-Färbung in Prolog

Ich versuche, mich der einfache graph-coloring-Algorithmus in Prolog, aber ich bin ein bisschen eine harte Zeit zu verstehen, die Sprache. Ich weiß, was ich will - ich will gehen zu einem Eckpunkt, alle anderen vertices verbunden sind, überprüfen Sie meine vertex Farbe, und abhängig davon die Farbe der anderen Knoten mit verschiedenen Farben. Ich habe gerade eine harte Zeit zu übersetzen und diese zu Prolog. Wenn es ein C-Dialekt oder Java, es wäre ein Stück Kuchen für mich, aber das ist was mir passt.

Dies ist, was ich habe, so weit:

main:- graph_coloring.

%color_list([blue, red, green, yellow, white], colors).
%vertex_list([a, b, c, d], vertices).
%edge_list([(a,b),(b,c),(c,d)], edges).

%Our graph
color(blue).
color(red).
color(green).
color(black).
color(white).

%graph([a-b, b-c, b-d, c-d]).

vertex(a).
vertex(b).
vertex(c).
vertex(d).

%Subject to changing, so are asserted into listener at runtime.
init_dynamic_facts:-
    assertz(vertex_color(a, none)),
    assertz(vertex_color(b, none)),
    assertz(vertex_color(c, none)),
    assertz(vertex_color(d, none)),
    assertz(location(a)).

edge(a,b).
edge(b,c).
edge(b,d).
edge(c,d).

is_connect(A,B):-
    edge(A,B).
is_connect(A,B):-
    edge(B,A).

connections(Vertex):-
    edge(Vertex,X).
connections(Vertex):-
    edge(X,Vertex).

move(Vertex):-
    retract(location(_)),
    asserta(location(Vertex)).

paint_vertex(Vertex, Color):-
    retract(vertex_color(Vertex,_)),
    asserta(vertex_color(Vertex, Color)).

find_vertex_color(Vertex):-
    vertex_color(Vertex, X).


graph_coloring:-

    location(Current_vertex),
    vertex_color(Current_vertex, Curr_color),
    ( Curr_color =:= none ->
        connections(Current_vertex, Others),
        vertex_color(Others, Other_colors),
        paint_vertex(Current_vertex, 

Wie kann ich dieses Algorithmus?

(edited: mehr code unter graph_coloring)

  • Wollen Sie nicht gehen, um eine verfärbungsfreie vertex, dann wählen Sie eine Farbe, die nicht von jedem Nachbar-vertex?
  • Ich fange an mit keine Scheitelpunkte gefärbt, obwohl, um sicher zu sein, könnte es besser sein, eine Farbe zuweisen, die erste und tun, was du sagst.
  • Können Sie etwas konkreter über das, was Problem, das Sie haben?
  • Ich versuche zu tun, der graph-coloring-Algorithmus in prolog, aber es ist so anders als alles, was ich verwendet habe, ich bin mir auch nicht ganz sicher, wo zu beginnen. Zum Beispiel Variablen. Sie werden verwendet, anders als im prolog, und ich habe Sie auch schon gebeten anders. Zum Beispiel, in C# kann ich sagen Variable_I_want = Method_that_returns_the_variable(). Ich kann es nicht ganz tun, dass im prolog, und ich haven ' T bekommen mein Kopf herum, wie dies der "prolog Weg".
  • Vielleicht sollten Sie beginnen mit etwas einfacherem, wie die Zuordnung aller Ihrer Scheitelpunkte einer bestimmten Farbe.
  • Was ich brauchen würde, dann ist ein Weg zum vergleichen der Scheitelpunkte' Farben, um Sie zu ändern, wenn ich muss. Ich kann zum Beispiel sagen: in C#: color_list //enthält alle Farben vertex_list // alle Eckpunkte für v in vertex_list { // Finden Sie heraus, die Farben der benachbarten Ecken zu v, und wenn die Farbe ist die gleiche, es ändern. } Dies ist im wesentlichen das, was ich versuche zu tun, aber ich weiß nicht, wie.
  • Wenn man das tut, Logik-Programmierung, die Sie wollen, um zu vermeiden, denken über die Dinge verändern. Stattdessen bauen Sie eine Antwort. Zur Beantwortung größerer Fragen, Sie bitten, kleinere Fragen. Zum Beispiel, um die Frage zu beantworten "wie sollten alle diese Eckpunkte gefärbt werden?", Sie müssen zuerst die Frage: "wie sollte der erste Eckpunkt gefärbt werden?", dann "wenn der erste Eckpunkt hat die Farbe X, was soll dann der zweite vertex-Farbe sein?"

InformationsquelleAutor Tino | 2012-05-23
Schreibe einen Kommentar