library(ggplot2) #para graficar
library(dplyr) # verbos para manipulacion de datos

Creamos 3 vectores con los datos de cada algoritmos y los usamos para construtir un dataframe (formato largo)

Un dataframe puede verse como una matriz en donde cada columna puede tener un tipo de datos diferente.

bfs_data<-c(3370, 316, 1688, 4581, 6473, 4345, 1083, 4723, 2950, 4735, 5179, 5423, 4439, 741, 516, 5281, 1240, 4613, 6298, 1293, 2345, 6711, 6518, 855, 272, 1034)

dfs_data<-c(397, 314, 3422, 2717, 5150, 3360, 2001, 845, 3008, 690, 2981, 781, 4068, 207, 1795, 3933, 2979, 1428, 550, 2988)

uni_cost_data<-c(2585, 3261, 1, 3783, 2184, 6730, 114, 5701, 4542, 1125, 3011, 2452, 6369, 1479, 5735, 4632, 5488, 296, 2077, 3702, 6457, 193, 2882, 1787, 6363, 1944, 1961)

uninformed_search<-data.frame(bfs=bfs_data[1:20],dfs=dfs_data,uni_cost=uni_cost_data[1:20])


uninformed_search 

Se transforma del formato ancho a un formato largo


uninformed_search<-uninformed_search %>% reshape2::melt()
No id variables; using all as measure variables
uninformed_search

Se calcula media y desviación standard de cada algoritmo

El simbolo %>% es un pipe a la haskell. Se toma como entrada un dataframe y la salida es otro dataframe.

Se agrupa por variable y por cada variable se calcula la media y la desviación estandard

uninformed_search_summary <- uninformed_search %>% group_by(variable) %>% summarise(mean=mean(value),sd=sd(value))
uninformed_search_summary
NA

Grafico de barras

Mostramos la media y deviación standard de cada algoritmo

library(ggplot2)
uninformed_search_summary %>%
  ggplot()+
  #geom_col(aes(x=variable,y=mean,fill=variable))+
  geom_errorbar(aes(x=variable,y=mean,ymin=mean-sd,ymax=mean+sd),width=.2,color='darkgray')+
  theme_bw()

Boxplot: Muestra información mas completa sobre la distribución de los datos

uninformed_search %>%
  ggplot()+
  geom_boxplot(aes(x=variable,y=value,fill=variable),color='darkgray')+
  theme_bw()

  #ggdark::dark_theme_classic()


sa_df$algorithm<-"SA"
sa_df$run<-seq(1:30)
sa_df$nqueen<-"4"

# 8 
time<-rnorm(30,10,5)
states<-rnorm(30,50,5)
h<-rnorm(30,4,1) %>% as.integer()

sa8_df<-data.frame(time=time,states=states,h=h)
sa8_df$algorithm<-"SA"
sa8_df$run<-seq(1:30)
sa8_df$nqueen<-"8"
# 10
time<-rnorm(30,12,1)
states<-rnorm(30,70,5)
h<-rnorm(30,7,4) %>% as.integer()

sa10_df<-data.frame(time=time,states=states,h=h)
sa10_df$algorithm<-"SA"
sa10_df$run<-seq(1:30)
sa10_df$nqueen<-"10"

rbind(sa_df,sa8_df,sa10_df)
/bin/sh: 1: t: not found

Leer un archivo en formato CSV

Lee y transforma a un dataframe. Un dataframe puede verse como una matriz en donde cada columna puede tener un tipo de datos diferente.

library(dplyr) # manupulacion de datos
library(ggplot2) # graficar
library(readr)  #lectura de archivos
library(tidyr) #transformacion 

local_search<-readr::read_csv("local-search-results.csv")

── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  time = col_double(),
  states = col_double(),
  h = col_double(),
  algorithm = col_character(),
  run = col_double(),
  nqueen = col_double()
)
local_search

Wide format

