{"id":1563,"date":"2016-11-26T05:00:14","date_gmt":"2016-11-26T08:00:14","guid":{"rendered":"http:\/\/geekosas.com\/?p=1563"},"modified":"2020-06-25T12:59:04","modified_gmt":"2020-06-25T15:59:04","slug":"asignacion-agentes-call-center","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/26\/asignacion-agentes-call-center\/","title":{"rendered":"Asignaci\u00f3n Agentes Call Center"},"content":{"rendered":"<p>La asignaci\u00f3n se agentes de un Call Center consiste en realizar la programaci\u00f3n de turnos para satisfacer la demanda de llamadas a un Call Center. Este es un problema que se compone de dos partes: la primera es la estimaci\u00f3n de la demanda y la segunda asignar los turnos de los agentes.<\/p>\n<p>En este articulo nos enfocaremos en la asignaci\u00f3n de turnos de los agentes, utilizaremos R para generar los datos de un solver y GLPK para resolver el problema programado en AMPL.<\/p>\n<p><!--more--><\/p>\n<h4>El problema<\/h4>\n<p>La dificultad en la programaci\u00f3n de turnos est\u00e1 en las reglas de negocio asociadas a este, las cuales afectan directamente el ambiente laboral del Call Center.<\/p>\n<p>Las reglas de negocio que implementaremos en este articulo son de un caso real y son las siguientes:<\/p>\n<ol>\n<li>Cada agente debe tener al menos una vez a la semana 2 d\u00edas seguidos de descanso.<\/li>\n<li>Los agentes pueden pedir d\u00edas libres.<\/li>\n<li>Si un agente trabaja un d\u00eda domingo, el pr\u00f3ximo domingo no debe trabajar.<\/li>\n<li>El agente puede especificar d\u00edas que quiere trabajar, estos pueden ser utilizados como condici\u00f3n inicial para la regla anterior.<\/li>\n<\/ol>\n<p>El desaf\u00edo es poder planear esto con al menos 4 semanas de anticipaci\u00f3n (m\u00e1s una semana que detalla los turnos del d\u00eda domingo).<\/p>\n<h4>Metodolog\u00eda<\/h4>\n<p>Modelaremos el problema utilizando programaci\u00f3n lineal en AMPL y lo resolveremos utilizando SIMPLEX con el paquete GLPK, el input para el modelo ser\u00e1 generado en R y el output de GLPK sera le\u00eddo en R y mostrado en pantalla<\/p>\n<h5>Par\u00e1metros:<\/h5>\n<ul>\n<li>Nombres de los Ejecutivos.<\/li>\n<li>Demanda Diaria de Llamadas.<\/li>\n<li>D\u00edas libres pedidos por los agentes.<\/li>\n<li>D\u00edas en que agentes deben trabajar<\/li>\n<\/ul>\n<h5>Output<\/h5>\n<p>Turnos de Agentes y reglas de negocio que no se pudieron cumplir.<\/p>\n<h4>Implementaci\u00f3n:<\/h4>\n<h5>Generar par\u00e1metros del modelo<\/h5>\n<p>Primero generaremos los datos de entrada del modelo en R, para hacer esto, leeremos los par\u00e1metros de una base de datos en excel la cual tiene el siguiente formato (solo se mostrar\u00e1n las primeras filas).<\/p>\n<h6>Nombres de Ejecutivos:<\/h6>\n<table width=\"125\">\n<tbody>\n<tr>\n<td width=\"125\">nombre_ejecutivo<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 2<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 3<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 4<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 5<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 6<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6>Demanda diaria de Ejecutivos:<\/h6>\n<table width=\"364\">\n<tbody>\n<tr>\n<td width=\"109\">semana<\/td>\n<td width=\"109\">dia<\/td>\n<td width=\"146\">demanda_ejecutivos<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>1<\/td>\n<td>16<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>2<\/td>\n<td>15<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>3<\/td>\n<td>15<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>4<\/td>\n<td>15<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>5<\/td>\n<td>16<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>6<\/td>\n<td>9<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>7<\/td>\n<td>9<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>1<\/td>\n<td>16<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6>D\u00edas Libres Pedidos:<\/h6>\n<table width=\"381\">\n<tbody>\n<tr>\n<td width=\"127\">nombre_ejecutivo<\/td>\n<td width=\"127\">semana<\/td>\n<td width=\"127\">dia<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<td>1<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<td>1<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 4<\/td>\n<td>2<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 5<\/td>\n<td>2<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 6<\/td>\n<td>2<\/td>\n<td>3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6>Turnos Obligatorios:<\/h6>\n<table width=\"390\">\n<tbody>\n<tr>\n<td width=\"130\">nombre_ejecutivo<\/td>\n<td width=\"130\">semana<\/td>\n<td width=\"130\">dia<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<td>2<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<td>2<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<td>2<\/td>\n<td>3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>C\u00f3digo en R que lee Excel y genera entrada para GLPK.<\/h5>\n<pre><code class=\"language-r line-numbers\">options(stringsAsFactors = FALSE)\nlibrary(reshape2)\nlibrary(\"xlsx\")\n\n#Lectura de Parametros\nejecutivos = read.xlsx2(\"datos.xlsx\",sheetName = \"ejecutivo\")\n\nfechas = read.xlsx(\"datos.xlsx\",sheetName = \"demanda\")\n\ndias_libres = read.xlsx(\"datos.xlsx\",sheetName = \"dias_libres\")\ndias_libres$dias_libres = 1\nturno_obligado = read.xlsx(\"datos.xlsx\",sheetName = \"turno_obligado\")\nturno_obligado$turno_obligado = 1\n\n#semanas\nsemana = data.frame(semana = unique(fechas$semana))\n\n#tabla con par\u00e1metros diarios para ejecutivos\nfecha_ejecutivo = expand.grid(nombre_ejecutivo = ejecutivos$nombre_ejecutivo, semana = semana$semana, dia = 1:7 )\nfecha_ejecutivo = merge(fecha_ejecutivo,dias_libres, by=c(\"nombre_ejecutivo\",\"semana\",\"dia\"),all.x=T)\nfecha_ejecutivo$dias_libres = as.numeric(!is.na(fecha_ejecutivo$dias_libres))\nfecha_ejecutivo = merge(fecha_ejecutivo,turno_obligado, by=c(\"nombre_ejecutivo\",\"semana\",\"dia\"),all.x=T)\nfecha_ejecutivo$turno_obligado = as.numeric(!is.na(fecha_ejecutivo$turno_obligado))\n\n#tabla auxiliar con numero de semanas\nparametros = data.frame(parametro = c(\"semanas\"),\n valor = max(semana$semana))\n\n#escribir tablas\nwrite.csv(fechas,\"fechas.csv\",row.names = F)\nwrite.csv(ejecutivos,\"ejecutivos.csv\",row.names = F)\nwrite.csv(fecha_ejecutivo,\"fecha_ejecutivo.csv\",row.names = F)\nwrite.csv(semana,\"semana.csv\",row.names = F)\nwrite.csv(parametros,\"parametros.csv\",row.names = F)\n<\/code><\/pre>\n<h4>El Modelo<\/h4>\n<pre><code class=\"line-numbers\">\/*Indices*\/\nset E ; \/*Ejecutivo*\/\nset S; \/*semanas*\/\nset D:={1 .. 7}; \/*Dia de la semana*\/\nset DS, within D cross S; \/*Semana cros dia, para la demanda *\/\nset EDS , within E cross D cross S; \/*Ejecutivo dia semana*\/\nset P;\n\n\/*Declarar Parametros*\/\nparam dias_libres{(e,d,s) in EDS} default 0, binary; \/*true si el ejecutivo pidio ese dia libre*\/\nparam turno_obligado{(e,d,s) in EDS} default 0, binary; \/*true si el ejecutivo va a trabajar ese dia*\/\nparam demanda_ejecutivos{(d,s) in DS} default 0, integer; \/*demanda de ejecutivos en el dia*\/\nparam parametros{p in P};\n\ntable csv_parametros IN \"CSV\" \"parametros.csv\":\n P &lt;- [parametro], parametros ~ valor;\n\ntable csv_fechas IN \"CSV\" \"ejecutivos.csv\" :\n E &lt;- [nombre_ejecutivo];\n\ntable csv_semana IN \"CSV\" \"semana.csv\" :\n S &lt;- [semana];\n\ntable csv_fechas IN \"CSV\" \"fechas.csv\" :\n DS &lt;- [dia,semana], demanda_ejecutivos ~ demanda_ejecutivos;\n\ntable fecha_ejecutivo IN \"CSV\" \"fecha_ejecutivo.csv\" :\n EDS &lt;- [nombre_ejecutivo,dia,semana], dias_libres ~ dias_libres, turno_obligado ~ turno_obligado;\n\n\/*Variables*\/\nvar W{(e,d,s) in EDS} binary; \/* 1 si el ejecutivo e trabaja el dia d de la semana*\/\nvar I{e in E, d in 1..6, s in S} binary; \/*1 si el ejecutivo inicia descanso doble el dia EDS*\/\nvar error_DescDobleSem{e in E, s in S} &gt;= 0; \/*numero de veces que no se asgna descanso doble a un agente*\/\nvar error_DomingoAnterior{e in E, s in S} &gt;= 0; \/*numero de veces que un agente debe trabajar 2 domingo seguidos*\/\nvar error_DiaLibre{(e,d,s) in EDS} &gt;= 0; \/*numero de veces que el agente pidio dia libre y no se le pudo asignar*\/\nvar error_DescansoDobleDia1{e in E, d in 1..6, s in S} &gt;= 0; \/*e signo como descanzo doble pero no se pudo dar el dia*\/\nvar error_DescansoDobleDia2{e in E, d in 1..6, s in S} &gt;= 0; \/*e signo como descanzo doble pero no se pudo dar el dia*\/\n\n\/*Funcion obj*\/\nminimize obj: \nsum{e in E, s in S} error_DescDobleSem[e,s] + \nsum{e in E, s in S}error_DomingoAnterior[e,s] + \nsum{e in E, d in 1..6, s in S} error_DiaLibre[e,d,s] + \nsum{e in E, d in 1..6, s in S} error_DescansoDobleDia1[e,d,s] + \nsum{e in E, d in 1..6, s in S} error_DescansoDobleDia2[e,d,s];\n\n\/*Restricciones*\/\n\/*R1 Satisfacer Demanda*\/\ns.t. SatDem{(d,s) in DS}: sum{e in E} W[e,d,s] = demanda_ejecutivos[d,s];\n\/*R2 Cada ejecutivo debetener un al menos un descanso doble a la semana*\/\ns.t. DescDobleSem{e in E, s in S}: 1 - sum{d in 1..6} I[e,d,s] &lt;= error_DescDobleSem[e,s];\n\/*R3 Si se le asigna el descanzo, doble el dia sgte tambien es libre (al menos un descanzo de 2 dias a la semana)*\/\ns.t. DescansoDobleDia1{e in E, d in 1..6, s in S}: W[e,d,s] - (1 - I[e,d,s]) &lt;= error_DescansoDobleDia1[e,d,s];\ns.t. DescansoDobleDia2{e in E, d in 1..6, s in S}: W[e,d+1,s] - (1 - I[e,d,s]) &lt;= error_DescansoDobleDia2[e,d,s];\n\/*R4 Si le toco descanzo el domingo de la semana anterior, domingo siguiente no trabaja (hay que rellenar ese dato en data)*\/\ns.t. DomingoAnterior{e in E, s in 2 .. parametros['semanas']}: W[e,7,s] - (1 - W[e,7,s-1]) &lt;= error_DomingoAnterior[e,s];\n\/*R5 Si el ejecutivo pide un dia libre, no trabaja*\/\ns.t. DiaLibre{(e,d,s) in EDS}: W[e,d,s] - (1- dias_libres[e,d,s]) &lt;= error_DiaLibre[e,d,s];\n\/*R6 Si tiene un dia obligado, debe trabajar*\/\ns.t. DiaObligado{(e,d,s) in EDS}: W[e,d,s] &gt;= turno_obligado[e,d,s];\n\nsolve;\n\ntable tout {(nombre_ejecutivo,dia,semana) in EDS} OUT \"CSV\" \"solucion.csv\" :\nnombre_ejecutivo,dia,semana, W[nombre_ejecutivo,dia,semana];\n\ntable tout {(nombre_ejecutivo,dia,semana) in EDS} OUT \"CSV\" \"error_DiaLibre.csv\" :\nnombre_ejecutivo,dia,semana, error_DiaLibre[nombre_ejecutivo,dia,semana];\n\ntable tout {nombre_ejecutivo in E, semana in S} OUT \"CSV\" \"error_DescDobleSem.csv\" :\nnombre_ejecutivo,semana, error_DescDobleSem[nombre_ejecutivo,semana];\n\ntable tout {nombre_ejecutivo in E, semana in S} OUT \"CSV\" \"error_DomingoAnterior.csv\" :\nnombre_ejecutivo,semana, error_DomingoAnterior[nombre_ejecutivo,semana];\n\ntable tout {nombre_ejecutivo in E, dia in 1..6, semana in S} OUT \"CSV\" \"error_DescansoDobleDia1.csv\" :\nnombre_ejecutivo,dia,semana, error_DescansoDobleDia1[nombre_ejecutivo,dia,semana];\n\ntable tout {nombre_ejecutivo in E, dia in 1..6, semana in S} OUT \"CSV\" \"error_DescansoDobleDia2.csv\" :\nnombre_ejecutivo,dia,semana, error_DescansoDobleDia2[nombre_ejecutivo,dia,semana];\n\ndisplay obj;\n<\/code><\/pre>\n<h4>Resolver el modelo<\/h4>\n<p>Se debe tener instalado GLPK, como el problema consiste en encontrar una soluci\u00f3n, a priori no sabemos si ella existe, por lo que vamos a ejecutar el solver con un tiempo limitado de ejecuci\u00f3n de 600 segundos<\/p>\n<p><code>glpsol --cuts --fpump --mipgap 0.001 --tmlim 7200 -m \"modelo.mod\"<\/code><\/p>\n<h4>Recuperamos la salida en R<\/h4>\n<pre><code class=\"language-r line-numbers\">#escribir tablas\nwrite.csv(fechas,\"fechas.csv\",row.names = F)\nwrite.csv(ejecutivos,\"ejecutivos.csv\",row.names = F)\nwrite.csv(fecha_ejecutivo,\"fecha_ejecutivo.csv\",row.names = F)\nwrite.csv(semana,\"semana.csv\",row.names = F)\nwrite.csv(parametros,\"parametros.csv\",row.names = F)\n\nsystem('glpsol --cuts --fpump --mipgap 0.001 --tmlim 7200 -m \"modelo2.mod\"')\nsolucion = read.csv(\"solucion.csv\")\nsolucion$semana_dia = paste0(\"s\",solucion$semana, \"-d\",solucion$dia)\nprint(dcast(solucion,nombre_ejecutivo ~ semana_dia,value.var = \"W\"))\n\nprint(\"Errores\")\nerror_DiaLibre = read.csv(\"error_DiaLibre.csv\")\nprint(paste(\"error dia libre:\", sum(error_DiaLibre$error_DiaLibre)))\n\nerror_DescDobleSem = read.csv(\"error_DescDobleSem.csv\")\nprint(paste(\"error descanso doble:\", sum(error_DescDobleSem$error_DescDobleSem)))\n\nerror_DescansoDobleDia1 = read.csv(\"error_DescansoDobleDia1.csv\")\nprint(paste(\"error descanso doble dia 1:\", sum(error_DescansoDobleDia1$error_DescansoDobleDia1)))\n\nerror_DescansoDobleDia2 = read.csv(\"error_DescansoDobleDia2.csv\")\nprint(paste(\"error descanso doble dia 2:\", sum(error_DescansoDobleDia2$error_DescansoDobleDia2)))\n\nerror_DomingoAnterior = read.csv(\"error_DomingoAnterior.csv\")\nprint(paste(\"error domingo anterior:\", sum(error_DomingoAnterior$error_DiaLibre)))\n\nprint(paste(\"funcion objetivo:\",sum(error_DiaLibre$error_DiaLibre,\n error_DescDobleSem$error_DescDobleSem,\n error_DescansoDobleDia1$error_DescansoDobleDia1,\n error_DescansoDobleDia1$error_DescansoDobleDia2,\n error_DomingoAnterior$error_DiaLibre)))\n<\/code><\/pre>\n<h5>Ejemplo Output<\/h5>\n<p>La salida de la primera semana y los primeros 5 ejecutivos se ver\u00e1 de esta forma:<\/p>\n<table width=\"535\">\n<tbody>\n<tr>\n<td width=\"87\">nombre ejecutivo<\/td>\n<td width=\"64\">s1-d1<\/td>\n<td width=\"64\">s1-d2<\/td>\n<td width=\"64\">s1-d3<\/td>\n<td width=\"64\">s1-d4<\/td>\n<td width=\"64\">s1-d5<\/td>\n<td width=\"64\">s1-d6<\/td>\n<td width=\"64\">s1-d7<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 2<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 3<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 4<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>Ejecutivo 5<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Espero que este tutorial halla servido, en caso de dudas no dude en contactarme por linked in en\u00a0<a href=\"https:\/\/cl.linkedin.com\/in\/danielfischerm\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/cl.linkedin.com\/in\/danielfischerm,<\/a>\u00a0mi correo dfischer@ug.uchile.cl o cualquiera de mis medios de contacto.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>La asignaci\u00f3n se agentes de un Call Center consiste en realizar la programaci\u00f3n de turnos para satisfacer la demanda de llamadas a un Call Center. <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/26\/asignacion-agentes-call-center\/\" title=\"Asignaci\u00f3n Agentes Call Center\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":2140,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-1563","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/Call-Centers.jpg?fit=400%2C267&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-pd","jetpack-related-posts":[{"id":2991,"url":"https:\/\/geekosas.com\/index.php\/es\/2021\/10\/24\/back-to-office-post-covid19\/","url_meta":{"origin":1563,"position":0},"title":"Back to Office Post-Covid19","author":"Daniel Fischer","date":"2021-10-24","format":false,"excerpt":"Antes de comenzar con este art\u00edculo quiero agradecer a Tristan Riquelme por darme la idea, es \u00e9l alguien que siempre tiene excelentes ideas sobre d\u00f3nde aplicar herramientas matem\u00e1ticas a problemas reales. Ahora comenzando con el art\u00edculo: Aunque encontremos una cura definitiva para el COVID-19, este ya ha creado cambios culturales\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":23,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/12\/sobre-linux\/","url_meta":{"origin":1563,"position":1},"title":"Sobre Linux","author":"Daniel Fischer","date":"2016-04-12","format":false,"excerpt":"Si un d\u00eda por la ma\u00f1ana, despiertas con la inspiraci\u00f3n de descubrir algo nuevo y pones en wikipedia el bot\u00f3n Pagina Aleatorea, con una probabilidad de 1\/1.233.000, caer\u00e1s en el articulo sobre Linux. Si quieres esperar a ese evento, puedes seguir intentando, si no, puedes seguir leyendo este articulo sobre\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/linux.png?fit=387%2C442&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":21,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/11\/como-elegir-celular\/","url_meta":{"origin":1563,"position":2},"title":"Como elegir celular?","author":"Daniel Fischer","date":"2016-04-11","format":false,"excerpt":"Pasamos m\u00e1s tiempo con nuestro celular que con nuestra familia, es m\u00e1s, lo usamos para comunicarlos con ella y para muchos es una herramienta fundamental de trabajo. Un celular, quiera admitirlo o no, es un compa\u00f1ero de vida, que seg\u00fan sea la relaci\u00f3n te podr\u00eda acompa\u00f1ar el ba\u00f1o por varios\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/mensagens_amor_namorados_para_celular.jpg?fit=400%2C225&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":65,"url":"https:\/\/geekosas.com\/index.php\/es\/2015\/02\/01\/receptor-inalambico-de-musica\/","url_meta":{"origin":1563,"position":3},"title":"Receptor Inalambico de M\u00fasica","author":"Daniel Fischer","date":"2015-02-01","format":false,"excerpt":"El fin de este blog siempre ha sido ense\u00f1ar sobre mis variados inventos Geek, gadgets que me compro, trucos para sacarle m\u00e1ximo provecho a alguna tecnolog\u00eda o simplemente ense\u00f1arles sobre algo que pocos saben como: como elegir una bicicleta o como se leen\u00a0las especificaciones de un aud\u00edfono, pero esas son\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2015\/01\/descarga-300x298.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":664,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/18\/jugando-con-redes-neuronales\/","url_meta":{"origin":1563,"position":4},"title":"Jugando con Redes Neuronales","author":"Daniel Fischer","date":"2016-04-18","format":false,"excerpt":"Hace unos d\u00edas escrib\u00ed sobre las redes neuronales\u00a0intentando explicar de manera simple como funcionan y por que este tipo de tecnolog\u00eda es llamado \"inteligencia artificial\". Lo importante de esta t\u00e9cnica y lo que la hace tan revolucionaria es el concepto de entrenamiento, pero muchas veces es dif\u00edcil imaginar como sucede\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/tensorflow.png?fit=1200%2C715&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":182,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/02\/arduino\/","url_meta":{"origin":1563,"position":5},"title":"Arduino","author":"Daniel Fischer","date":"2016-04-02","format":false,"excerpt":"Es dif\u00edcil comenzar este articulo, llevo unos d\u00edas jugando con mi nuevo Arduino Starter Kit y creo que la mejor forma de definirlo es: un Lego electr\u00f3nico.\u00a0Un excelente juguete\u00a0para quienes disfrutaron de los bloques a\u00f1os atr\u00e1s. Arduino es un micro controlador f\u00e1cilmente programable desde el computador utilizando Arduino IDE,\u00a0en el\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/ardr3a.jpg?fit=1200%2C829&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/1563","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=1563"}],"version-history":[{"count":4,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/1563\/revisions"}],"predecessor-version":[{"id":2931,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/1563\/revisions\/2931"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/2140"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=1563"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=1563"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=1563"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}