Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Такое чувство, что множество хитрых задачек сведутся к одному алгоритму и будут проходить 90% тестов :)
exp(-dE/T)?Понимаю, что было бы интересно взглянуть на сравнение «имитации отжига» с другими методами оптимизации, например, генетическими алгоритмами или динамическим программированием; привести примеры из интересных областей вроде machine learning; указать на связь с Марковскими моделями и много чего ещё. Однако, в рамках одной статьи всего не объять.
####### Init
n.cities=100
## Матрица координат
coors=data.frame(cbind(x=runif(n.cities), y=runif(n.cities)))
## Случайно выбранный маршрут -- вектор индексов городов в случайной последовательности
s0=sample(1:n.cities)
######## Functions ##############
plot.s<-function(s=s0) {
crs=rbind(coors[s,], coors[s[1],])
plot(crs$x,crs$y,type="b",axes=F)
}
E<-function(s=s0){
crs=rbind(coors[s,], coors[s[1],])
sum(sqrt(diff(crs$x)^2+diff(crs$y)^2))
}
next.s<-function(s=s0){
ii=sample(1:length(s),2)
s[ii[1]:ii[2]]<-s[ii[2]:ii[1]]
return(s)
}
runOnce<-function(s=s0, n.iter=100000, plo=T) {
Es=E(s)
for (i in 1:n.iter){
ns=next.s(s)
Ens=E(ns)
cat(i, Es,Ens,"\n")
if (Ens<Es){
s=ns
Es=Ens
if (plo){
plot.s(s)
title(paste("i=",i,"E=",signif(Es,3)))
}
}
}
return(s)
}
######## End of Functions #######
## Main ##
plot.s(s0)
title(paste("Randomly generated route,",n.cities," cities, E=",signif(E(s0),3)))
### Один "сеанс"
runOnce()
## Результаты 16 попыток
op<-par(mfcol=c(4,4),mar=c(0,0,2,0))
for (j in 1:16){
s=runOnce(plo=F,n.iter=100000)
plot.s(s)
title(paste("E=",signif(E(s),3)))
}




n.cities=100
####### Init
## Матрица координат
coors=data.frame(cbind(x=runif(n.cities), y=runif(n.cities)))
## Случайно выбранный маршрут -- вектор индексов городов в случайной последовательности
s0=sample(1:n.cities)
######## Functions ##############
# Нарисовать один вариант
plot.s<-function(s=s0) {
crs=rbind(coors[s,], coors[s[1],])
plot(crs$x,crs$y,type="b",axes=F)
}
#Подсчитать длину кольцевого пути
E<-function(s=s0){
crs=rbind(coors[s,], coors[s[1],])
sum(sqrt(diff(crs$x)^2+diff(crs$y)^2))
}
#Сгенерировать следующий вариант рутем изменения направления обхода между двумя выбранными городами на противоположный
next.s<-function(s=s0){
ii=sample(1:length(s),2)
s[ii[1]:ii[2]]<-s[ii[2]:ii[1]]
return(s)
}
# Зарустить одн раз
runOnce<-function(s=s0, n.iter=100000, plo=T) {
Es=E(s)
for (i in 1:n.iter){
ns=next.s(s)
Ens=E(ns)
cat(i, Es,Ens,"\n")
if (Ens<Es){
s=ns
Es=Ens
if (plo){
plot.s(s)
title(paste("i=",i,"E=",signif(Es,3)))
}
}
}
return(s)
}
######## End of Functions #######
#########################
## Main
## Здесь лучше работать в интерактивном режиме
plot.s(s0)
title(paste("Randomly generated route,",n.cities," cities, E=",signif(E(s0),3)))
### Один "сеанс"
st=system.time(runOnce())
mtext(paste(" time(s): ",st["elapsed"]))
## Результаты 16 попыток
op<-par(mfcol=c(4,4),mar=c(0,0,2,0))
for (j in 1:16){
s=runOnce(plo=F,n.iter=100000)
plot.s(s)
title(paste("E=",signif(E(s),3)))
}


Введение в оптимизацию. Имитация отжига