Логическая логика - это основа того, как работают компьютеры: цифра означает единицы и нули, а единицы и нули - это еще один способ выразить булеву логику. В этом мире все либо истинно, либо ложно, здесь нет «может быть», нет неуверенной паузы, нет беспокойства, вызывающего новые мысли. Этот тип логики восходит к Аристотелю с «законом исключенного третьего». Вот Википедия:

В логике закон исключенного среднего (или принцип исключенного третьего) является третьим из трех классических законов мышления. Он утверждает, что для любого предложения либо это предложение истинно, либо его отрицание истинно.

С одной стороны, это работает невероятно хорошо. (См. Математика, Наука, полет на Луну и т. Д.) Но у этого вида мышления есть пределы, особенно когда мы имеем дело с частичным и развивающимся знанием мира. Нам нужно создать (еще один) слой поверх логической логики, чтобы помочь понимать события по мере их возникновения.

Мы создаем приложение, которое будет отслеживать, как вы используете свою Tesla. Он называется TeslaTracks и учитывает ваши привычки вождения, использование аккумулятора, эффективность использования энергии и помогает понять экономику и общую привлекательность владения электромобилем.

Давайте поговорим о самом простом вопросе, который мы могли бы задать, и исследуем некоторые проблемы, связанные с пониманием ответа на него.

Ты водишь?

По логике, это утверждение могло быть правдой, а могло быть и ложью. Но как узнать ответ на этот вопрос? Упрощенная версия

  1. Обращаем внимание.
  2. Облачный сервер пытается подключиться к вашему автомобилю по сотовой сети.
  3. Если автомобиль находится в сети, он возвращает состояние передачи.
  4. Если состояние трансмиссии - D, N или R, то мы знаем, что вы едете в определенное время.

(Фактическая логика координирует больше точек данных, включая акселерометр телефона и GPS.)

В мире логической логики машина едет или не едет. В реальном мире, если какой-либо из этих шагов не срабатывает - наиболее распространенная причина заключается в том, что вы едете по местности, где нет сотовой связи, что является огромной частью северо-востока США, где я в основном езжу, а также множество деталей внутри Нью-Йорка, где здания блокируют объекты, или, может быть, вы находитесь в туннеле, или на подземной парковке, или где-то еще - тогда мы не знаем, что вы делаете. Утверждение не является истинным или ложным, в заявлении отсутствуют доказательства, оно может быть истинным или ложным, оно существует в неопределенном состоянии.

В большинстве языков программирования вы не имеете дело с единицами и нулями, вы фактически имеете дело с переменными, которые имеют значения, что приятно, потому что одно из этих значений - «значение не установлено». В языке баз данных SQL даже есть хороший NULL для тех значений, которые просто еще не известны, и я собираюсь использовать эти 70-е заглавные буквы, чтобы разбить его.

Как ответить на вопрос: «Машина едет?» когда мы можем производить отбор проб автомобиля только с нерегулярной частотой и гарантировано некоторое количество сбоев связи?

Во-первых, нам нужно отслеживать, когда мы что-то знаем, знание мира должно быть привязано ко времени и никогда не существует вне его. Затем нам нужно решить, как долго мы будем помнить это без образца. Подавляющее большинство вещей временны, и теория мира должна постоянно подкрепляться поступающими данными и медленно разворачиваться с течением времени, когда там ничего нет. Когда ничего не происходит, мы должны спокойно впасть в спячку.

Шаг 1:

remember_for :driving, 20.minutes
def integrate_event
  know :driving, transmission_engaged?, timestamp
end

Это говорит о том, что нужно помнить о вождении в течение 10 минут без происшествий.

Давайте поговорим о серии событий, когда кто-то проехал с 8:12 до 8:45 через мертвую зону камеры в подземный гараж, где они припарковались. Мы получаем несколько событий, сначала о том, что машина была припаркована, затем несколько событий вождения, прежде чем мы въезжаем в зону с действительно нестабильным обслуживанием в 8:20, и, наконец, несколько событий, прежде чем мы оставим машину на некоторое время в гараже. Затем машина ехала с 11:40 до 12:00, но мы получили только одну жалкую точку данных, все перечисленные слева.

