/* * This file is part of the Symfony package. * * (c) Fabien Potencier * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } } if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } } if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } } if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } } if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } } if (!function_exists('mb_convert_case')) { function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } } if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } } if (!function_exists('mb_language')) { function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } } if (!function_exists('mb_list_encodings')) { function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } } if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } } if (!function_exists('mb_check_encoding')) { function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } } if (!function_exists('mb_detect_order')) { function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } } if (!function_exists('mb_parse_str')) { function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } } if (!function_exists('mb_strlen')) { function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } } if (!function_exists('mb_strpos')) { function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strtolower')) { function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } } if (!function_exists('mb_strtoupper')) { function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } } if (!function_exists('mb_substitute_character')) { function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!function_exists('mb_substr')) { function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } } if (!function_exists('mb_stripos')) { function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_stristr')) { function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strrchr')) { function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strrichr')) { function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_strripos')) { function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strrpos')) { function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } } if (!function_exists('mb_strstr')) { function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } } if (!function_exists('mb_get_info')) { function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); } } if (!function_exists('mb_http_output')) { function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } } if (!function_exists('mb_strwidth')) { function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } } if (!function_exists('mb_substr_count')) { function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } } if (!function_exists('mb_output_handler')) { function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } } if (!function_exists('mb_http_input')) { function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } } if (!function_exists('mb_convert_variables')) { function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } } if (!function_exists('mb_ord')) { function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } } if (!function_exists('mb_chr')) { function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } } if (!function_exists('mb_scrub')) { function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } } if (!function_exists('mb_str_split')) { function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } } if (!function_exists('mb_str_pad')) { function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } } if (extension_loaded('mbstring')) { return; } if (!defined('MB_CASE_UPPER')) { define('MB_CASE_UPPER', 0); } if (!defined('MB_CASE_LOWER')) { define('MB_CASE_LOWER', 1); } if (!defined('MB_CASE_TITLE')) { define('MB_CASE_TITLE', 2); } En búsqueda del algoritmo del viaje perfecto con Speakspots ~ TecnoBlog – Ultimas Noticias Venezuela
Qué es el SEO técnico y qué tener en cuenta
Como mencionamos en nuestro artículo sobre SpeakSpots, esta herramienta es una innovadora inteligencia artificial creada para la planificación inteligente de viajes. SpeakSpots organiza nuestros viajes basándose en las fechas y preferencias que le proporcionamos. Solo tenemos que elegir un destino y seleccionar nuestras atracciones favoritas, y el motor inteligente de la compañía se encargará de personalizar un itinerario óptimo para nosotros, detallado minuto a minuto.

Speakspots

¿Pueden las matemáticas diseñar un viaje perfecto y a tu medida?

El pensamiento de Platón fue influido por la filosofía pitagórica, especialmente en su aplicación de las matemáticas para comprender el mundo. El pensador griego utilizó conceptos matemáticos para explorar cuestiones tan variopintas como la ética, la política o la metafísica.

¿Podría una IA describir el viaje perfecto mediante una ecuación matemática de utilidad?

En Speakspots creemos que sí. Desde 2019 hemos estado desarrollando nuestra propia tecnología de extracción web, análisis y recomendaciones personalizadas para la planificación de viajes, con el objetivo de que cada viajero viva una experiencia única e irrepetible.

Aristóteles, en su Ética a Nicómaco, exploró la naturaleza de la felicidad, argumentando que aunque todos buscamos la felicidad, cada uno la alcanza de manera diferente. Siguiendo esta línea de pensamiento, creemos que cada experiencia de viaje tiene que ser única y adaptarse a los gustos y presupuesto de cada uno. La función de utilidad a maximizar en un viaje es única para cada individuo y además, va cambiando a lo largo de la vida del individuo (¡o incluso a lo largo del día, según nuestro estado de ánimo!).

Las variables que definen el viaje perfecto

Planificar un viaje implica tomar numerosas decisiones: ¿Adónde ir? ¿Cuándo viajar? ¿Cómo moverse? ¿Dónde alojarse? ¿Dónde comer? ¿Qué actividades realizar?.

Next destination writing and tourist supplies

Un super-agente turístico basado en IA podría analizar todas estas opciones, utilizando modelos estadísticos para evaluar la utilidad de cada una según las preferencias y el presupuesto del viajero.

Este agente no solo recomendaría el viaje perfecto, sino que reduciría millones de opciones a unas pocas, facilitando enormemente el proceso de decisión. Pero el asistente del futuro no se quedará ahí. Será capaz de hacer reservas e incluso gestionar pagos en nombre del viajero, llevando la planificación de viajes a un nuevo nivel digno de Jarvis (el Agente IA de Iron Man).

Limitaciones de la IA generativa en el diseño del viaje perfecto

Aunque las IAs Generativas son muy eficaces en la interpretación de preguntas y en formular respuestas precisas, presentan limitaciones a la hora de recopilar e interpretar grandes volúmenes de datos en tiempo real para proporcionar una solución completa y detallada.

The Economist lo resume bien: «Pregúntales (a los agentes de IA) que planifiquen un viaje a Berlín basado en tus preferencias de ocio y presupuesto, incluyendo qué atracciones ver, en qué orden, y qué tickets de tren comprar… y te decepcionarán».

La solución tecnológica de Speakspots

Después de cinco años de desarrollo, en Speakspots contamos con una IA convencional matemática que es capaz de proporcionar recomendaciones personalizadas de actividades turísticas y alojamiento para el destino seleccionado por el usuario. Cada vez que un turista planifica un viaje con nosotros, sólo tiene que responder un cuestionario de 10-12 preguntas y dejar que nuestro motor realice más de 150.000 cálculos para encontrar el itinerario y alojamiento perfecto.

Además, estamos en proceso de expandir nuestra base de datos con un catálogo de restaurantes y vuelos antes de que finalice este año. Con esta integración, estaremos todavía más cerca del super-asistente de viajes del futuro, pudiendo ayudar al viajero a inspirarse y escoger el mejor destino para su viaje de entre cientos de destinos.

Nuestra recopilación de datos se basa en tecnología propia y procesos con un alto nivel de supervisión humana. Nos nutrimos principalmente de fuentes oficiales, como webs de atracciones turísticas y páginas de ayuntamientos, así como de integraciones en tiempo real con socios como Civitatis (actividades), Tiqets.com (entradas) y Booking.com (hoteles).

Detrás de cada uno de los más de 120 destinos disponibles en Speakspots (aumentando a un ritmo de 20-25 nuevos destinos al mes), hay un riguroso proceso de recolección de información que incluye revisiones en tres niveles por parte de nuestro equipo (tres personas distintas participan en la integración de cada nuevo destino).

La estructura de costes de Speakspots

Speakspots es una plataforma completamente gratuita para los usuarios, sin suscripciones ni letra pequeña. Esto es posible gracias a nuestras alianzas con OTAs (Online Travel Agencies), que comparten un porcentaje de sus ventas con nosotros.

Nuestra infraestructura tecnológica propia y madura nos permite mantener los costes variables al mínimo, a diferencia de otras empresas de IAs de viajes más jóvenes que dependen en gran medida de proveedores externos y costosos como OpenAI. Su estructura de alto coste variable, les fuerza a implementar modelos de suscripción Premium/Freemium que inevitablemente frenarán su crecimiento en detrimento de asistentes gratuitos y más sofisticados como el nuestro.

* Artículo de Andrés Martínez *

Andrés Martínez

BIO

El emprendedor menorquín Andrés Martínez Artal ha visitado más de cien ciudades de Europa y se ha inspirado en sus errores de planificación para programar los algoritmos de Speakspots. Andrés ha sido incluido en la lista de Forbes 2024 como uno de los profesionales más creativos del mundo de los negocios.

LinkedIn: Andrés Martínez

Ver fuente

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *