ポリゴン内のポイントが占める領域を拡大するために、遺伝的プログラミングでフィットネス関数を記述しようとしています。ポリゴンの中心近くにいくつかのポイントがあります。これらのポイントを中心からポリゴンのすぐ内側まで拡張したいと考えています。
ポリゴンの内側のポイントが占める面積と外側のポリゴンの面積の差を使用して、フィットネス関数でそれを最小化しようとしていました。しかし、これを使用してポイントの座標を変更し、面積の差を再計算して繰り返し行う方法がわかりません。入力と出力がどのように見えるかを示しました。
前もって感謝します。
これは私がこれまでに書いたコードです。
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))]]