Давайте разберемся, что теперь известно системе о существующих данных. Пока у нас нет данных, мы ничего не знаем. Затем мы знаем, что машина припаркована, и какое-то время едем. Поскольку мы запоминаем на 10 минут, в 8:28 мы «забываем», что машина едет, и снова возвращаемся к тому, чтобы ничего не знать. Затем мы узнаем, что машина едет с 8:30, но снова забываем, что происходит в 8:42, пока не узнаем, что машина остановлена ​​в 8:45. Точно так же поездка вокруг обеда имеет ограниченные данные. Мы знаем, что что-то происходит, но не совсем ясно, только одно событие в 11:45.

Теперь возникает вопрос: как мы интерпретируем эти изменения? Что означает, что мы ехали, а потом не знали, что мы ехали, что нам делать в таких ситуациях?

Мы смотрим на переходы между состояниями. 2 значения с 3 состояниями означают, что всего нужно подумать о 6 вещах.

Мы можем повернуть это вокруг, чтобы увидеть, что происходит, и, основываясь на наших знаниях о мире и том, что мы считаем вероятным, мы можем использовать это для интерпретации изменений состояния:

Итак, давайте возьмем наш пример выше. В 8:12 за рулем возможно_stayed_false или возможно_turned_false, что для нас все равно.

В 8:14 за рулем Turn_true, что очень увлекательно, и мы можем посмотреть на другие датчики, чтобы выяснить, что происходит с аккумулятором, если телефон пользователя находится рядом с машиной, что угодно.

В 8:28 за рулем возможно_turned_false или возможно_stayed_true. Что тут делать? Поскольку мы знаем, что не знаем наверняка, мы предварительно отметим поездку как остановленную и поищем другие потоки данных, которые нам что-то скажут, например данные GPS на телефоне, которые ставятся в очередь и отправляются, как только мы получим в сигнал.

В 8:30 за рулем Turn_true или возможно_stayed_true. Если недавно была поездка, может быть, они являются частью одной? Вот место, которое можно добавить к этой эвристике. (Мы делаем это, просматривая скорость телефона между потенциально новой поездкой и старой поездкой и сравнивая начальные и конечные значения одометра.)

В 8:42 за рулем возможно_turned_false или возможно_stayed_true. Мы были здесь раньше.

В 8:45 за рулем Turn_false или возможно_turned_false. Теперь последняя поездка, помеченная как ориентировочно закрытая, точно закрыта. Где-то между 8:45 и последним осознанием того, что машина двигалась, остановилась в 8:32. Мы можем посмотреть данные одометра, данные GPS и т. Д., Чтобы сделать обоснованное предположение о фактическом времени остановки.

В 8:55 за рулем возможно_stayed_false или возможно_turned_true. Мы знали, что машину остановили, а теперь забыли, что прошло 10 минут. Отсутствие вождения - это состояние покоя, то есть так выглядит мир в состоянии покоя, поэтому мы забываем все, что знаем. Таким образом, при повторном запуске будет как в первый раз.

В 11:45 едет возможно_turned_true или возможно_stayed_true. но у нас нет потенциально открытой поездки к результату, поэтому мы можем сделать вывод, что поездка началась. Где? Когда? Необходимо использовать другие источники данных.

В 11:55, движение возможно_turned_false или возможно_stayed_true. У нас обычно нет хорошего времени начала и хорошего времени окончания. Удачи! Любая дурацкая логика, в которой вам нужно что-то выяснить, теперь изолирована от этого случая, в то время как в других случаях можно полагаться на более точные данные.

Мы коснулись только изменения логического состояния двоичных значений. Есть и другие вещи, которые нужно отслеживать, например увеличивающиеся значения (одометр, время, версия программного обеспечения автомобиля), а также параметры, у которых есть локальные диапазоны, например скорость, расход энергии аккумулятора или скорость зарядки. Для этого требуются разные методы работы с частичными и неполными данными. Основная идея та же:

  1. Получите новый фрагмент данных.
  2. Интерпретируйте новые данные с вашей текущей гипотезой реальности
  3. Обновите эту гипотезу на основе данных или прошедшего времени.

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