Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [prolog]Задача про шары


Автор: Sheb 21.1.2007, 01:29
Заново создаю ... Ничего не хотел нарушать ,если по сути кто-нибудь поможет ,буду очень сильно благодарен и признателен ... 

1)Добрый день ! Огромная просьба каким-либо образом в решении одной задачи ... Ко вторнику кровь из носа как нужна ! Если кто поможет ,буду очень сильно признателен !!!

Условие задачи : Вдоль доски расположены лунки ,в каждой из которых лежит синий ,красный или белый шар ,за один ход можно менять местами два любых шара . Добиться того ,что сначала шли все красные шары , потом все белые,а потом все синие . Решить задачу за наименьшее число ходов . Нужно хронометрировать и анализировать решение задачи для стратегий поиска в глубину ,поиска в ширину и поска в глубину с итеративным погружением для нахождения кратчайшего пути .Проанализировать эффективность ,безопасность и полноту решения . 

Очень прошу ,друзья ...!


2)И еще один вопрос возник ... Вот в книге Братко обнаружил решение задачи "разбиения простого списка по признаку первый-второй " ... Если запускать эту программу ,то в первом списке ,где как раз находятся все "первые" выводится мусор . Второй же список правильный ... Не подскажете ,в чем ошибка ? 
Фрагмент программы на прологе :

разбиениесписка( [ ], [ ], [ ]).                           % Разбивать нечего

разбиениесписка( [X], [X], [ ]).
                            % Разбиение одноэлементного списка

разбиениесписка( [X, Y | Список], [Х | Список1],
                                [Y | Список2]) :-
    разбиениесписка( Список, Список1, Список2).

Автор: Artemios 21.1.2007, 03:38
Цитата(Sheb @  21.1.2007,  01:29 Найти цитируемый пост)
Если запускать эту программу ,то в первом списке ,где как раз находятся все "первые" выводится мусор .


Как это не смешно, но в записи
Цитата(Sheb @  21.1.2007,  01:29 Найти цитируемый пост)
разбиениесписка( [X, Y | Список], [Х | Список1],
                                [Y | Список2]) :-
    разбиениесписка( Список, Список1, Список2). 

первая переменная X -- английская икс, вторая Х -- русская хэ. Соответственно получается, что это разные переменные. Так как для построения первого списка используется неунифицированная переменная, то соответственно в списке и получаешь мусор. При замене русской хэ на английскую икс, или наоборот, все работает правильно.

По поводу задачи -- посмотри в том же Братко различные способы упорядочения (сортировки) списка, ибо твоя задача -- именно упорядочение и есть (замени слова красный, синий, белый на цифры 1,2,3)

Автор: Artemios 23.1.2007, 01:19
Цитата(Sheb @  21.1.2007,  01:29 Найти цитируемый пост)
за один ход можно менять местами два любых шара .

Под задачу сортировки с этим условием подходит метод пузырьковой сортировки.
Код

после(синий,белый).
после(синий,красный).
после(белый,красный).

перестановка([X,Y|T],[Y,X|T]):-
    после(X,Y),!.

перестановка([X|T],[X|T1]):-
    перестановка(T,T1).

пузырьковая_сортировка(L,L1):-
     перестановка(L,LL),
     !,
     пузырьковая_сортировка(LL,L1).
пузырьковая_сортировка(L,L).


и делаем проверку:
Цитата

?- пузырьковая_сортировка([белый,красный,синий,красный,белый,синий],Доска).

Доска = [красный, красный, белый, белый, синий, синий] 

Yes
?- 


А вот с этим:
Цитата(Sheb @  21.1.2007,  01:29 Найти цитируемый пост)
Нужно хронометрировать и анализировать решение задачи для стратегий поиска в глубину ,поиска в ширину и поска в глубину с итеративным погружением для нахождения кратчайшего пути .Проанализировать эффективность ,безопасность и полноту решения . 

я ничего не понял smile

Автор: Sheb 23.1.2007, 01:49
Artemios

Спасибо ОГРОМНОЕ за задачу ,очень благодарен!!!!!!! Насчет хронометризации и анализа уточню у препода ,что он там имел в виду и отпишусь smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)