Exemple #1
0
        private static double CalcCompliance(int WX, int WY, int penal, KXMSolvers kx, double[] Rd1, double[] U)
        {
            var    ke = kx.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(Rd1[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;
                }
            }

            return(c);
        }
Exemple #2
0
            }/**/

            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);
        }