SlideShare una empresa de Scribd logo
1 de 41
Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web Santiago Bel Sergio Espeja
Inteligencia Artificial ,[object Object],[object Object]
Usos de la IA ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Métodos de IA ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Algoritmos genéticos aplicados a la publicidad
¿y porqué algoritmos genéticos? ,[object Object],[object Object],[object Object],[object Object]
Algoritmos genéticos ,[object Object],[object Object],Photo by  John Mu http://www.flickr.com/people/ jm123467890 /
Definición académica ,[object Object],[object Object]
Una definición más informal… ,[object Object]
Aplicación del Algoritmo Genético ,[object Object],[object Object]
Darwin’s Evolution Theory… ,[object Object],[object Object],[object Object],[object Object]
Requisitos del Algoritmo Genético ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Ruby y Algoritmos Genéticos ,[object Object],[object Object],[object Object],[object Object],gem install gga4r
Representación del individuo ,[object Object],[object Object],1 2 4 3 ,[object Object],[object Object],1 2 3 4 ad6 ad9 ad3 ad2
Persistencia en RoR
Representación del Individuo ,[object Object],#  id  :integer #  clicks  :integer #  impresiones_restantes :integer #  mutaciones  :integer #  generaciones  :integer #  parejas  :string  # NUM_POSICIONES = 4 class Combinacion < ActiveRecord::Base has_many :posicion_anuncios serialize :parejas def click self.clicks += 1 self.update end def impresion self.impresiones_restantes -= 1 self.update end end ,[object Object],[object Object]
Función de fitness ,[object Object]
Función de fitness ,[object Object],class Combinacion < ActiveRecord::Base def fitness self.clicks.to_f/NUM_IMPRESIONES_COMBINACION.to_f end  end
Función recombine ,[object Object]
Función recombine ,[object Object],[object Object],Padres Hijos 1 2 3 4 5 X ad9 ad3 X ad7 1 2 3 4 5 X ad9 ad3 ad4 ad5 1 2 3 4 5 ad1 ad2 ad3 ad4 ad5 1 2 3 4 5 ad1 ad2 ad3 X ad7
Función recombine (II) def recombine(combinacion_2) cross_point = (rand * combinacion_2.posicion_anuncios.size-2).truncate+1 c1_a, c1_b = self.posicion_anuncios.separate(cross_point) c2_a, c2_b = combinacion_2.posicion_anuncios.separate(cross_point) lista_1 = c1_a + c2_b lista_2 = c2_a + c1_b hijo_1 = Combinacion.new hijo_2 = Combinacion.new NUM_POSICIONES.times do |pos| hijo_1.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_1[pos].anuncio) hijo_2.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_2[pos].anuncio) end hijo_1.save; hijo_2.save self.parejas ||= [] combinacion_2.parejas ||= [] self.parejas << combinacion_2.id combinacion_2.parejas << self.id self.update; combinacion_2.update return [hijo_1, hijo_2] end
Método Mutate ,[object Object],def mutate mutate_point = (rand * NUM_POSICIONES).truncate anuncios = Anuncio.find :all self.mutaciones += 1 self.posicion_anuncios[mutate_point].anuncio =  anuncios[(anuncios.size*rand).truncate] self.save end 1 2 3 4 5 ad5 ad9 ad3 ad2 ad7 1 2 3 4 5 ad5 ad9 ad3 ad1 ad7
Inicialización y ejecución ,[object Object],[object Object],[object Object],[object Object],[object Object]
Crear la población inicial app/models/combinacion.rb class Combinacion < ActiveRecord::Base def self.create_random c = Combinacion.new  c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION anuncios = Anuncio.find :all NUM_POSICIONES.times do |pos| c.posicion_anuncios << PosicionAnuncio.create(  :position => pos, :anuncio => anuncios[(anuncios.size*rand).truncate] ) end c.save return c end end app/controllers/application.rb @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect do  Combinacion.create_random end
¿ Cómo evolucionan los anuncios ?
Código de la evolución app/controllers/application.rb def escoge_combinacion @poblacion_actual = Combinacion.find :all # Si no existe ninguna combinación, creamos la población inicial @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect { Combinacion.create_random } if @poblacion_actual.empty? # Se elige una combinación al azar @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first # Si no quedan combinaciones por mostrar, la población actual evoluciona a una nueva generación if @combinacion.nil? @poblacion_actual.each {|c| c.generaciones +=1 } @ga = GeneticAlgorithm.new( @poblacion_actual, {:p_combination => 1.0,   :p_mutation => 0.1,   :max_population => NUM_COMBINACIONES_GENERACION} ) @ga.evolve @extinguidos = @poblacion_actual - @ga.generations[-1] @extinguidos.each {|e| e.destroy} @poblacion_actual = @ga.generations[-1] @poblacion_actual.each do |c|  c.clicks = 0 c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION c.update end @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first end @combinacion.impresion end
¿Qué falta? ,[object Object],app/controllers/application.rb def cuenta_clicks @posicion_anuncio = PosicionAnuncio.find params[:id] @posicion_anuncio.combinacion.click redirect_to @posicion_anuncio.anuncio.url end ,[object Object],app/controllers/[controladores con vistas que muestren publicidad] before_filter :escoge_combinacion, :except => &quot;cuenta_clicks&quot;
¿Y en las vistas? app/helpers/application_helper.rb def pinta_banner(posicion, orientacion) imagen_path = if orientacion.downcase == &quot;h“ @combinacion.posicion_anuncios[posicion-1].anuncio.banner_h  else @combinacion.posicion_anuncios[posicion-1].anuncio.banner_v  end link_to image_tag(imagen_path), :action => &quot;cuenta_clicks&quot;, :id => @combinacion.posicion_anuncios[posicion-1] end app/views/[vistas que muestren publicidad] <%= pinta_banner 4, &quot;h&quot; %>
Simulación ,[object Object],[object Object]
…  o queréis más? ¿Preguntas …
Clasificador Naïve Bayes ,[object Object],[object Object],[object Object],Photo by  Aya Walraven Otake http://www.flickr.com/people/ayalan/
Ruby y los clasificadores Bayesianos ,[object Object],gem install classifier ,[object Object],[object Object],[object Object]
Ejemplo de Naïve Bayes: ,[object Object],[object Object],[object Object],[object Object],[object Object]
Vamos a trabajar (I) ,[object Object],require 'rubygems' require 'stemmer' require 'classifier' # Create the classifier classifier = Classifier::Bayes.new('Technical', 'Commercial')
Grupos de entrenamiento (I) ,[object Object],commercial =  [&quot;I already payed this invoice.&quot;, &quot;Do you have any discount for 1 year contract?&quot;, &quot;Do you have discounts?&quot;, &quot;Do you have any affiliate schema?&quot;, &quot;This is my new VISA no&quot;, &quot;I cannot see my invoices&quot;, &quot;When is finishing my free period?&quot;, &quot;I have a friend that is interested in your services, will you make us any offer?&quot;, &quot;I didn't use your services last mont. I shouldn't be charged&quot;, &quot;Do you have any kind of warranty?&quot;, &quot;Is it possible to freeze my account and continue after holidays?&quot;, &quot;I don't want to continue with your services.&quot;, &quot;Great service! Can I upgrade my account?&quot;, &quot;Where are the differences between shared and private hosting?&quot;]
Grupos de entrenamiento (II) ,[object Object],technician =  [&quot;I have limit of quoata exceeded and I cannot see my mail.&quot;, &quot;Is your ftp server working correctly?&quot;, &quot;My mails get delayed too much when my php application sends them.&quot;, &quot;I cannot read my mail&quot;, &quot;I cannot connect to the ftp server.&quot;, &quot;I cannot upload to the ftp server&quot;, &quot;My rails application is not working in your server.&quot;, &quot;Can I use background processes in the shared hosting?&quot;, &quot;Can I install this gem?&quot;, &quot;My php app is not working&quot;, &quot;Can you setup a ssl cert for me please?&quot;, &quot;I cannot connect to my server.&quot;, &quot;How can I connect to subversion?&quot;]
Vamos a trabajar (II) ,[object Object],# Train the classifier technician.each { |technician| classifier.train_Technical technician } commercial.each { |commercial| classifier.train_Commercial commercial }
Ya está listo! ,[object Object],puts classifier.classify &quot;How can I connect to my ftp account?“ -> Technical puts classifier.classify &quot;Is a private account better?“ -> Commercial puts classifier.classify &quot;Do you have available rails framework?“ -> Technical puts classifier.classify &quot;How much is your shared hosting for a whole year?&quot; -> Commercial puts classifier.classify &quot;I didn't get my discount in the last invoice. Is there something wrong?&quot; -> Commercial puts classifier.classify &quot;Connection Timeout in my ftp connections“ -> Technical puts classifier.classify &quot;Which is my email outgoing server?“ -> Technical
Conclusiones… ,[object Object],[object Object],[object Object],[object Object]
¿Preguntas?
¡Gracias! Código y más información en  bee.com.es

Más contenido relacionado

Similar a Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web

Computación evolutiva no tradicional
Computación evolutiva no tradicionalComputación evolutiva no tradicional
Computación evolutiva no tradicionalJuan J. Merelo
 
libro-inteligencia-artificial-version-6.pdf
libro-inteligencia-artificial-version-6.pdflibro-inteligencia-artificial-version-6.pdf
libro-inteligencia-artificial-version-6.pdflauraaldana41
 
Presentación Black Hat #SBCongress
Presentación Black Hat #SBCongressPresentación Black Hat #SBCongress
Presentación Black Hat #SBCongressJVSEO
 
El Libro de la Inteligencia Artificial (versión 8)
El Libro de la Inteligencia Artificial (versión 8)El Libro de la Inteligencia Artificial (versión 8)
El Libro de la Inteligencia Artificial (versión 8)Alfredo Vela Zancada
 
Unidad 9 Patrones De DiseñO
Unidad 9 Patrones De DiseñOUnidad 9 Patrones De DiseñO
Unidad 9 Patrones De DiseñOSergio Sanchez
 
Machine Learning a lo berserker - Software Craftsmanship Barcelona 2016
Machine Learning a lo berserker  - Software Craftsmanship Barcelona 2016Machine Learning a lo berserker  - Software Craftsmanship Barcelona 2016
Machine Learning a lo berserker - Software Craftsmanship Barcelona 2016Beatriz Martín @zigiella
 
Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con Bi...
Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con  Bi...Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con  Bi...
Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con Bi...Alba Blanco
 
Avance SEO para TODOS
Avance SEO para TODOSAvance SEO para TODOS
Avance SEO para TODOSDaniel Bustos
 
Como optimizar la tasa de conversión - Rodrigo conde
Como optimizar la tasa de conversión - Rodrigo condeComo optimizar la tasa de conversión - Rodrigo conde
Como optimizar la tasa de conversión - Rodrigo condeData Trust
 
Sin título 1vcxhz
Sin título 1vcxhzSin título 1vcxhz
Sin título 1vcxhzmilton444
 

Similar a Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web (20)

Mejoras de la publicidad en web con la I. A.
Mejoras de la publicidad en web con la I. A.Mejoras de la publicidad en web con la I. A.
Mejoras de la publicidad en web con la I. A.
 
Computación evolutiva no tradicional
Computación evolutiva no tradicionalComputación evolutiva no tradicional
Computación evolutiva no tradicional
 
libro-inteligencia-artificial-version-6.pdf
libro-inteligencia-artificial-version-6.pdflibro-inteligencia-artificial-version-6.pdf
libro-inteligencia-artificial-version-6.pdf
 
Presentación Black Hat #SBCongress
Presentación Black Hat #SBCongressPresentación Black Hat #SBCongress
Presentación Black Hat #SBCongress
 
Aplicaciones
AplicacionesAplicaciones
Aplicaciones
 
El Libro de la Inteligencia Artificial (versión 8)
El Libro de la Inteligencia Artificial (versión 8)El Libro de la Inteligencia Artificial (versión 8)
El Libro de la Inteligencia Artificial (versión 8)
 
TEMA 05.pdf
TEMA 05.pdfTEMA 05.pdf
TEMA 05.pdf
 
Unidad 9 Patrones De DiseñO
Unidad 9 Patrones De DiseñOUnidad 9 Patrones De DiseñO
Unidad 9 Patrones De DiseñO
 
CC_019_art_4.pdf
CC_019_art_4.pdfCC_019_art_4.pdf
CC_019_art_4.pdf
 
Machine Learning a lo berserker - Software Craftsmanship Barcelona 2016
Machine Learning a lo berserker  - Software Craftsmanship Barcelona 2016Machine Learning a lo berserker  - Software Craftsmanship Barcelona 2016
Machine Learning a lo berserker - Software Craftsmanship Barcelona 2016
 
Entregable3
Entregable3Entregable3
Entregable3
 
3A5 Trejo Alexandra -Tarea 2
3A5 Trejo Alexandra -Tarea 23A5 Trejo Alexandra -Tarea 2
3A5 Trejo Alexandra -Tarea 2
 
Herramientas para Enfrentas Nuevos Retos.
Herramientas para Enfrentas Nuevos Retos.Herramientas para Enfrentas Nuevos Retos.
Herramientas para Enfrentas Nuevos Retos.
 
Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con Bi...
Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con  Bi...Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con  Bi...
Ficommerce 2018 - La Publicidad de los datos, Publicidad Programática con Bi...
 
Avance SEO para TODOS
Avance SEO para TODOSAvance SEO para TODOS
Avance SEO para TODOS
 
Guía básica de SEO
Guía básica de SEOGuía básica de SEO
Guía básica de SEO
 
Google AdWords completo
Google AdWords completoGoogle AdWords completo
Google AdWords completo
 
Como optimizar la tasa de conversión - Rodrigo conde
Como optimizar la tasa de conversión - Rodrigo condeComo optimizar la tasa de conversión - Rodrigo conde
Como optimizar la tasa de conversión - Rodrigo conde
 
Sin título 1vcxhz
Sin título 1vcxhzSin título 1vcxhz
Sin título 1vcxhz
 
Excel novenos.pptx
Excel novenos.pptxExcel novenos.pptx
Excel novenos.pptx
 

Último

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 

Último (10)

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 

Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web

  • 1. Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web Santiago Bel Sergio Espeja
  • 2.
  • 3.
  • 4.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21. Función recombine (II) def recombine(combinacion_2) cross_point = (rand * combinacion_2.posicion_anuncios.size-2).truncate+1 c1_a, c1_b = self.posicion_anuncios.separate(cross_point) c2_a, c2_b = combinacion_2.posicion_anuncios.separate(cross_point) lista_1 = c1_a + c2_b lista_2 = c2_a + c1_b hijo_1 = Combinacion.new hijo_2 = Combinacion.new NUM_POSICIONES.times do |pos| hijo_1.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_1[pos].anuncio) hijo_2.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_2[pos].anuncio) end hijo_1.save; hijo_2.save self.parejas ||= [] combinacion_2.parejas ||= [] self.parejas << combinacion_2.id combinacion_2.parejas << self.id self.update; combinacion_2.update return [hijo_1, hijo_2] end
  • 22.
  • 23.
  • 24. Crear la población inicial app/models/combinacion.rb class Combinacion < ActiveRecord::Base def self.create_random c = Combinacion.new c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION anuncios = Anuncio.find :all NUM_POSICIONES.times do |pos| c.posicion_anuncios << PosicionAnuncio.create( :position => pos, :anuncio => anuncios[(anuncios.size*rand).truncate] ) end c.save return c end end app/controllers/application.rb @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect do Combinacion.create_random end
  • 25. ¿ Cómo evolucionan los anuncios ?
  • 26. Código de la evolución app/controllers/application.rb def escoge_combinacion @poblacion_actual = Combinacion.find :all # Si no existe ninguna combinación, creamos la población inicial @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect { Combinacion.create_random } if @poblacion_actual.empty? # Se elige una combinación al azar @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first # Si no quedan combinaciones por mostrar, la población actual evoluciona a una nueva generación if @combinacion.nil? @poblacion_actual.each {|c| c.generaciones +=1 } @ga = GeneticAlgorithm.new( @poblacion_actual, {:p_combination => 1.0, :p_mutation => 0.1, :max_population => NUM_COMBINACIONES_GENERACION} ) @ga.evolve @extinguidos = @poblacion_actual - @ga.generations[-1] @extinguidos.each {|e| e.destroy} @poblacion_actual = @ga.generations[-1] @poblacion_actual.each do |c| c.clicks = 0 c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION c.update end @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first end @combinacion.impresion end
  • 27.
  • 28. ¿Y en las vistas? app/helpers/application_helper.rb def pinta_banner(posicion, orientacion) imagen_path = if orientacion.downcase == &quot;h“ @combinacion.posicion_anuncios[posicion-1].anuncio.banner_h else @combinacion.posicion_anuncios[posicion-1].anuncio.banner_v end link_to image_tag(imagen_path), :action => &quot;cuenta_clicks&quot;, :id => @combinacion.posicion_anuncios[posicion-1] end app/views/[vistas que muestren publicidad] <%= pinta_banner 4, &quot;h&quot; %>
  • 29.
  • 30. … o queréis más? ¿Preguntas …
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 41. ¡Gracias! Código y más información en bee.com.es