private static double CalcTree(int WX, int WY, double volfraq, double[,] retval, int penal) { KXMSolvers kx = new KXMSolvers(); var Rd1 = MatrixMath.To1D(retval); var U = kx.FE(WX, WY, Rd1, penal); /* double[,] V; * var lambdas = kx.Modal(WX, WY, Rd1, penal, 1, out V); * * List<double> womega = new List<double>(); * int iwReal = 0; * for (int i = 0; i < lambdas.Length; i++) * { * double freq = Math.Sqrt(lambdas[i]) / (2 * Math.PI); * womega.Add(freq); * if (freq <= 1.0 || double.IsNaN(freq)) * { * iwReal++; * } * } * if (iwReal >= womega.Count && womega.Count > 0) * { * iwReal = womega.Count - 1; * } * else if (womega.Count == 0) * { * womega.Add(10000); * iwReal = 0; * } * * double sumV = Rd1.Sum(); * sumV = sumV - (double)(WX * WY) * volfraq; * double F = 0; * double F1 = 50.0; * double F2 = 50.05; * double F3 = 75.382; * if (womega.Count < iwReal + 3) * { * F = 1e6; * } * else * { * double d1 = womega[iwReal] - F1; * double d2 = womega[iwReal + 1] - F2; * double d3 = womega[iwReal + 2] - F3; * F = (d1 * d1 + d2 * d2 + d3 * d3) * 1000.0; * } * /**/ double c = CalcCompliance(WX, WY, penal, kx, Rd1, U); double sumV = Rd1.Sum(); sumV = sumV - (double)(WX * WY) * volfraq; double F = c * c + sumV * sumV; return(F); }
}/**/ for (int inner = 0; inner < 1; inner++) { var Ukx = skx.FE_inded(WX, WY, g.Genom, SelectedUs, penal); var ke = skx.KE; double c = 0.0; double[] dc = new double[WX * WY]; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = Ukx[edof[i]]; } double xp = Math.Pow(g.Genom[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; dc[ely + elx * WY] = -penal *Math.Pow(g.Genom[ely + elx * WY], penal - 1) * UEKUE; } } dc = skx.Check(WX, WY, 1.5, g.Genom, dc); g.Genom = skx.OC(WX, WY, g.Genom, volfraq, dc); } return(AFC.ToArray()); } public static double[] Test_eval_simp(Genome <double> g, int WX, int WY, double volfraq, double f1, double f2, double f3) { double[] retval = new double[1]; int penal = 3; KXMSolvers skx = new KXMSolvers(); var U = skx.FE(WX, WY, g.Genom, penal); var ke = skx.KE; double c = 0.0; double[] dc = new double[WX * WY]; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = U[edof[i]]; } double xp = Math.Pow(g.Genom[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; dc[ely + elx * WY] = -penal *Math.Pow(g.Genom[ely + elx *WY], penal - 1) * UEKUE; } } dc = skx.Check(WX, WY, 1.5, g.Genom, dc); g.Genom = skx.OC(WX, WY, g.Genom, volfraq, dc); double sumV = 0; foreach (var gg in g.Genom) { sumV += (double)gg; } sumV = sumV - WX * WY * volfraq; retval[0] = c; return(retval); } public static double Test_eval(Genome <double> g, int WX, int WY, double volfraq) { double retval = 0.0f; int penal = 3; KXMSolvers skx = new KXMSolvers(); var U = skx.FE(WX, WY, g.Genom, penal); var ke = skx.KE; double c = 0.0; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = U[edof[i]]; } double xp = Math.Pow(g.Genom[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; } } // g.Genom = skx.Check(WX, WY, 1.5, g.Genom); double sumV = 0; foreach (var gg in g.Genom) { sumV += (double)gg; } sumV = sumV - WX * WY * volfraq; retval = c * c + sumV * sumV * 2.0; return(retval); } /**/ public static double Test_eval_weave(Genome <int> g, int WX, int WY, double volfraq) { double retval = 0; int penal = 3; var ge = convertWeaverToField(g, WX, WY); KXMSolvers skx = new KXMSolvers(); var U = skx.FE(WX, WY, ge, penal); var ke = skx.KE; double c = 0.0; for (int elx = 0; elx < WX; elx++) { for (int ely = 0; ely < WY; ely++) { int n1 = (WY + 1) * elx + ely; int n2 = (WY + 1) * (elx + 1) + ely; var edof = np.array(2 * n1, 2 * n1 + 1, 2 * n2, 2 * n2 + 1, 2 * n2 + 2, 2 * n2 + 3, 2 * n1 + 2, 2 * n1 + 3); double[] Ue = new double[8]; for (int i = 0; i < edof.size; i++) { Ue[i] = U[edof[i]]; } double xp = Math.Pow(ge[ely + elx * WY], penal); double[] KEUe = MatrixMath.MatVecProd(ke, Ue); double UEKUE = 0; for (int i = 0; i < KEUe.Length; i++) { UEKUE += Ue[i] * KEUe[i]; } c += xp * UEKUE; } } double sumV = ge.Sum(); sumV = sumV - (double)(WX * WY) * volfraq; retval = c * c * 1.0 + sumV * sumV * 0.0; return(retval); }