?

Log in

No account? Create an account

Previous Entry | Next Entry

Взбесившаяся телешка

  • 29th Oct, 2015 at 5:57 AM
rabotka2
Щяс расскажу что я думаю об этической проблеме вагонетки, которую трудно решить алгоритмически.

То есть, есть одна группа рабочих R и другая группа рабочих Д, и известно что R > Д. Если вагонетка V сейчас неминуемо раздавит группу рабочих R, этичен ли алгоритм автоматического переключения вагонетки V на запасной путь Z, где она неминуемо раздавит Д, но при этом не раздавит R? Или надо спасти Д, а R пусть как хочет? Каково множество значений R и Д, при котором такой алгоритм "можно"? И т.д.

Эту проблему можно преобразовать как "В такой ситуации любое решение плохое". Говоря компьютерным языком, операция невозможна если Д>0 или R>0 одновременно, вот и все. Такая проблема возникает довольно часто, но Человеческий моск так устроен, что он сразу начинает пытацца решать проблему, даже если эта проблема не требует решения, ибо проблема с этой проблемой вовсе не в самой проблеме, а вообще в другой проблеме.

Попробую привести иллюстрацию. "Как пройти по потолку не расплескивая воду из ведра"? А никак. Теоретически не должно быть такой ситуации, при которой это надо.

* * *

При условии, что проблема правильно сформулирована, компилятор решает "проблему вагонетки" очень хорошо. Компилятор можно попросить или запретить вагонетки, или запретить рабочих. Тогда эта проблема становицца невозможной в принципе. "Грубовато", но это работает. Если же скажут, ну зачем нам тогда, допустим, вагонетки если нет рабочих, то решение еще лучше: попросить компилятор запретить и вагонетки и рабочих. Если начнут орать "Ну давайте теперь вообще всё запретим, да??", то хороший компилятор должен сказать: "А давайте. Потому что на сегодняшний день вам нельзя доверять одновременно и вагонетки и рабочих, ибо мне уже заранее известно, чем это кончицца".

Тут очень важный аспект, что компилятору это действительно уже известно заранее.

* * *

Но есть и более тонкие решения. Лично мне очень импонирует запустить на эту стройку отрицательное число рабочих. Концептуально мы их не "запретили", но мы теоретически исключили возможность ошибки, это можно доказать математически: если R+Д<0, то R+Д не может быть >0 :) значит или R <= 0, или Д <= 0, или оба R и Д <= 0, значит можно принять одно из двух умных решений: или перевести телешку на тот путь, на котором нет рабочих, или она едет по уже пустому пути, в этом случае пусть она громыхает дальше пока не треснет.

Другое решение, довольно популярное в программировании. Зделать невозможным существование более одной группы рабочих. То есть в любой промежуток времени или R=0, или Д=0. Но компилятор не может это контролировать, следовательно рано или поздно обязательно кто-то напишет код, при котором этот принцип будет нарушен.

Ну и есть еще вариант, при котором число всех путей (включая запасной путь Z) всегда равно количеству групп рабочих + 1. Увы, в программировании этот принцип считаецца затратным, и кодировщики предпочитают вместо увеличения количества запасных путей увеличить количества запасных рабочих, исходя из "оптимистической стратегии" (т.е. пусть будут иногда сбои, но все остальное время система будет работать очень быстро). Это решение еще плохо тем, что при большом количестве групп рабочих есть вероятность, что срывов телешки будет стоко много, что они просто заполнят весь запасной путь Z, а за ним и все остатки всех не запасных путей тоже, и переключать уже будет некуда. "Всё предприятие встанет". Такой шизофренический сценарий кажецца нереальным, но в программировании это обычная ситуация, которую надо предусматривать.

