void btnOpt_Click(object sender, EventArgs e) { string rep = ""; Variable[] arrQ, arrU; Import(out arrQ, out arrU); Sample[] arrSmp = new Sample[arrU.Length]; double[][] arrCoeff = new double[arrQ.Length][]; for (int i = 0; i < arrU.Length; i++) { arrSmp[i] = new Sample(arrU[i].name, arrU[i].id, arrU[i].arr); } for (int i = 0; i < arrQ.Length; i++) { Sample[] arrTSmp = new Sample[arrSmp.Length]; for (int j = 0; j < arrTSmp.Length; j++) { arrTSmp[j] = new TranSample(arrSmp[j], dgvU[i + 2, j].Value.ToString()); } Sample smp = new Sample(arrQ[i].name, arrQ[i].id, arrQ[i].arr); Regression r = new Regression(smp, arrSmp); arrCoeff[i] = r.arrB; rep += r.GetRegReport() + "<br>"; } string[] arrStage = new string[dgvStage.Rows.Count]; for (int i = 0; i < arrStage.Length; i++) { arrStage[i] = dgvStage[0, i].Value.ToString(); } StageForm sf = new StageForm(arrStage); sf.ShowDialog(); List <string> lNU = new List <string>(), lU = new List <string>(); int k; for (k = 0; k < arrStage.Length; k++) { if (sf.stage == arrStage[k]) { break; } else { lNU.AddRange(dgvStage[1, k].Value.ToString().Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries)); } } ExpForm ef = new ExpForm(lNU.ToArray(), arrU); ef.ShowDialog(); for (int i = 0; i < arrU.Length; i++) { if (!lNU.Contains(string.Format("{0}", i + 1))) { lU.Add(arrU[i].name); } } int p = lU.Count, n = arrQ.Length; int[] arrI = new int[p], arrNI = new int[arrU.Length - p]; for (int i = 0; i < p; i++) { for (int j = 0; j < arrU.Length; j++) { if (arrU[j].name == lU[i]) { arrI[i] = j; break; } } } for (int i = 0; i < arrNI.Length; i++) { for (int j = 0; j < arrU.Length; j++) { if (arrU[j].name == lNU[i]) { arrNI[i] = j; break; } } } string[,] matrFunc = new string[p, n]; for (int i = 0; i < p; i++) { for (int j = 0; j < n; j++) { matrFunc[i, j] = dgvU[j + 2, arrI[i]].Value.ToString(); } } double[][] arrC = new double[n][]; for (int j = 0; j < n; j++) { arrC[j] = new double[p + 1]; double s = arrCoeff[j][0]; for (int i = 0; i < arrU.Length; i++) { for (k = 0; k < p; k++) { if (arrI[k] == i) { break; } } if (k < p) { arrC[j][k + 1] = arrCoeff[j][i + 1]; } else { for (k = 0; k < p; k++) { if (arrNI[k] == i) { break; } } s += arrCoeff[j][i + 1] * F(ef.arr[k], dgvU[j + 2, i].Value.ToString()); } } arrC[j][0] = s; } double[] arrUMin = new double[p], arrUMax = new double[p], arrUSMin = new double[p]; for (int i = 0; i < p; i++) { arrUMin[i] = double.Parse(dgvUParam[1, arrI[i]].Value.ToString()); arrUMax[i] = double.Parse(dgvUParam[2, arrI[i]].Value.ToString()); arrUSMin[i] = double.Parse(dgvUParam[3, arrI[i]].Value.ToString()); } double[] arrYOpt = new double[n], arrYMin = new double[n], arrYMax = new double[n], arrAlpha = new double[n]; for (int i = 0; i < n; i++) { arrYOpt[i] = double.Parse(dgvQParam[4, i].Value.ToString()); arrYMin[i] = double.Parse(dgvQParam[2, i].Value.ToString()); arrYMax[i] = double.Parse(dgvQParam[3, i].Value.ToString()); arrAlpha[i] = double.Parse(dgvQParam[1, i].Value.ToString()); } double R = double.Parse(tbR.Text); HJInitialParams init = new HJInitialParams(double.Parse(tbDU.Text), double.Parse(tbDF.Text), arrCoeff, matrFunc, arrUMin, arrUMax, arrUSMin, arrYOpt, arrYMin, arrYMax, arrAlpha, R); int iterNum = 0; List <HJIteration> lIter = new List <HJIteration>(); double[] arrX = new double[2 * p], arrXDelta = new double[2 * p]; double xEps = double.Parse(tbDU.Text); for (int i = 0; i < 2 * p; i++) { arrX[i] = 0.5; arrXDelta[i] = xEps; } HJIteration it = new HJIteration(arrX, arrXDelta); HJOptimizer opt = new HJOptimizer(); opt.Initialize(init); //double C = double.Parse(tbC.Text); double f = double.MaxValue, fEps = double.Parse(tbDF.Text); rep += "ОПТИМИЗАЦИЯ МЕТОДОМ ХУКА-ДЖИВСА<br><table border = 1 cellspacing = 0><tr>"; for (int i = 0; i < p; i++) { rep += "<td>" + lU[i]; } rep += "<td>Целевая функция"; rep += it.ToHtml(init, 3); //do { do { it = (HJIteration)opt.DoIteration(it); if (it == null) { break; } lIter.Add(it); iterNum++; rep += it.ToHtml(init, 3); }while (iterNum < 1000); //double FNext = lIter.Last().fRes; //if (Math.Abs(FNext - f) < fEps) // break; //f = FNext; //R *= C; //init = new HJInitialParams(double.Parse(tbDU.Text), double.Parse(tbDF.Text), // arrCoeff, matrFunc, arrUMin, arrUMax, arrUSMin, arrYOpt, arrYMin, arrYMax, arrAlpha, R); //it = new HJIteration(lIter.Last().arrX, arrXDelta); } //while (true); rep += "</table><br>"; rep += "РЕЗУЛЬТАТЫ ОПТИМИЗАЦИИ<br>"; for (int i = 0; i < p; i++) { rep += string.Format("m<sub>{0}</sub> = {1:f4}<br>", i + 1, lIter.Last().arrX[i]); } Random rnd = new Random(); for (int i = 0; i < p; i++) { rep += string.Format("s<sub>{0}</sub> = {1:f4}<br>", i + 1, lIter.Last().arrX[i + p]); } rep += string.Format("<br>Целевая функция:<br>F = {0:f4}<br>", init.GetFuncValue(lIter.Last().arrX)); rep += "<br>Значения параметров распределений показателей качества<br>"; for (int i = 0; i < n; i++) { rep += string.Format("mu<sub>{0}</sub> = {1:f4}<br>", i + 1, init.arrMu[i]); rep += string.Format("sigma<sub>{0}</sub> = {1:f4}<br>", i + 1, init.arrSigma[i]); } rep += "<br>Значения показателей качества<br>"; for (int i = 0; i < n; i++) { rep += string.Format("y<sub>{0}</sub> = {1:f4}<br>", i + 1, init.arrY[i]); } rep += "<br>Технологические факторы до и после оптимизации<br>"; rep += "Нормированные средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации"; for (int i = 0; i < p; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, 0, lIter.Last().arrX[i]); } rep += "</table><br>Средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации"; for (int i = 0; i < p; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, arrU[i].Inv(0), arrU[i].Inv(lIter.Last().arrX[i])); } rep += "</table><br>Нормированные средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации"; for (int i = 0; i < p; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, 1, lIter.Last().arrX[p + i]); } rep += "</table><br>Средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации"; for (int i = 0; i < p; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrU[i].name, arrU[i].sigma, arrU[i].sigma * lIter.Last().arrX[p + i]); } rep += "</table>"; rep += "<br>Показатели качества до и после оптимизации<br>"; rep += "Нормированные средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации"; for (int i = 0; i < n; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, 0, init.arrMu[i]); } rep += "</table><br>Средние значения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>Среднее до оптимизации<td>Среднее после оптимизации"; for (int i = 0; i < n; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, arrQ[i].Inv(0), arrQ[i].Inv(init.arrMu[i])); } rep += "</table><br>Нормированные средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации"; for (int i = 0; i < n; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, 1, init.arrSigma[i]); } rep += "</table><br>Средние квадратические отклонения до и после оптимизации<table border = 1 cellspacing = 0><tr>" + "<td>Величина<td>СКО до оптимизации<td>СКО после оптимизации"; for (int i = 0; i < n; i++) { rep += string.Format("<tr><td>{0}<td>{1:f4}<td>{2:f4}", arrQ[i].name, arrQ[i].sigma, arrQ[i].sigma * init.arrSigma[i]); } rep += "</table>"; List <Sample> lSmp = new List <Sample>(); for (int i = 1; i < arrQ.Length; i++) { lSmp.Add(new Sample(arrQ[i].name, string.Format("y{0}", i + 1), arrQ[i].arr)); } lSmp.AddRange(arrSmp); Regression reg = new Regression(new Sample(arrQ[0].name, "y0", arrQ[0].arr), lSmp.ToArray()); rep += reg.GetCorrReport(); ResForm rf = new ResForm(rep); rf.Show(); List <double[]> lArr = new List <double[]>(); List <string> lName = new List <string>(); List <double> lMu = new List <double>(), lSigma = new List <double>(); for (int i = 0; i < arrU.Length; i++) { lName.Add(arrU[i].name); lMu.Add(arrU[i].Inv(lIter.Last().arrX[i])); lSigma.Add(arrU[i].sigma * lIter.Last().arrX[i + p]); double[] arr = new double[arrU[i].arr.Length]; for (int j = 0; j < arr.Length; j++) { arr[j] = arrU[i].Inv(arrU[i].arr[j]); } lArr.Add(arr); } for (int i = 0; i < arrQ.Length; i++) { lName.Add(arrQ[i].name); lMu.Add(arrQ[i].Inv(init.arrMu[i])); lSigma.Add(arrQ[i].sigma * init.arrSigma[i]); double[] arr = new double[arrQ[i].arr.Length]; for (int j = 0; j < arr.Length; j++) { arr[j] = arrQ[i].Inv(arrQ[i].arr[j]); } lArr.Add(arr); } DistForm df = new DistForm(lName.ToArray(), lArr.ToArray(), lMu.ToArray(), lSigma.ToArray()); df.Show(); }