Из интереса, где-то с 30 запросов (притом на русском языке) к 3-й версии ChatGPT получилось объяснить условие задачи. Часть запросов “отладочные”, чтобы понять, то, что пытается делать ИИ с моделью.
Примеры: “Попробуй выполнить операции - сдвиг вправо 2-й строки, сдвиг вправо 3-й строки, сдвиг вправо 4-й строки. Примени каждую из них к начальной позиции”
“Теперь попробуй выполнить операцию «сдвиг 4го столбца вверх» по шагам”
Во втором шаге ошибка — столбец 14 24 34 44 при сдвиге вверх станет 24 34 44 14
Ощущения — как от объяснения не очень умному школьнику, 4-я версия наверное быстрее уловит смысл. Но с момента, когда просишь переписать решение на Python, “школьник” безошибочно пишет функцию применения всех операций к исходной позиции, и поиск в ширину.
Дальше — интересней, ИИ может дописать оптимизацию с сортировкой с помощью функции оценки — предлагает эвклидово расстояние, а также манхеттенское расстояние и расстояние чебышева. C расстоянием эвклида он доходит до хорошей скорости выполнения. ИИ использовал для хранения списка открытых вершин PriorityQueue. Это даёт отличающийся от моей самой первой программы (которая использует для хранения list и сортирует его каждые N шагов) результат — находит путь в 10 шагов, а не 9.
ИИ предложил добавить в код замену функции оценки с эвклидова расстояния на манхеттенское (при этому утверждает, что для “пятнашек”, за которые он принял эту задачу, эта функция гарантированно даёт лучшую оценку, хотя я не стал бы ему доверять в таких утверждениях). С jupyter notebook обращение к ИИ за переписыванием кода может выглядеть примерно так:
Это позволило ИИ дойти до решения в 9 шагов, однако увеличило время выполнения с 2 до 10 секунд. Дальнейшие предложенные ChatGPT методы оптимизации — распараллеливание работы, построение предпросчитанной базы решений и переход на С++.
Ни одним из них он не справился сам. Мне не удалось заставить его реализовать свою наивную идею, или предложить её — “если мы знаем, что функции оценки не очень хорошие, то вместо использования очереди приоритетов на каждом шаге, проверим заодно еще группу решений с немного худшей оценкой и посмотрим, не нашлось ли там решения лучше”. Скорее всего, я просто не знаю “правильного” названия этого метода, поэтому пришлось дописать эту логику самому.
Интересно, что при этом я случайно обнаружил, что существует решение не в 9, а 8 шагов:
Когда есть возможность быстро попробовать много вариантов, среди них больше шансов обнаружить лучший