7角形でこういうモデルのとき
の最適解をコンピューターで算出してみた。
Rのコードはこれ
rm(list=ls())
n=7
ngon <- function(n,digit=TRUE,axis=FALSE,cex=1,...){ # draw n-polygon
r=exp(2*pi/n*1i)
p=complex(n)
for(i in 1:(n+1)) p[i]= (1-r^i)/(1-r)
plot(p,bty='l',type='l',axes=axis, ann=FALSE,asp=1,...)
points(1/(1-r),pch='.')
if(digit) text(Re(p),Im(p),paste('p',1:n),cex=cex)
if(axis){axis(1) ; axis(2)}
invisible(p)} # return vertex complex
seg <- function(a,b,...){# draw segment of complex a to complex b
segments(Re(a),Im(a),Re(b),Im(b),col=2,...)}
pt <- function(x,y=NULL,...){ # draw text y at complex x
text(Re(x),Im(x), ifelse(is.null(y),'+',y), ...)}
poly_demo <- function(x=runif(n),y=runif(n)){ # draw segments
graphics.off()
p=ngon(n,axis=T,col='skyblue')
Q=complex(n)
re1=re2=0
for(i in 1:n){
Q[i]=x[i]+y[i]*1i
pt(Q[i],paste('q',i))
seg(p[i],Q[i])
re1=re1+abs(p[i]-Q[i])
}
for(i in 1:(n-1)){
seg(Q[i],Q[i+1])
re2=re2+abs(Q[i]-Q[i+1])
}
return(sum(re1)+sum(re2))}
poly_demo()
p=ngon(n,axis=T,col='skyblue')
poly <- function(par){
x=par[1:n]
y=par[(n+1):(2*n)]
Q=complex(n)
re1=re2=0
for(i in 1:n){
Q[i]=x[i]+y[i]*1i
re1=re1+abs(p[i]-Q[i])}
for(i in 1:(n-1)){
re2=re2+abs(Q[i]-Q[i+1])}
return(sum(re1)+sum(re2))}
(opt=optim(runif(2*n),poly,method = 'CG'))
par=opt$par
ngon(n,axis=T,col='skyblue')
poly_demo(par[1:n],par[(n+1):(2*n)])