public override string MakeTransform(SimplexTable inputTable, out SimplexTable outputTable, out bool success) { outputTable = new SimplexTable(inputTable); string result = "<h3>Dual simplex method</h3><br>Let's use dual simplex method.<br>"; PrepareForMethod(outputTable, out outputTable, ref result); result += "Step 0:<br>"; result += PrintTableToHTML(outputTable, curBasis, curDelta); result += "<br><br>"; int iterNum = 0; string checkResult = ""; while (CanContinue(outputTable, out checkResult, out success)) { if (iterNum++ > 0) { result += $"Step {iterNum}:<br>"; } int minBIndex = FindIndexOfMin(outputTable.bVector); var gamas = new List <SimplexCoef>(); for (int j = 0; j < outputTable.NumOfVariables; j++) { if (outputTable.aMatrix[minBIndex][j].value.Sign >= 0) { gamas.Add(null); continue; } gamas.Add(curDelta[j] / (-outputTable.aMatrix[minBIndex][j])); } int minGamaIndex = FindIndexOfMin(gamas); result += $"{outputTable.cLables[minGamaIndex].Value} going inside the basis.<br>"; result += $"{outputTable.cLables[curBasis[minBIndex]].Value} going outside the basis.<br>"; var jordanTransform = new JordanTransform(minBIndex, minGamaIndex); result += jordanTransform.MakeTransform(outputTable, out outputTable, out bool s); ReevaluateBasisAndDeltas(outputTable); int numOfVariablesBeforeRemovingUnused = outputTable.NumOfVariables; result += RemoveUnusedSinteticVariables(outputTable, out outputTable, curBasis); if (outputTable.NumOfVariables != numOfVariablesBeforeRemovingUnused) { ReevaluateBasisAndDeltas(outputTable); } result += PrintTableToHTML(outputTable, curBasis, curDelta); result += "<br><br>"; } result += checkResult; if (success) { result += FormAnswer(outputTable, curBasis); } return(result); }
public virtual string MakeTransform(SimplexTable inputTable, out SimplexTable outputTable, out bool success) { outputTable = new SimplexTable(inputTable); string result = "<h3>Simplex method: </h3><br>Let's use simplex method.<br>"; PrepareForMethod(outputTable, out outputTable, ref result); result += "<br>"; if (outputTable.costFIsInverted) { result += "Cost function is inverted: <br>"; } result += PrintCostFunction(outputTable); result += "<br>Step 0:<br>"; result += PrintTableToHTML(outputTable, curBasis, curDelta); result += "<br><br>"; int iterNum = 0; string checkResult; while (CanContinue(outputTable, curDelta, out checkResult, out success)) { if (iterNum++ > 0) { result += $"Step {iterNum}:<br>"; } int minDeltaIndex = FindIndexOfMin(curDelta); var tetas = new List <SimplexCoef>(); for (int i = 0; i < outputTable.NumOfConstrains; i++) { if (outputTable.aMatrix[i][minDeltaIndex].value.Sign <= 0) { tetas.Add(null); continue; } tetas.Add(outputTable.bVector[i] / outputTable.aMatrix[i][minDeltaIndex]); } int minTetaIndex = FindIndexOfMin(tetas); result += $"{outputTable.cLables[minDeltaIndex].Value} going inside the basis.<br>"; result += $"{outputTable.cLables[curBasis[minTetaIndex]].Value} going outside the basis.<br>"; var jordanTransform = new JordanTransform(minTetaIndex, minDeltaIndex); result += jordanTransform.MakeTransform(outputTable, out outputTable, out bool s); ReevaluateBasisAndDeltas(outputTable); int numOfVariablesBeforeRemovingUnused = outputTable.NumOfVariables; result += RemoveUnusedSinteticVariables(outputTable, out outputTable, curBasis); if (outputTable.NumOfVariables != numOfVariablesBeforeRemovingUnused) { ReevaluateBasisAndDeltas(outputTable); } result += PrintTableToHTML(outputTable, curBasis, curDelta); result += "<br><br>"; } result += checkResult; if (success) { result += FormAnswer(outputTable, curBasis); } result += "<br>"; return(result); }