новости сообщество форум вики
Erlang по-русски. Форум » Erlang »

Ре?ение задач алгоритмического типа на erlang. {F,W,G,C}

(5 posts)

  1. В общем мне нужно написать жадный алгоритм для задачи о волке , капусте и козе... Вот то, что я уже написал:

    -module (tgulab).
    -export ([list_max/1]).
    -export ([list_min/1]).
    -export ([list_append/2]).
    -export ([list_length/1]).
    -export ([func_fib/1]).
    -export ([change_state/2]).
    -export ([unsafe_state/1]).
    -export ([perms/1]).
    -export ([move/2]).
    -export ([path/4]).
    -export ([get_element/2]).
    -export ([go/2]).

    %%% переправа волка козы и капусты

    % изменение состояния на противоположное
    change_state(S1,S2)->
    if
    S1 == "w" -> S2 = "e", true;
    S1 == "e" -> S2 = "w", true;
    true-> false
    end.

    % небезопастные состояния в мире
    unsafe_state({X,Y,Y,_})->
    change_state(X,Y),
    false;
    unsafe_state({X,_,Y,Y})->
    change_state(X,Y),
    false;
    unsafe_state(_)->
    true.

    % определяем перемещения в мире
    move({X,X,G,C},{Y,Y,G,C})->
    unsafe_state({Y,Y,G,C}),
    change_state(X,Y),
    io:format("goto Man and Wolf.~n",[]);
    move({X,W,X,C},{Y,W,Y,C})->
    unsafe_state({Y,W,Y,C}),
    change_state(X,Y),
    io:format("goto Man and Goat.~n",[]);
    move({X,W,G,X},{Y,W,G,Y})->
    unsafe_state({Y,W,G,Y}),
    change_state(X,Y),
    io:format("goto Man and Cabbage.~n",[]);
    move({X,W,G,C},{Y,W,G,C})->
    unsafe_state({Y,W,G,C}),
    change_state(X,Y),
    io:format("goto only Man.~n",[]);
    move(S,S)->
    io:format("return fail.~n",[]);
    move(_,_)->
    io:format("return error!~n",[]).

    perms([]) -> [[]];
    perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].

    %построение пути
    path(Goal, Goal, _, [Goal])->
    % lists:reverse(BeenStack);
    ok;
    path(State, Goal, Visited, [State|Path])->
    move(State,NextState),
    not lists:member(NextState,Visited),
    path(NextState,Goal, [NextState|Visited], Path).

    % начинаем поиск
    go(Start, Goal)->
    path(Start, Goal,[],[Start]).

    /// желательно, чтобы это был поиск с помощью жадного алгоритма...

    1) состояния системы описаны
    2) нужно дописать сам поиск
    3)) тут у меня как раз и возникли проблемы
    4))) заранее -- спасибо

    Отправлено 1 год назад #
  2. Пытаюсь разобраться.

    Функцию change_state/2 не понял. Присваивание S2 будет либо бессмысленным, либо исключение вызывать... Что-то другое хотели написать?

    Отправлено 1 год назад #
  3. unsafe_state и change_state зачем-то логические выражения возвращают, но их результат нигде не используется...

    Очень сырая программа, задумка не ясна.

    Отправлено 1 год назад #
  4. -module(koza).

    -export([go/0]).

    %% Проверка безопасности данного набора предметов - не съедят ли они друг друга.
    safe([]) ->
    true;
    safe(List) ->
    W = lists:member(w, List),
    G = lists:member(g, List),
    C = lists:member(c, List),
    not ((W and G) or (G and C)).

    %% Проверка допустимости пути
    good_step([X,X | _]) -> %% Возим одно и то же вперед-назад
    false;
    good_step(Path) when length(Path) > 20 -> %% Путь длинее 20 ?агов
    false;
    good_step(_) ->
    true.

    %% Возвращает список вариантов следущего ?ага. [{КогоВезем, БудетСлева, БудетСправа}]
    %% Параметры - текущее состояние левого и правого берега.
    next_step(L, R) ->
    case safe(L) of %% Безопасно на левом берегу?
    false -> [{X, L--[X], R++[X]} || X <- L, safe(L--[X])];
    true ->
    case safe(R) of %% Безопасно на правом берегу?
    false -> [{X, L++[X], R--[X]} || X <- R, safe(R--[X])];
    true -> [{X, L--[X], R++[X]} || X <- L]
    end
    end.

    %% Успе?ное окончание - на левом берегу пусто.
    step(P, [], _R) ->
    io:format("FINISH ~w~n", [P]);

    %% Очередной ?аг
    step(P, L, R) ->
    io:format("~w~n", [P]),
    [step([Step|P], NewL, NewR) || {Step, NewL, NewR} <- next_step(L, R), good_step([Step|P])].

    %% Перевезти всех с левого берега на правый. Поиск всех вариантов.
    %% w - волк, g - коза, c - капуста.
    go() ->
    step([], [w,g,c], []).

    Отправлено 1 год назад #
  5. Еще подумаю, должно получиться сильно короче.
    В варианте вы?е P - путь (очередность перевозки), без учета возвратов порожняком, в обратном порядке, т.е. читать справа налево.

    Отправлено 1 год назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.

 
 

так же

Популярные тэги



Currently online

No Members around.

twitter