#######################################
# SRA Raggruppamento automatico.

# Programma principale
Sra = function (X,k)
{n=nrow(X)
MP=Mm(numeric(n*40),col=40)
MP=Sra.nuovi(MP,k,1,40)
dt=10; t=0; repeat
{t=t+1; R=Sra.rendimenti(MP,X,k)
Ord=order(R); MP=MP[,Ord]
MP=Sra.nuovi(MP,k,31,40)
MP=Sra.mutazioni(MP,k,R,X)
MP=Sra.incroci(MP,k,R,X)
if (t%%dt==0)
{dt=Sra.visualizza(t,dt,
  R[Ord[1]],MP[,1])
if (dt==0) break}}}

# Matrice dei baricentri.
Sra.baricentri = function (X,P,k)
{m=ncol(X); n=nrow(X)
cont=S.conta(P,k)
B=Mm(rep(0,m*k),righe=k)
for (i in 1:n)
{a=P[i]; B[a,]=B[a,]+X[i,]}
for (a in 1:k) B[a,]=B[a,]/cont[a]
B}

# Calcola la funzione g.
Sra.g = function (P,X,k)
{n=nrow(X); B=Sra.baricentri(X,P,k)
s=0
for (i in 1:n) {u=X[i,]-B[P[i],]
s=s+Mv.scalare(u,u)}
s}