local_search_wide <- local_search %>% tidyr::pivot_wider(names_from = run, 
                                                         values_from = c("time", "states","h"))
local_search_wide

Long format

local_search_long<-local_search %>% tidyr::pivot_longer(!one_of(c("algorithm","nqueen")), 
                                     names_to = "metrics", 
                                     values_to = "value")
local_search_long

Tiempo Promedios

local_search %>% group_by(algorithm,nqueen) %>% summarise(mean_time=mean(time),sd_time=sd(time))
`summarise()` has grouped output by 'algorithm'. You can override using the `.groups` argument.

estados promedios

local_search %>% group_by(algorithm,nqueen) %>% summarise(mean_states=mean(states),
                                                          sd_states=sd(states),
                                                          mean_time=mean(time),
                                                          sd_time=sd(time)
                                                          )
`summarise()` has grouped output by 'algorithm'. You can override using the `.groups` argument.
local_search %>% group_by(algorithm,nqueen) %>% summarise(total=n(),
                                                  success=sum((h==0)),
                                                   perc=success/total
                                                   )
`summarise()` has grouped output by 'algorithm'. You can override using the `.groups` argument.
local_search %>% filter(algorithm=="GA")
LS0tCnRpdGxlOiAiR3JhZmljb3MgeSBtYW5pcHVsYWNpb24gZGUgZGF0b3MgY29uIHRpZHl2ZXJzZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikgI3BhcmEgZ3JhZmljYXIKbGlicmFyeShkcGx5cikgIyB2ZXJib3MgcGFyYSBtYW5pcHVsYWNpb24gZGUgZGF0b3MKYGBgCgojIENyZWFtb3MgMyB2ZWN0b3JlcyBjb24gbG9zIGRhdG9zIGRlIGNhZGEgYWxnb3JpdG1vcyB5IGxvcyB1c2Ftb3MgcGFyYSBjb25zdHJ1dGlyIHVuIGRhdGFmcmFtZSAoZm9ybWF0byBsYXJnbykKClVuIGBkYXRhZnJhbWVgIHB1ZWRlIHZlcnNlIGNvbW8gdW5hIG1hdHJpeiBlbiBkb25kZSBjYWRhIGNvbHVtbmEgcHVlZGUgdGVuZXIgdW4gdGlwbyBkZSBkYXRvcyBkaWZlcmVudGUuCgpgYGB7cn0KYmZzX2RhdGE8LWMoMzM3MCwgMzE2LCAxNjg4LCA0NTgxLCA2NDczLCA0MzQ1LCAxMDgzLCA0NzIzLCAyOTUwLCA0NzM1LCA1MTc5LCA1NDIzLCA0NDM5LCA3NDEsIDUxNiwgNTI4MSwgMTI0MCwgNDYxMywgNjI5OCwgMTI5MywgMjM0NSwgNjcxMSwgNjUxOCwgODU1LCAyNzIsIDEwMzQpCgpkZnNfZGF0YTwtYygzOTcsIDMxNCwgMzQyMiwgMjcxNywgNTE1MCwgMzM2MCwgMjAwMSwgODQ1LCAzMDA4LCA2OTAsIDI5ODEsIDc4MSwgNDA2OCwgMjA3LCAxNzk1LCAzOTMzLCAyOTc5LCAxNDI4LCA1NTAsIDI5ODgpCgp1bmlfY29zdF9kYXRhPC1jKDI1ODUsIDMyNjEsIDEsIDM3ODMsIDIxODQsIDY3MzAsIDExNCwgNTcwMSwgNDU0MiwgMTEyNSwgMzAxMSwgMjQ1MiwgNjM2OSwgMTQ3OSwgNTczNSwgNDYzMiwgNTQ4OCwgMjk2LCAyMDc3LCAzNzAyLCA2NDU3LCAxOTMsIDI4ODIsIDE3ODcsIDYzNjMsIDE5NDQsIDE5NjEpCgp1bmluZm9ybWVkX3NlYXJjaDwtZGF0YS5mcmFtZShiZnM9YmZzX2RhdGFbMToyMF0sZGZzPWRmc19kYXRhLHVuaV9jb3N0PXVuaV9jb3N0X2RhdGFbMToyMF0pCgoKdW5pbmZvcm1lZF9zZWFyY2ggCmBgYAoKCgojIFNlIHRyYW5zZm9ybWEgZGVsIGZvcm1hdG8gYGFuY2hvYCBhIHVuIGZvcm1hdG8gYGxhcmdvYAoKYGBge3J9Cgp1bmluZm9ybWVkX3NlYXJjaDwtdW5pbmZvcm1lZF9zZWFyY2ggJT4lIHJlc2hhcGUyOjptZWx0KCkKdW5pbmZvcm1lZF9zZWFyY2gKYGBgCgojIFNlIGNhbGN1bGEgbWVkaWEgeSBkZXN2aWFjacOzbiBzdGFuZGFyZCBkZSBjYWRhIGFsZ29yaXRtbwoKRWwgc2ltYm9sbyBgJT4lYCBlcyB1biBwaXBlIGEgbGEgYGhhc2tlbGxgLiBTZSB0b21hIGNvbW8gZW50cmFkYSB1biBgZGF0YWZyYW1lYCB5IGxhIHNhbGlkYSBlcyBvdHJvIGBkYXRhZnJhbWVgLgoKU2UgYWdydXBhIHBvciBgdmFyaWFibGVgIHkgcG9yIGNhZGEgYHZhcmlhYmxlYCBzZSBjYWxjdWxhIGxhIG1lZGlhIHkgbGEgZGVzdmlhY2nDs24gZXN0YW5kYXJkCgpgYGB7cn0KdW5pbmZvcm1lZF9zZWFyY2hfc3VtbWFyeSA8LSB1bmluZm9ybWVkX3NlYXJjaCAlPiUgZ3JvdXBfYnkodmFyaWFibGUpICU+JSBzdW1tYXJpc2UobWVhbj1tZWFuKHZhbHVlKSxzZD1zZCh2YWx1ZSkpCnVuaW5mb3JtZWRfc2VhcmNoX3N1bW1hcnkKCmBgYAoKIyBHcmFmaWNvIGRlIGJhcnJhcwoKTW9zdHJhbW9zIGxhIG1lZGlhIHkgZGV2aWFjacOzbiBzdGFuZGFyZCBkZSBjYWRhIGFsZ29yaXRtbwoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKdW5pbmZvcm1lZF9zZWFyY2hfc3VtbWFyeSAlPiUKICBnZ3Bsb3QoKSsKICAjZ2VvbV9jb2woYWVzKHg9dmFyaWFibGUseT1tZWFuLGZpbGw9dmFyaWFibGUpKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh4PXZhcmlhYmxlLHk9bWVhbix5bWluPW1lYW4tc2QseW1heD1tZWFuK3NkKSx3aWR0aD0uMixjb2xvcj0nZGFya2dyYXknKSsKICB0aGVtZV9idygpCmBgYAoKIyBCb3hwbG90OiBNdWVzdHJhIGluZm9ybWFjacOzbiBtYXMgY29tcGxldGEgc29icmUgbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgZGF0b3MKCmBgYHtyfQp1bmluZm9ybWVkX3NlYXJjaCAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2JveHBsb3QoYWVzKHg9dmFyaWFibGUseT12YWx1ZSxmaWxsPXZhcmlhYmxlKSxjb2xvcj0nZGFya2dyYXknKSsKICB0aGVtZV9idygpCiAgI2dnZGFyazo6ZGFya190aGVtZV9jbGFzc2ljKCkKYGBgCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiNTQQp0aW1lPC1ybm9ybSgzMCw3LDEpCnN0YXRlczwtcm5vcm0oMzAsNDAsNSkKaDwtcm5vcm0oMzAsMywxKSAlPiUgYXMuaW50ZWdlcigpCnNhX2RmPC1kYXRhLmZyYW1lKHRpbWU9dGltZSxzdGF0ZXM9c3RhdGVzLGg9aCkKCnNhX2RmWywyXQpgYGAKYGBge3R9CgoKc2FfZGYkYWxnb3JpdGhtPC0iU0EiCnNhX2RmJHJ1bjwtc2VxKDE6MzApCnNhX2RmJG5xdWVlbjwtIjQiCgojIDggCnRpbWU8LXJub3JtKDMwLDEwLDUpCnN0YXRlczwtcm5vcm0oMzAsNTAsNSkKaDwtcm5vcm0oMzAsNCwxKSAlPiUgYXMuaW50ZWdlcigpCgpzYThfZGY8LWRhdGEuZnJhbWUodGltZT10aW1lLHN0YXRlcz1zdGF0ZXMsaD1oKQpzYThfZGYkYWxnb3JpdGhtPC0iU0EiCnNhOF9kZiRydW48LXNlcSgxOjMwKQpzYThfZGYkbnF1ZWVuPC0iOCIKIyAxMAp0aW1lPC1ybm9ybSgzMCwxMiwxKQpzdGF0ZXM8LXJub3JtKDMwLDcwLDUpCmg8LXJub3JtKDMwLDcsNCkgJT4lIGFzLmludGVnZXIoKQoKc2ExMF9kZjwtZGF0YS5mcmFtZSh0aW1lPXRpbWUsc3RhdGVzPXN0YXRlcyxoPWgpCnNhMTBfZGYkYWxnb3JpdGhtPC0iU0EiCnNhMTBfZGYkcnVuPC1zZXEoMTozMCkKc2ExMF9kZiRucXVlZW48LSIxMCIKCnJiaW5kKHNhX2RmLHNhOF9kZixzYTEwX2RmKQoKCmBgYApgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojR0EKIyA0CnRpbWU8LXJub3JtKDMwLDMsMSkKc3RhdGVzPC1ybm9ybSgzMCwxNSw1KQpoPC1ybm9ybSgzMCwzLDIpICU+JSBhcy5pbnRlZ2VyKCkKCmdhX2RmPC1kYXRhLmZyYW1lKHRpbWU9dGltZSxzdGF0ZXM9c3RhdGVzLGg9aCkKZ2FfZGYkYWxnb3JpdGhtPC0iR0EiCmdhX2RmJHJ1bjwtc2VxKDE6MzApCmdhX2RmJG5xdWVlbjwtIjQiCgojIDggCnRpbWU8LXJub3JtKDMwLDUsMykKc3RhdGVzPC1ybm9ybSgzMCwzMCwyMCkKaDwtcm5vcm0oMzAsNCwyKSAlPiUgYXMuaW50ZWdlcigpCgpnYThfZGY8LWRhdGEuZnJhbWUodGltZT10aW1lLHN0YXRlcz1zdGF0ZXMsaD1oKQpnYThfZGYkYWxnb3JpdGhtPC0iR0EiCmdhOF9kZiRydW48LXNlcSgxOjMwKQpnYThfZGYkbnF1ZWVuPC0iOCIKCiMgMTAKdGltZTwtcm5vcm0oMzAsNywyKQpzdGF0ZXM8LXJub3JtKDMwLDQwLDE1KQpoPC1ybm9ybSgzMCw3LDMpICU+JSBhcy5pbnRlZ2VyKCkKZ2ExMF9kZjwtZGF0YS5mcmFtZSh0aW1lPXRpbWUsc3RhdGVzPXN0YXRlcyxoPWgpCmdhMTBfZGYkYWxnb3JpdGhtPC0iR0EiCmdhMTBfZGYkcnVuPC1zZXEoMTozMCkKZ2ExMF9kZiRucXVlZW48LSIxMCIKCnJiaW5kKHNhX2RmLHNhOF9kZixzYTEwX2RmLGdhX2RmLGdhOF9kZixnYTEwX2RmKSAlPiUgcmVhZHI6OndyaXRlX2NzdigibG9jYWwtc2VhcmNoLXJlc3VsdHMuY3N2IikKCgoKYGBgCgoKIyBMZWVyIHVuIGFyY2hpdm8gZW4gZm9ybWF0byBDU1YKCkxlZSB5IHRyYW5zZm9ybWEgYSB1biBgZGF0YWZyYW1lYC4gVW4gYGRhdGFmcmFtZWAgcHVlZGUgdmVyc2UgY29tbyB1bmEgbWF0cml6IGVuIGRvbmRlIGNhZGEgY29sdW1uYSBwdWVkZSB0ZW5lciB1biB0aXBvIGRlIGRhdG9zIGRpZmVyZW50ZS4KYGBge3J9CmxpYnJhcnkoZHBseXIpICMgbWFudXB1bGFjaW9uIGRlIGRhdG9zCmxpYnJhcnkoZ2dwbG90MikgIyBncmFmaWNhcgpsaWJyYXJ5KHJlYWRyKSAgI2xlY3R1cmEgZGUgYXJjaGl2b3MKbGlicmFyeSh0aWR5cikgI3RyYW5zZm9ybWFjaW9uIAoKbG9jYWxfc2VhcmNoPC1yZWFkcjo6cmVhZF9jc3YoImxvY2FsLXNlYXJjaC1yZXN1bHRzLmNzdiIpCmxvY2FsX3NlYXJjaApgYGAKIyBXaWRlIGZvcm1hdApgYGB7cn0KbG9jYWxfc2VhcmNoX3dpZGUgPC0gbG9jYWxfc2VhcmNoICU+JSB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHJ1biwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYygidGltZSIsICJzdGF0ZXMiLCJoIikpCmxvY2FsX3NlYXJjaF93aWRlCmBgYAoKIyBMb25nIGZvcm1hdApgYGB7cn0KbG9jYWxfc2VhcmNoX2xvbmc8LWxvY2FsX3NlYXJjaCAlPiUgdGlkeXI6OnBpdm90X2xvbmdlcighb25lX29mKGMoImFsZ29yaXRobSIsIm5xdWVlbiIpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJtZXRyaWNzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsdWUiKQpsb2NhbF9zZWFyY2hfbG9uZwpgYGAKCiMjIFRpZW1wbyBQcm9tZWRpb3MKYGBge3J9CmxvY2FsX3NlYXJjaCAlPiUgZ3JvdXBfYnkoYWxnb3JpdGhtLG5xdWVlbikgJT4lIHN1bW1hcmlzZShtZWFuX3RpbWU9bWVhbih0aW1lKSxzZF90aW1lPXNkKHRpbWUpKQpgYGAKIyMgZXN0YWRvcyBwcm9tZWRpb3MKYGBge3J9CmxvY2FsX3NlYXJjaCAlPiUgZ3JvdXBfYnkoYWxnb3JpdGhtLG5xdWVlbikgJT4lIHN1bW1hcmlzZShtZWFuX3N0YXRlcz1tZWFuKHN0YXRlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZF9zdGF0ZXM9c2Qoc3RhdGVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fdGltZT1tZWFuKHRpbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RfdGltZT1zZCh0aW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQpgYGAKCmBgYHtyfQpsb2NhbF9zZWFyY2ggJT4lIGdyb3VwX2J5KGFsZ29yaXRobSxucXVlZW4pICU+JSBzdW1tYXJpc2UodG90YWw9bigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M9c3VtKChoPT0wKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmM9c3VjY2Vzcy90b3RhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCmxvY2FsX3NlYXJjaCAlPiUgZmlsdGVyKGFsZ29yaXRobT09IkdBIikKYGBgCmBgYHtyfQoKYGBgCgo=