Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
2 на обратном пути между перевозкой волка и капусты, коза переезжает с того берега на этот.По условиям оригинальной задачи, перемещение возможно только с участием крестьянина. А так получается у нас какая-то квантовая физика уже, коза как бы еще там но уже не там. В классической машине Тъюринга нет неопределенности. Или мы в одном состоянии или в другом. Нет никакого промежуточного состояния. Как и нет процесса. Т.е. процесс конечно можно смоделировать в пригодном для машины Тьюринга виде, но это будет тоже состояние. Машина Тьюринга не имеет памяти, т.е если остановить ее в какой-то момент, а потом запустить снова, она просто продолжит выполнять свой алгоритм с того места на котором остановилась. (Чего не делают, кстати сказать современные персональные компьютеры)
В результате мы имеем на выходе полную симметрию начальному условию:Да, в задаче есть симметрия. Это видно из расположения допустимых состояний на ленте, они симметичны относительно середины. Если развернуть ленту в машине Тьюринга, но не изменять программу, то когда коза на одном берегу, а все остальные на другом, машина дойдет до решения за два перехода: крестьянин поедет за козой и перевезет ее на берег, где волк, в гордом одиночестве, пасет капусту.
… Осталось забрать козу.
По условиям оригинальной задачи, перемещение возможно только с участием крестьянина. А так получается у нас какая-то квантовая физикавы здесь путаете физику и математику. Мы не обсуждаем детали перемещения козы, мы составляем математическую модель которая полностью описывает процесс, и эта «квантовая» коза просто напросто исключение математически незначащего случая — кто бы ни был с крестьянином, с ним всё будет в порядке, а вот «фейл» может произойти только в комбинациях на берегу. Так проще. Попробуйте применить свою модель не учитывая крестьянина и того кто с ним, и сами убедитесь что она станет проще.
от «мужика» избавиться не получается, это было бы недопустимым упрощением.
Продолжим мысленный эксперимент, пусть у нас будет портал, в который можно войти либо с одной стороны либо с другой. Перенеся один предмет через портал нельзя перенести следующий предмет в том же направлении, не перенеся какой-то предмет обратно.а случай когда мужик перевозит козу, потом возвращается обратно за капустой(не возвращая предмет обратно) не тот?
Челнок находится на другом берегу. Там где коза. Возвращаем челнок к волку с капустой. Кого бы мы не переправили на другой берег (к козе) мы получим не допустимое состояние.
Эта производная задача не решается.
представьте, что у нас может происходить телепортация предмета с берега на берег(крестьянин увёз козу), или телепортационный обмен предметов на противоположных берегах(привёз капусту, увёз козу обратно) — одно из двух,это не какая-то «производная задача», это и есть та же самая задача, понимаете? И тогда у нас исчезает фигура крестьянина из таблицы, начисто. И при этом таблица полностью описывает задачу, здесь нет никакого обмана или искажения, это типа «тождественного преобразования».
Динамическое программирование тут нужно, а не ооп и алгоритмизация рассуждениями.
2 волка, 2 козы, 2 капусты — задача уже неразрешима. Что бы крестьянин ни взял в лодку, будут жертвы.
#!/bin/bash
left_side=('goat' 'cabbage' 'wolf')
right_side=()
function check {
case $1:$2 in
'goat':'cabbage' | 'cabbage':'goat' | 'wolf':'goat' | 'goat':'wolf' )
return 1;;
*) return 0;;
esac
}
while [[ ${left_side[@]} ]]; do
for i in ${left_side[@]}; do
passenger=${left_side[0]}
unset left_side[0]; left_side=(${left_side[@]})
check ${left_side[@]} && {
right_side+=("$passenger")
echo -e "${left_side[@]}\n$passenger -->\n${right_side[@]}\n"
} || {
left_side+=("$passenger")
continue
}
check ${right_side[@]} || {
passenger=${right_side[0]}
unset right_side[0]; right_side=(${right_side[@]})
left_side+=("$passenger")
echo -e "${left_side[@]}\n<-- $passenger\n${right_side[@]}\n"
continue
}
done
done
#!/bin/bash
left_side=(${1:-'goat'} ${2:-'cabbage'} ${3:-'wolf'})
right_side=()
function check {
case $1:$2 in
'goat':'cabbage' | 'cabbage':'goat' | 'wolf':'goat' | 'goat':'wolf' )
return 1;;
*) return 0;;
esac
}
while [[ ${left_side[@]} ]]; do
passenger=${left_side[0]}; unset left_side[0]; left_side=(${left_side[@]})
check ${left_side[@]} \
&& { right_side+=("$passenger")
echo -e "${left_side[@]}\n$passenger -->\n${right_side[@]}\n"; } \
|| { left_side+=("$passenger"); }
check ${right_side[@]} || {
passenger=${right_side[0]}
unset right_side[0]
right_side=(${right_side[@]})
left_side+=("$passenger")
echo -e "${left_side[@]}\n<-- $passenger\n${right_side[@]}\n"
}
done
Задача о переправе