示例#1
0
        void optimizeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SchData data = ReadSchData();
            // Переменных
            int varCount = 3 * data.m * data.T + 2 * data.L * data.T;
            int sum      = 0;

            for (int i = 0; i < data.n; i++)
            {
                sum += data.T + (int)data.mTheta.Elements[i, 0] - 1;
            }
            varCount += 2 * sum;

            // Ограничений
            int eqCount = 2 * data.m * data.T + 2 * data.L * data.T +
                          sum + data.n;

            // Cуммы по i количеств периодов планирования до i-го изделия
            ExMatrix mSum = new ExMatrix(data.n, 1);

            for (int i = 1; i < data.n; i++)
            {
                mSum.Elements[i, 0] = mSum.Elements[i - 1, 0] +
                                      data.T + (int)data.mTheta.Elements[i, 0] - 1;
            }

            // Целевая функция
            ExMatrix mC = new ExMatrix(1, varCount);

            for (int j = 0; j < data.m; j++)
            {
                for (int t = 0; t < data.T; t++)
                {
                    mC.Elements[0, j *data.T + t] = -data.mP.Elements[j, t];
                }
            }

            // Столбцы коэффициентов ограничений
            ExMatrix[] amP = new ExMatrix[varCount];
            for (int i = 0; i < amP.Length; i++)
            {
                amP[i] = new ExMatrix(eqCount, 1);
            }

            // Столбец свободных членов
            ExMatrix mA = new ExMatrix(eqCount, 1);

            // 1
            int eqIndex = 0;

            for (int l = 0; l < data.L; l++)
            {
                for (int t = 0; t < data.T; t++)
                {
                    // x
                    int varOffset = data.m * data.T;
                    for (int i = 0; i < data.n; i++)
                    {
                        for (int k = 0; k < data.mTheta.Elements[i, 0]; k++)
                        {
                            int index = varOffset + (int)mSum.Elements[i, 0] + t + k;
                            amP[index].Elements[eqIndex, 0] += data.amG[i].Elements[l, k];
                        }
                    }

                    // zQMin
                    varOffset = data.m * data.T + sum;
                    amP[varOffset + l * data.T + t].Elements[eqIndex, 0] = -1;

                    // QMin
                    mA.Elements[eqIndex, 0] = data.mQMin.Elements[l, t];
                    eqIndex++;
                }
            }

            // 2
            for (int l = 0; l < data.L; l++)
            {
                for (int t = 0; t < data.T; t++)
                {
                    // x
                    int varOffset = data.m * data.T;
                    for (int i = 0; i < data.n; i++)
                    {
                        for (int k = 0; k < data.mTheta.Elements[i, 0]; k++)
                        {
                            int index = varOffset + (int)mSum.Elements[i, 0] + t + k;
                            amP[index].Elements[eqIndex, 0] += data.amG[i].Elements[l, k];
                        }
                    }

                    // zQMax
                    varOffset = data.m * data.T + sum + data.L * data.T;
                    amP[varOffset + l * data.T + t].Elements[eqIndex, 0] = 1;

                    // QMax
                    mA.Elements[eqIndex, 0] = data.mQMax.Elements[l, t];
                    eqIndex++;
                }
            }

            // 3
            for (int j = 0; j < data.m; j++)
            {
                for (int t = 0; t < data.T; t++)
                {
                    // y
                    amP[j * data.T + t].Elements[eqIndex, 0] = -1;

                    // x
                    int varOffset = data.m * data.T;
                    for (int i = 0; i < data.n; i++)
                    {
                        for (int k = 0; k < data.mTheta.Elements[i, 0]; k++)
                        {
                            int index = varOffset + (int)mSum.Elements[i, 0] + t + k;
                            amP[index].Elements[eqIndex, 0] += data.amTau[i].Elements[j, k];
                        }
                    }

                    // zB
                    varOffset = data.m * data.T + sum + 2 * data.L * data.T;
                    amP[varOffset + j * data.T + t].Elements[eqIndex, 0] = 1;

                    // B
                    mA.Elements[eqIndex, 0] = data.mB.Elements[j, t];
                    eqIndex++;
                }
            }

            // 4
            for (int i = 0; i < data.n; i++)
            {
                for (int t = 0; t < data.T + data.mTheta.Elements[i, 0] - 1; t++)
                {
                    // x
                    int varOffset = data.m * data.T;
                    int index     = varOffset + (int)mSum.Elements[i, 0] + t;
                    amP[index].Elements[eqIndex, 0] = 1;

                    // zD
                    varOffset = 2 * data.m * data.T + sum + 2 * data.L * data.T;
                    amP[varOffset + (int)mSum.Elements[i, 0] + t].Elements[eqIndex, 0] = -1;

                    // D
                    mA.Elements[eqIndex, 0] = data.amD[i].Elements[t, 0];
                    eqIndex++;
                }
            }

            // 5
            for (int i = 0; i < data.n; i++)
            {
                // x
                int varOffset = data.m * data.T;
                for (int t = 0; t < data.T; t++)
                {
                    amP[varOffset + (int)mSum.Elements[i, 0] + t].Elements[eqIndex, 0] = 1;
                }

                // N
                mA.Elements[eqIndex, 0] = data.mN.Elements[i, 0];
                eqIndex++;
            }

            // 6
            for (int j = 0; j < data.m; j++)
            {
                for (int t = 0; t < data.T; t++)
                {
                    // y
                    amP[j * data.m + t].Elements[eqIndex, 0] = 1;

                    // zAlphaB
                    int varOffset = 2 * data.m * data.T + 2 * sum +
                                    2 * data.L * data.T;
                    amP[varOffset + j * data.T + t].Elements[eqIndex, 0] = 1;

                    // AlphaB
                    mA.Elements[eqIndex, 0] = data.alpha * data.mB.Elements[j, t];
                    eqIndex++;
                }
            }

            MsMethod method = new MsMethod(amP, mA, mC, 0);

            int[] basis = new int[eqCount];
            int   pos, varNum = data.m * data.T + 2 * data.L * data.T + sum;

            for (pos = 0; pos < varNum; pos++)
            {
                basis[pos] = data.m * data.T + sum + pos;
            }
            for (int i = 0; i < data.n; i++)
            {
                basis[pos + i] = data.m * data.T + (int)mSum.Elements[i, 0];
            }
            pos += data.n;
            for (int i = 0; i < data.m * data.T; i++)
            {
                basis[pos] = 2 * data.m * data.T + 2 * data.L * data.T + 2 * sum + i;
                pos++;
            }

            webBrowser1.DocumentText = stdText;
            lbIters.Items.Clear();
            try
            {
                method.SetBasis(basis);
                while (method.DoIteration())
                {
                    ;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Вычисления прерваны",
                                MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }

            iters = (IterationState[])method.states.ToArray(typeof(IterationState));
            lbIters.SuspendLayout();
            for (int i = 0; i < iters.Length; i++)
            {
                string str;
                if (iters[i].isDecisionLegal)
                {
                    str = string.Format("{0}. F = {1}; допустимое решение",
                                        i + 1, -iters[i].GetFuncValue());
                }
                else
                {
                    str = string.Format("{0}. F = {1}; недопустимое решение",
                                        i + 1, -iters[i].GetFuncValue());
                }
                lbIters.Items.Add(str);
            }
            lbIters.ResumeLayout();
            varNames = GetHtmlVarNames(data);
            try
            {
                lbIters.SelectedIndex = lbIters.Items.Count - 1;
            }
            catch { }
            tabControl1.SelectedTab = tabControl1.TabPages["tpResults"];
        }