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"]; }