Estoy intentando escribir una función fitness en programación genética para ampliar el área ocupada por los puntos dentro del polígono. Hay algunos puntos cerca del centro del polígono, quiero ampliar estos puntos desde el centro hasta que esté justo dentro del polígono.
Utilizaba la diferencia entre el área ocupada por los puntos dentro del polígono y el área de fuera del polígono e intentaba minimizarla en la función de aptitud. Pero no se como usar esto para cambiar las coordenadas de los puntos y luego recalcular la diferencia de área y hacerlo iterativamente. He dado cómo la entrada y la salida debe ser similar.
Gracias de antemano.
Este es el código que he escrito hasta ahora.
require(rgp)
require(splancs)
require(grDevices)
functionSet1 <- functionSet("+", "*", "-", "/","^")
inputVariableSet1 <- inputVariableSet("x","y")
constantFactorySet1 <- constantFactorySet(function() rnorm(1))
outpolygon<-matrix(c(3.061188,2.517408,0.523754,-0.258800,0.981104,4.036885,
3.061188,4.069070,4.069070,2.695074,0.485581,-2.129055,
-2.653607,4.069070),nrow=7,byrow=F)
inpoints<-matrix(c(2.637644,-0.4456578,2.160003,0.8553066,1.501256,1.3137518,2.352020,-0.2643815,
1.254139,1.2241712,1.918191,0.6595725,1.453478,0.9153824,1.900110,1.0607272,
1.648038,0.6847361,2.194931,2.2842159),nrow=10,byrow=T)
plot(-10:10,xlim=c(-5,5),ylim=c(-5,5))
polygon(outpolygon[,1],outpolygon[,2])
points(inpoints[,1],inpoints[,2])
fitnessFunction1 <- function(f){
if(all(point.in.polygon(inpoints[,1],inpoints[,2],outpolygon[,1],outpolygon[,2])!=0)){
rmse(areapl(inpoints[chull(inpoints[,1],inpoints[,2]),]),areapl(cbind(outpolygon[,1],outpolygon[,2])[chull(outpolygon[,1],outpolygon[,2]),]))
}else{
rmse(1000,0)
}
}
gpResult1 <- geneticProgramming(functionSet=functionSet1,
inputVariables=inputVariableSet1,
constantSet=constantFactorySet1,
fitnessFunction=fitnessFunction1,
stopCondition=makeTimeStopCondition(10))
best1 <- gpResult1$population[[which.min(sapply(gpResult1$population,
fitnessFunction1))]]