Другая методика заключаецца в циклическом переключении телешки с пути П на Z, а потом, в случае необходимости, обратно на П, потом снова на Z и так до тех пор, пока наше условие правильности алгоритма не будет выполнено (т.е. while (R>0 && D>0){...}). Увы, это теоретически может привести к вечному переключению телешки, то есть хотя бы иногда должны быть гарантированные уходы всех рабочих со стройки, и тогда этот критерий можно тоже вписать в while, тогда все будет хорошо. Скажут, но ведь каждый раз телешка будет приближацца к группам рабочих все ближе и ближе, пока наконец она всех не передавит. Забывают, что при продолжении переключения это приближение будет происходить бесконечно, на бесконечно малые величины приближаясь каждый раз, миллионы лет. Но процессор это кончено загубит, потому что с годами таких фантомных тележек наберецца очень много, если их специально не отлавливать раз в сколько-то миллисекунд. Теоретически взбесившихся тележек может оказацца больше чем переключателей, что тогда? Часть из них "сумеет пройти", вот что. Поэтому число тележек не должно превышать числа переключателей, из теоретического соображения что все 100% тележек могут взбесицца одновременно. В программировании это тоже обычный сценарий.

Ну и, наконец, один из самых виртуозных методов: сконструировать весь завод так, чтобы в любой ситуации телешки удалялись от рабочих, а не приближались к ним. Тогда никто никого никогда не задавит при любом количестве групп, тележек, переключателей и запасных путей. Да, это "трудно", ибо это очень серьезное архитектурное требование, сильно усложняющее дизайн. Но для этого у Человека как раз и есть моск.

* * *

То есть решение невозможно без правильной постановки вопроса. Мы преобразовали логически не имеющий решения и оттого заведомо бессмысленный вопрос "как выбирать между А и Б если выбрать нельзя" в "как не выбирать между А и Б если не выбирать можно, а выбрать может и нельзя". И сразу получили много интересных и умных ответов.

"Так что" желаю всем щястья и радости, и чтоб поменьше взбесившихся тележек :)


Comments

( 6 comments — Leave a comment )
yoksel_moksel wrote:
29th Oct, 2015 14:22 (UTC)
В моей френдленте посты про компиляторы встречаются не часто. Может быть раз в месяц (но я их не замечаю), но, скорее, раз в год. Тем удивительнее два поста почти одновременно. http://m-sch.livejournal.com/553735.html
nasha_sasha wrote:
29th Oct, 2015 15:33 (UTC)
Он скорее описывает не алгоритмические проблемы, а грамматические сложности интерпретации. Например, проблемы "балаган летит в жару и в холод" на (условно говоря) английском не существует, ибо там есть грамматическая разница между "балаган летит в жару" и "балаган летит в the жару". Но в каждом языке есть проблемы интерпретации даже в "надежных" грамматических конструкциях, например в Человеческих языках индоевропейской группы невозможно "однозначно" ответить на вопрос "Вы хотите груши или яблоки?", ибо непонятно, удовлетворяет ли ответ "Да" и яблокам и грушам, или только яблокам, или только грушам, из ответа "Да" можно токо с уверенностью понять, что присутствие какого-то не нулевого подмножества данного множества его устроит, "может быть даже тождественное".
yoksel_moksel wrote:
29th Oct, 2015 15:48 (UTC)
Однозначно, груши.

nasha_sasha wrote:
29th Oct, 2015 15:54 (UTC)
Не совсем: вы хотите яблоки или груши [а не лимоны или апельсины]? Может ему все равно, Я или Г, лишь бы что-то одно из двух, но при этом не и то и то. "Так бывает".
yoksel_moksel wrote:
29th Oct, 2015 17:40 (UTC)
А с человеком как угодно бывает. Он может подстраиваться под условия, а может капризничать. Ты ему решение проблемы с вагонетками, а он говорит, что нет денег на переключатели путей.
nasha_sasha wrote:
29th Oct, 2015 18:35 (UTC)
Компьютер точно также: "main memory кончилась", например. Или stack overflow там. Или слишком много открытых файлов. Или "число кончилось".
( 6 comments — Leave a comment )