--- title: "TP Statistique" author: "Titi & Kiki" date: "06 avril 2021" output: pdf_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ## il est possible qu'avant d'installer le package TSPpackage vous deviez installer ou ré-installer Rcpp #install.packages('Rcpp') # install.packages('./TSPpackage_1.0.tar.gz',repos=NULL,type='bin') ## pour linux #install.packages('./TSPpackage_1.0.zip',repos=NULL,type='bin') ## pour windows ## je ne peux pas fournir de package pour mac... ## Appels aux packages, après les avoir installés ! library(sp) library(maps) library(microbenchmark) library(TSP) library(TSPpackage) library(Rcpp) library(MASS) library(multcomp) library(purrr) set.seed(69963) ``` Voici le plan de ce qui sera fait dans le TP. # Test Package ```{r, echo=TRUE} #test package irene villes <- read.csv('./DonneesGPSvilles.csv',header=TRUE,dec='.',sep=';',quote="\"") coord <- cbind(villes$longitude,villes$latitude) dist <- distanceGPS(coord) voisins <- TSPnearest(dist) print(voisins) ``` # 0. Visualisation de chemins Lecture du fichier des villes : ```{r, echo=TRUE} villes <- read.csv('DonneesGPSvilles.csv',header=TRUE,dec='.',sep=';',quote="\"") str(villes) ``` Représentation des chemins par plus proches voisins et du chemin optimal : ```{r, echo=TRUE} coord <- cbind(villes$longitude,villes$latitude) dist <- distanceGPS(coord) voisins <- TSPnearest(dist) pathOpt <- c(1,8,9,4,21,13,7,10,3,17,16,20,6,19,15,18,11,5,22,14,12,2) par(mfrow=c(1,2),mar=c(1,1,2,1)) plotTrace(coord[voisins$chemin,], title='Plus proches voisins') plotTrace(coord[pathOpt,], title='Chemin optimal') ``` Les longueurs des trajets (à vol d'oiseau) valent respectivement, pour la méthode des plus proches voisins : ```{r, echo=FALSE} voisins$longueur ``` et pour la méthode optimale : ```{r, echo=FALSE} calculeLongueur(dist,pathOpt) ``` Ceci illustre bien l'intérêt d'un algorithme de voyageur de commerce. Nous allons dans la suite étudier les performances de cet algorithme. # 1. Comparaison d'algorithmes Nombre de sommets fixes et graphes "identiques". ```{r, echo=TRUE} n <- 10 sommets <- data.frame(x = runif(n), y = runif(n)) couts <- distance(sommets) ``` ## 1.1. Longueur des chemins Comparaison des longueurs de différentes méthodes : * boxplots * test entre 'nearest' et 'branch' * tests 2 à 2 ```{r, echo=TRUE} n <- 10 vectNear = rep(0,50) vectBranch = rep(0,50) vectRep = rep(0,50) vectInsert = rep(0,50) vectTwo = rep(0,50) #boucle permettant de recupérer la longueur des chemins pour les 5 méthodes (50 itérations) for(i in 1:50){ sommets <- data.frame(x = runif(n), y = runif(n)) couts <- distance(sommets) vectNear[i] = TSPsolve(couts, "nearest") vectBranch[i] = TSPsolve(couts, "branch") vectRep[i] = TSPsolve(couts, "repetitive_nn") vectInsert[i] = TSPsolve(couts, "nearest_insertion") vectTwo[i] = TSPsolve(couts, "two_opt") } ``` ```{r, echo =FALSE} boxplot(vectNear,vectBranch,vectRep,vectInsert,vectTwo, names = c("nearest", "branch", "rep", "NI", "2opt")) ``` ```{r mean, echo = FALSE} #moyenne méthode nearest mean(vectNear) #moyenne méthode branch mean(vectBranch) ``` Test de comparaisons d'échantillons appariés : --> Variable d'intérêt = longueur pour 2 algo différents ```{r} t.test(vectNear, vectBranch, paired=TRUE, alternative = "greater"); ``` Seconde possiblitée ```{r} t.test(vectNear-vectBranch, mu=0, alternative = "greater"); ``` ==> P valeur << 0.05 ==> Rejet de (H0) ```{r} results = c(vectNear, vectBranch, vectRep, vectInsert, vectTwo) methods = c(rep("nearest",50),rep("branch",50),rep("repetitive_nn",50),rep("nearest_insertion",50),rep("two_opt",50)) pairwise.t.test(results,methods,adjust.method="bonferroni", paired=TRUE) ``` P Valeur proche de 1 ==> Aucun différence, P Valeur proche de 0 ==> Différence significative ## 1.2. Temps de calcul Comparaison des temps à l'aide du package microbenchmark. ```{r} n=10 #on a des graphes avec 10 sommets microbenchmark( TSPsolve(cout, "nearest"), TSPsolve(cout, "branch"), TSPsolve(cout, "repetitive_nn"), TSPsolve(cout, "nearest_insertion"), TSPsolve(cout, "two_opt"), times=50, setup={cout = distance(data.frame(x = runif(n), y = runif(n)))}) ``` # 2. Etude e la complexité de l'algorithme Branch and Bound ## 2.1. Comportement par rapport au nombre de sommets : premier modèle Récupération du temps sur 10 graphes pour différentes valeurs de $n$. Ajustement du modèle linéaire de $\log(temps)^2$ en fonction de $n$. Analyse de la validité du modèle : * pertinence des coefficients et du modèle, * étude des hypothèses sur les résidus. ```{r eval=FALSE} sommets <- data.frame(x = runif(n), y = runif(n)) couts <- distance(sommets) ``` ```{r} seqn <- seq(4,20,1) temps = c() for(i in 1:17){ temps = rbind(temps, microbenchmark(TSPsolve(couts, method = "branch"),times = 50,setup = { n <- seqn[i] couts <- distance(cbind(x = runif(n), y = runif(n)))})$time) } ``` ```{r} par(mfrow=c(1,2))# 2 graphiques sur 1 ligne matplot(seqn, temps, xlab="n", ylab="temps") matplot(log(seqn), log(temps), xlab="log(n)", ylab=expression(log(temps))) ``` ```{r} vect_temps <- log(as.vector(temps)) vect_dim <- rep(log(seqn),times=50) temps.lm <- lm(vect_temps~vect_dim) summary(temps.lm) ``` ```{r} par(mfrow=c(2,2)) plot(temps.lm) ``` ```{r} shapiro.test(residuals(temps.lm)) ``` ## 2.2. Comportement par rapport au nombre de sommets : étude du comportement moyen Récupération du temps moyen. Ajustement du modèle linéaire de $\log(temps.moy)^2$ en fonction de $n$. Analyse de la validité du modèle : * pertinence des coefficients et du modèle, * étude des hypothèses sur les résidus. ```{r} temps.moy <- rowMeans(temps) ``` ```{r} par(mfrow=c(1,2)) matplot(seqn, temps.moy, xlab='n', ylab='temps moyen') matplot(seqn, log(temps.moy)^4, xlab='n', ylab=expression(log(temps_moyen)^4)) ``` ```{r} vect_temps.moy <- log(as.vector(temps.moy))^4 temps.moy.lm <- lm(vect_temps.moy ~ seqn) summary(temps.moy.lm) ``` ```{r} par(mfrow=c(2,2)) plot(temps.lm) ``` ```{r} shapiro.test(residuals(temps.lm)) ``` ## 2.3. Comportement par rapport à la structure du graphe Lecture du fichier 'DonneesTSP.csv'. Ajustement du modèle linéaire de $\log(temps.moy)^2$ en fonction de toutes les variables présentes. Modèle sans constante. Mise en \oe uvre d'une sélection de variables pour ne garder que les variables pertinentes. Analyse de la validité du modèle : * pertinence des coefficients et du modèle, * étude des hypothèses sur les résidus. ```{r} data.graph <- read.csv('DonneesTSP.csv', header=TRUE, dec=".", sep=",", quote="\"") ``` ```{r} data.graph$dim <- log(data.graph$dim) data.graph.lm <- lm(log(data.graph$tps)~.,data = data.graph) ``` ```{r} step(data.graph.lm) ``` ```{r} data.graph$mean.dist <- NULL data.graph.lm<-lm(log(data.graph$tps)~.,data = data.graph) summary(data.graph.lm) ``` ```{r} par(mfrow=c(2,2))# 4 graphiques, sur 2 lignes et 2 colonnes plot(data.graph.lm) ``` ```{r} shapiro.test(residuals(data.graph.lm)) ```