Я пытаюсь написать фитнес-функцию в генетическом программировании, чтобы увеличить площадь, занимаемую точками внутри многоугольника. Рядом с центром многоугольника есть несколько точек, я хочу расширить эти точки от центра до тех пор, пока они не окажутся внутри многоугольника.
Я использовал разницу между площадью, занимаемой точками внутри многоугольника, и площадью внешнего многоугольника и пытался минимизировать ее в фитнес-функции. Но я не знаю, как использовать это, чтобы изменить координаты точек, а затем пересчитать разницу в площади и сделать это итеративно. Я дал, как должны выглядеть ввод и вывод.
Заранее спасибо.
Это код, который я написал до сих пор.
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))]]