Beispiel #1
0
        public List <List <int> > Run(SigmaTable sigmaTable, ref VectorSet nonDominatedVectors)
        {
            List <List <int> > strategies = new List <List <int> >();



            foreach (Vector resultVector in nonDominatedVectors)
            {
                u   = resultVector;
                ksi = task.Dimension;
                eta = task.Limit;
                List <int> strategy = new List <int>();
                for (int i = 0; i < task.Dimension; i++)
                {
                    strategy.Add(0);
                }
                while (u.X != 0 && u.Y != 0)
                {
                    strategy[ksi - 1] = 1;
                    u.X = u.X - task.FirstCriterion[ksi - 1];
                    u.Y = u.Y - task.SecondCriterion[ksi - 1];
                    if (u.X != 0 && u.Y != 0)
                    {
                        eta = eta - task.LimitationCoefficients[ksi - 1];
                        ksi = ksi - 1;
                        FindU(sigmaTable);
                    }
                }
                strategies.Add(strategy);
            }
            return(strategies);
        }
Beispiel #2
0
        void SetSigmaTable(SigmaTable sigmaTable)
        {
            dt_SigmaTable.Columns.Add("Сигма");

            foreach (var sigma in sigmaTable)
            {
                String s = "<(" + sigma.Vector.X + "," + sigma.Vector.Y + ")," + sigma.Row + "," + sigma.Column + ">";
                dt_SigmaTable.Rows.Add(s);
            }
            ctrl_dg_results.ItemsSource = dt_SigmaTable.DefaultView;
        }
Beispiel #3
0
    public TaskSolution Solve(DiffMethod method, double a, double b, int n)
    {
        TablesManager manager = new TablesManager();

        t0Table    = manager.T0Table;
        mTable     = manager.MTable;
        nTable     = manager.NTable;
        sigmaTable = manager.SigmaTable;

        DiffEquationSys deSys = null;

        switch (method)
        {
        case DiffMethod.RungeKutta:
            deSys = new RungeKuttaDiffEquationSys(new DiffEquationSys.SeveralArgFun[]
            {
                (x, y) => ((y[1] - (Rk + Rp(y[0])) * y[0]) / Lk),
                (x, y) => (-y[0] / Ck)
            });
            break;

        case DiffMethod.ImplTrap:
            deSys = new ImplTrapDiffEquationSys(new DiffEquationSys.SeveralArgFun[]
            {
                (x, y) => ((y[1] - (Rk + Rp(y[0])) * y[0]) / Lk),
                (x, y) => (-y[0] / Ck)
            });
            break;
        }

        DiffEquationSolution[] sysSolution = deSys.FindSolution(a, b, new double[] { I0, Uc0 }, n);
        DiffEquationSolution   rpSolution  = new DiffEquationSolution(a, b, n);

        for (int i = 0; i <= n; i++)
        {
            rpSolution.Y[i] = Rp(sysSolution[0].Y[i]);
        }
        DiffEquationSolution ucpSolution = new DiffEquationSolution(a, b, n);

        for (int i = 0; i <= n; i++)
        {
            ucpSolution.Y[i] = rpSolution.Y[i] * sysSolution[0].Y[i];
        }

        TaskSolution taskSolution;

        taskSolution.I   = sysSolution[0];
        taskSolution.Uc  = sysSolution[1];
        taskSolution.Rp  = rpSolution;
        taskSolution.Ucp = ucpSolution;

        return(taskSolution);
    }
Beispiel #4
0
 public void FindU(SigmaTable sigmaTable)
 {
     foreach (Sigma sigma in sigmaTable)
     {
         if (sigma.Vector.X == u.X && sigma.Vector.Y == u.Y && sigma.Row <= ksi && sigma.Column <= eta)
         {
             this.u   = sigma.Vector;
             this.ksi = sigma.Row;
             this.eta = sigma.Column;
         }
     }
 }
        public void Run(ref VectorTable vectorsTable, ref SigmaTable sigmaTable,
                        ref VectorSet nonDominatedVectors)
        {
            Vector    nullVector    = new Vector(-1, -1);
            Vector    zeroVector    = new Vector(0, 0);
            VectorSet nullVectorSet = new VectorSet(nullVector);
            VectorSet zeroVectorSet = new VectorSet(zeroVector);

            //prepare table


            for (int i = 0; i < task.Dimension; i++)
            {
                Row nullRow = new Row();
                for (int j = 0; j < task.Limit; j++)
                {
                    nullRow.Add(new VectorSet(new Vector(-1, -1)));
                }
                vectorsTable.Add(nullRow);
            }
            for (int i = 0; i < task.Limit; i++)
            {
                if (task.LimitationCoefficients[0] <= i + 1)
                {
                    Vector    tmpVector    = new Vector(task.FirstCriterion[0], task.SecondCriterion[0]);
                    VectorSet tmpVectorSet = new VectorSet(tmpVector);
                    vectorsTable[0][i].Set(tmpVectorSet);
                }
                else
                {
                    vectorsTable[0][i].Set(new VectorSet(new Vector(0, 0)));
                }
            }

            //fill table
            RecursFill(vectorsTable, task.Dimension - 1, task.Limit - 1);
            nonDominatedVectors.Set(vectorsTable[task.Dimension - 1][task.Limit - 1]);

            //fill sigma-table
            for (int i = 0; i < task.Dimension; i++)
            {
                for (int j = 0; j < task.Limit; j++)
                {
                    if ((vectorsTable[i][j][0].X != zeroVectorSet[0].X) && (vectorsTable[i][j][0].Y != zeroVectorSet[0].Y) && (vectorsTable[i][j][0].X != nullVectorSet[0].X) && (vectorsTable[i][j][0].Y != nullVectorSet[0].Y))
                    {
                        for (int k = 0; k < vectorsTable[i][j].Count; k++)
                        {
                            Sigma newSigma = new Sigma(vectorsTable[i][j][k], i + 1, j + 1);
                            if (newSigma.Vector.X != 0 || newSigma.Vector.Y != 0) //check not empty
                            {
                                bool notExist = true;
                                foreach (Sigma oldSigma in sigmaTable)
                                {
                                    if ((oldSigma.Vector.X == newSigma.Vector.X) && (oldSigma.Vector.Y == newSigma.Vector.Y))
                                    {
                                        notExist = false;
                                    }
                                }
                                if (notExist)
                                {
                                    sigmaTable.Add(newSigma);
                                }
                            }
                        }
                    }
                }
            }
        }