Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР ММИО.docx
Скачиваний:
7
Добавлен:
10.02.2016
Размер:
151.63 Кб
Скачать

Приложение а Исходный код приложения

import java.util.ArrayList;

import javax.swing.JTable;

import latex.LPPtoLaTeX;

import main.BigTable;

import main.LP_Solver;

public class LPP{

public String ObjFuncType;

public ArrayList<String> VariableNames;

public ArrayList<Double> ObjFuncCoeff;

public ArrayList<ArrayList<Double>> ConstraintCoeff;

public ArrayList<String> ConstraintTypes;

public ArrayList<Double> ConstraintRHSs;

public Double ObjFuncValue;

LPP(String oFT, ArrayList<String> vN, ArrayList<Double> oFC, ArrayList<ArrayList<Double>> A, ArrayList<String> cT, ArrayList<Double> cRHSs, Double OFV)

{

this.ObjFuncType = oFT;

this.VariableNames = vN;

this.ObjFuncCoeff = oFC;

this.ConstraintCoeff = A;

this.ConstraintTypes = cT;

this.ConstraintRHSs = cRHSs;

this.ObjFuncValue = OFV;

}

public LPP(JTable Table, ArrayList<Integer> variableIndex) {

this.ObjFuncType = Table.getValueAt(0, Table.getColumnCount() - 2).toString();

this.VariableNames = new ArrayList();

this.ObjFuncCoeff = new ArrayList();

this.ConstraintCoeff = new ArrayList();

this.ConstraintTypes = new ArrayList();

this.ConstraintRHSs = new ArrayList();

for (int i = 0; i < variableIndex.size(); i++) {

this.VariableNames.add(Table.getColumnName(i));

if (LP_Solver.Table.getValueAt(0, i) != null) {

this.ObjFuncCoeff.add((Double)LP_Solver.Table.getValueAt(0,i));

}

else {

this.ObjFuncCoeff.add(new Double(0.0D));

}

}

if (LP_Solver.Table.getValueAt(0, LP_Solver.Table.getColumnCount() - 1) != null) {

this.ObjFuncValue = ((Double)LP_Solver.Table.getValueAt(0,LP_Solver.Table.getColumnCount() - 1));

}

else {

this.ObjFuncValue = new Double(0.0D);

}

for (int j = 1; j < LP_Solver.Table.getRowCount(); j++) {

ArrayList Constraint = new ArrayList();

for (int i = 0; i < variableIndex.size(); i++) {

if (LP_Solver.Table.getValueAt(j, i) != null) {

Constraint.add((Double)LP_Solver.Table.getValueAt(j, i));

}

else {

Constraint.add(new Double(0.0D));

}

}

this.ConstraintCoeff.add(Constraint);

this.ConstraintTypes.add(LP_Solver.Table.getValueAt(j, variableIndex.size()).toString());

if (LP_Solver.Table.getValueAt(j, variableIndex.size() + 1) != null) {

this.ConstraintRHSs.add((Double)LP_Solver.Table.getValueAt(j, variableIndex.size() + 1));

}

else{

this.ConstraintRHSs.add(new Double(0.0D));

}

}

public static String getDisplay(LPP Input){

String Output = "";

if (Input.ObjFuncType == "Max") {

Output = "Maximize";

}

else {

Output = "Minimize";

}

Output = Output + " " + displayEqLine(Input.ObjFuncCoeff, Input.VariableNames);

if (Input.ObjFuncValue.doubleValue() != 0.0D) {

Output = Output + " + " + Toolbox.formatDecimals(Input.ObjFuncValue);

}

Output = Output + '\n' + "subject to the constraints:" + '\n';

for (int j = 0; j < Input.ConstraintRHSs.size(); j++) {

ArrayList Constraint = (ArrayList)Input.ConstraintCoeff.get(j);

Output = Output + displayEqLine(Constraint, Input.VariableNames);

Output = Output + " " + (String)Input.ConstraintTypes.get(j);

Output = Output + " " + Toolbox.formatDecimals((Double)Input.ConstraintRHSs.get(j));

Output = Output + '\n';

}

return Output + '\n';

}

private static String displayEqLine(ArrayList<Double> coefficients, ArrayList<String> variableNames) {

String Output = "";

int startIndex = 1;

for (int i = 0; i < variableNames.size(); i++) {

if ((((Double)coefficients.get(i)).doubleValue() != 0.0D) || (((Double)coefficients.get(i)).doubleValue() != -0.0D)) {

Output = Output + Toolbox.formatDecimals((Double)coefficients.get(i)) + (String)variableNames.get(i);

break;

}

startIndex++;

}

for (int i = startIndex; i < variableNames.size(); i++) {

String signString = " + ";

Double sign = Double.valueOf(1.0D);

if (Double.compare(((Double)coefficients.get(i)).doubleValue(), 0.0D) < 0) {

signString = " - ";

sign = Double.valueOf(-1.0D);

}

if ((((Double)coefficients.get(i)).doubleValue() != 0.0D) || (((Double)coefficients.get(i)).doubleValue() != -0.0D)) {

Output = Output + signString + Toolbox.formatDecimals(Double.valueOf(sign.doubleValue() * ((Double)coefficients.get(i)).doubleValue())) + (String)variableNames.get(i);

}

}

return Output;

}

public static LPP makeStandardForm(LPP Input) {

LPP Output = Input;

for (int i = 0; i < Input.ConstraintTypes.size(); i++){

if (Input.ConstraintTypes.get(i) == "≥") {

Output = addVariableAt(Output, i, -1.0D);

Output.ConstraintTypes.set(i, "=");

}

if (Input.ConstraintTypes.get(i) == "≤") {

Output = addVariableAt(Output, i, 1.0D);

Output.ConstraintTypes.set(i, "=");

}

}

return Output;

}

private static LPP makeStandardForm(LPP Input, ArrayList<Integer> ArtificialVariables) {

LPP Output = Input;

for (int i = 0; i < Input.ConstraintTypes.size(); i++){

if (Input.ConstraintTypes.get(i) == "≥") {

Output = addVariableAt(Output, i, -1.0D);

Output.ConstraintTypes.set(i, "=");

ArtificialVariables = increaseArtificialVariableIndices(ArtificialVariables);

}

if (Input.ConstraintTypes.get(i) == "≤") {

Output = addVariableAt(Output, i, 1.0D);

Output.ConstraintTypes.set(i, "=");

ArtificialVariables = increaseArtificialVariableIndices(ArtificialVariables);

}

}

return Output;

}

private static ArrayList<Integer> increaseArtificialVariableIndices(ArrayList<Integer> ArtificialVariables) {

for (int j = 0; j < ArtificialVariables.size(); j++) {

if (((Integer)ArtificialVariables.get(j)).intValue() != -1) {

ArtificialVariables.set(j, Integer.valueOf(((Integer)ArtificialVariables.get(j)).intValue() + 1));

}

}

return ArtificialVariables;

}

private static ArrayList<Integer> getArtificialVariableAssignments(LPP Input) {

ArrayList Output = new ArrayList();

int k = 0;

for (int j = 0; j < Input.ConstraintTypes.size(); j++) {

if (Input.ConstraintTypes.get(j) == "=") {

Output.add(Integer.valueOf(Input.ObjFuncCoeff.size() + k));

k++;

}

else {

Output.add(Integer.valueOf(-1));

}

}

return Output;

}

private static LPP addArtificialVariables(LPP Input, ArrayList<Integer> ArtificialVariables) {

LPP Output = Input;

for (int j = 0; j < Input.ConstraintTypes.size(); j++) {

if (((Integer)ArtificialVariables.get(j)).intValue() != -1) {

Output = addVariableAt(Output, j, 1.0D);

}

}

return Output;

}

public static LPP pivot(LPP Input, int varIndex, int constIndex) {

LPP Output = Input;

ArrayList PivotConstraint = (ArrayList)Output.ConstraintCoeff.get(constIndex);

Double PivotConstRHS = (Double)Output.ConstraintRHSs.get(constIndex);

if (((Double)PivotConstraint.get(varIndex)).doubleValue() == 0.0D) {

return Input;

}

Double PivotVarCoeff = (Double)PivotConstraint.get(varIndex);

for (int i = 0; i < PivotConstraint.size(); i++) {

Double coeff = (Double)PivotConstraint.get(i);

PivotConstraint.set(i, Double.valueOf(coeff.doubleValue() / PivotVarCoeff.doubleValue()));

}

PivotConstRHS = Double.valueOf(PivotConstRHS.doubleValue() / PivotVarCoeff.doubleValue());

Output.ConstraintCoeff.set(constIndex, PivotConstraint);

Output.ConstraintRHSs.set(constIndex, PivotConstRHS);

for (int j = 0; j < Input.ConstraintCoeff.size(); j++){

if (j != constIndex){

ArrayList Constraint = (ArrayList)Output.ConstraintCoeff.get(j);

Double ConstRHS = (Double)Output.ConstraintRHSs.get(j);

if (((Double)Constraint.get(varIndex)).doubleValue() != 0.0D) {

Double ConstraintPivotVarCoeff = (Double)Constraint.get(varIndex);

for (int i = 0; i < Constraint.size(); i++) {

Double ConstraintCoeff = (Double)Constraint.get(i);

Double PivotConstraintCoeff = (Double)PivotConstraint.get(i);

Constraint.set(i, Double.valueOf(ConstraintCoeff.doubleValue() - PivotConstraintCoeff.doubleValue() * ConstraintPivotVarCoeff.doubleValue()));

}

ConstRHS = Double.valueOf(ConstRHS.doubleValue() - PivotConstRHS.doubleValue() * ConstraintPivotVarCoeff.doubleValue());

Output.ConstraintCoeff.set(j, Constraint);

Output.ConstraintRHSs.set(j, ConstRHS);

}

}

}

Double PivotVarCoeff = (Double)Output.ObjFuncCoeff.get(varIndex);

PivotConstraint = (ArrayList)Output.ConstraintCoeff.get(constIndex);

PivotConstRHS = (Double)Output.ConstraintRHSs.get(constIndex);

Output.ObjFuncCoeff.set(varIndex, new Double(0.0D));

Output.ObjFuncValue = Double.valueOf(Output.ObjFuncValue.doubleValue() + PivotVarCoeff.doubleValue() * PivotConstRHS.doubleValue());

for (int i = 0; i < Output.ObjFuncCoeff.size(); i++) {

if (i != varIndex) {

Double q = Double.valueOf(((Double)Output.ObjFuncCoeff.get(i)).doubleValue() + -1.0D * ((Double)PivotConstraint.get(i)).doubleValue() * PivotVarCoeff.doubleValue());

Output.ObjFuncCoeff.set(i, q);

}

}

return Output;

}

private static LPP addVariableAt(LPP Input, int constraintIndex, double value) {

LPP Output = Input;

Output.VariableNames.add(Toolbox.getSubscript(Output.VariableNames.size()));

Output.ObjFuncCoeff.add(new Double(0.0D));

for (int j = 0; j < Output.ConstraintCoeff.size(); j++) {

if (j != constraintIndex) {

ArrayList Constraint = (ArrayList)Output.ConstraintCoeff.get(j);

Constraint.add(new Double(0.0D));

Output.ConstraintCoeff.set(j, Constraint);

}

else {

ArrayList Constraint = (ArrayList)Output.ConstraintCoeff.get(j);

Constraint.add(new Double(value));

Output.ConstraintCoeff.set(j, Constraint);

}

}

return Output;

}

private static boolean isFeasible(LPP Input, ArrayList<Integer> x) {

for (int j = 0; j < Input.ConstraintRHSs.size(); j++) {

Input = pivot(Input, ((Integer)x.get(j)).intValue(), j);

}

for (int j = 0; j < Input.ConstraintRHSs.size(); j++) {

ArrayList Constraint = (ArrayList)Input.ConstraintCoeff.get(j);

if (((Double)Input.ConstraintRHSs.get(j)).doubleValue() < 0.0D) {

return false;

}

double q = 0.0D;

for (int i = 0; i < Constraint.size(); i++) {

if (x.contains(Integer.valueOf(i))) {

q += ((Double)Constraint.get(i)).doubleValue() * ((Double)Input.ConstraintRHSs.get(x.indexOf(Integer.valueOf(i)))).doubleValue();

}

}

if (Double.compare(q, ((Double)Input.ConstraintRHSs.get(j)).doubleValue()) != 0) {

return false;

}

}

return true;

}

private static ArrayList<Integer> getInitialBasicVariables(LPP Input, ArrayList<Integer> ArtificialVariables){

ArrayList alpha = new ArrayList();

boolean foundBasicFeasSol = false;

int q = 0;

for (int j = 0; j < ArtificialVariables.size(); j++) {

if (((Integer)ArtificialVariables.get(j)).intValue() != -1) {

q++;

}

}

int n = Input.VariableNames.size() - q;

int powersetsize = (int)Math.pow(2.0D, n);

for (int i = 0; i < powersetsize; i++){

alpha = new ArrayList();

String binary = Toolbox.intToBinary(i, n);

for (int j = 0; j < binary.length(); j++) {

if (binary.charAt(j) == '1') {

alpha.add(Integer.valueOf(j));

}

}

if ((alpha.size() == Input.ConstraintRHSs.size()) && (isFeasible(Input, alpha))) {

foundBasicFeasSol = true;

break;

}

}

if (!foundBasicFeasSol) {

alpha = new ArrayList();

for (int j = 0; j < Input.ConstraintRHSs.size(); j++) {

alpha.add(Integer.valueOf(-1));

}

}

return alpha;

}

private static int choosePivotVar(LPP Input, ArrayList<Integer> ArtificialVariables) {

Double q = new Double(0.0D);

int Output = -1;

Double maxormin = new Double(1.0D);

if (Input.ObjFuncType == "Max") {

maxormin = Double.valueOf(maxormin.doubleValue() * -1.0D);

}

for (int i = 0; i < Input.ObjFuncCoeff.size(); i++) {

Double coefficientTerm = Double.valueOf(maxormin.doubleValue() * ((Double)Input.ObjFuncCoeff.get(i)).doubleValue());

if (!ArtificialVariables.contains(Integer.valueOf(i))) {

if (coefficientTerm.doubleValue() == -0.0D) {

coefficientTerm = Double.valueOf(0.0D);

}

if (Double.compare(coefficientTerm.doubleValue(), q.doubleValue()) < 0) {

q = coefficientTerm;

Output = i;

}

}

}

return Output;

}

private static int choosePivotConst(LPP Input, int n){

Double q = Double.valueOf((1.0D / 0.0D));

int Output = -1;

for (int j = 0; j < Input.ConstraintRHSs.size(); j++) {

ArrayList Constraint = (ArrayList)Input.ConstraintCoeff.get(j);

if (Double.compare(((Double)Constraint.get(n)).doubleValue(), 0.0D) > 0) {

Double ratio = Double.valueOf(((Double)Input.ConstraintRHSs.get(j)).doubleValue() / ((Double)Constraint.get(n)).doubleValue());

if (Double.compare(ratio.doubleValue(), q.doubleValue()) < 0) {

q = ratio;

Output = j;

}

}

}

return Output;

}

public static Solution solve(LPP Input){

int varnum = new Integer(Input.VariableNames.size()).intValue();

ArrayList cTypes = new ArrayList(Input.ConstraintTypes);

ArrayList ArtificialVariables = getArtificialVariableAssignments(Input);

ArrayList varNames = Input.VariableNames;

String LaTeXString = LPPtoLaTeX.displayLPP(Input) + '\n';

String ConsoleString = "Make Standard Form\n";

Input = makeStandardForm(Input, ArtificialVariables);

long StartTime = System.currentTimeMillis();

Input = addArtificialVariables(Input, ArtificialVariables);

ArrayList BasicVars = getInitialBasicVariables(Input, ArtificialVariables);

long GetFeasSolTime = System.currentTimeMillis() - StartTime;

ConsoleString = ConsoleString + "Basic Variables: " + BasicVars + '\n';

if (((Integer)BasicVars.get(0)).intValue() == -1) {

Solution q = new Solution(false);

q.solutionDisplay = "Could not find a Basic Feasible Solution.";

q.ConsoleString = ConsoleString;

q.GetFeasSolTime = GetFeasSolTime;

return q;

}

boolean go = true;

int limiter = 1;

LaTeXString = LaTeXString + LPPtoLaTeX.beginTableaus(Input);

while (go){

int n = choosePivotVar(Input, ArtificialVariables);

LaTeXString = LaTeXString + LPPtoLaTeX.makeTableau(Input, BasicVars, limiter);

if (n == -1) {

go = false;

}

else{

if ((limiter == 1000) || (choosePivotConst(Input, n) == -1)) {

Solution q = new Solution(false);

q.ConsoleString = ConsoleString;

q.GetFeasSolTime = GetFeasSolTime;

if (limiter == 1000) {

q.solutionDisplay = "The pivot limiter timed out.";

}

else if (choosePivotConst(Input, n) == -1) {

q.solutionDisplay = "The given LPP is unbounded.";

}

return q;

}

int k = choosePivotConst(Input, n);

pivot(Input, n, k);

BasicVars.set(k, Integer.valueOf(n));

ConsoleString = ConsoleString + "Pivot at " + n + ", " + k + "\n";

}

limiter++;

}

LaTeXString = LaTeXString + LPPtoLaTeX.endTableaus();

ArrayList OptimalSolution = new ArrayList();

ArrayList Slack = new ArrayList();

ArrayList ShPr = new ArrayList();

ArrayList redCost = new ArrayList();

for (int i = 0; i < varnum; i++) {

if (BasicVars.contains(Integer.valueOf(i))) {

int basicVarIndex = BasicVars.indexOf(Integer.valueOf(i));

if (BasicVars.indexOf(Integer.valueOf(i)) != BasicVars.lastIndexOf(Integer.valueOf(i))) {

for (int k = 0; k < BasicVars.size(); k++) {

if (((Integer)BasicVars.get(k)).intValue() == i) {

ArrayList constraint = (ArrayList)Input.ConstraintCoeff.get(basicVarIndex);

for (int m = 0; m < constraint.size(); m++) {

if ((((Double)constraint.get(m)).doubleValue() != 0.0D) || (((Double)constraint.get(m)).doubleValue() != -0.0D)) {

basicVarIndex = k;

break;

}

}

}

}

}

OptimalSolution.add((Double)Input.ConstraintRHSs.get(basicVarIndex));

redCost.add((Double)Input.ObjFuncCoeff.get(i));

}

else {

OptimalSolution.add(new Double(0.0D));

redCost.add((Double)Input.ObjFuncCoeff.get(i));

for (int j = 0; j < cTypes.size(); j++) {

if (cTypes.get(j) == "=") {

Slack.add(Double.valueOf(0.0D));

ShPr.add(Double.valueOf(-1.0D * ((Double)Input.ObjFuncCoeff.get(((Integer)ArtificialVariables.get(j)).intValue())).doubleValue()));

}

else if ((((Double)Input.ObjFuncCoeff.get(varnum)).doubleValue() == 0.0D) && (((Double)Input.ObjFuncCoeff.get(varnum)).doubleValue() == -0.0D)) {

Slack.add((Double)Input.ConstraintRHSs.get(j));

ShPr.add(Double.valueOf(0.0D));

varnum++;

}

else {

Slack.add(Double.valueOf(0.0D));

ShPr.add(Double.valueOf(-1.0D * (Double)Input.ObjFuncCoeff.get(varnum)).doubleValue()));

varnum++;

}

}

Solution Solved = new Solution(OptimalSolution, Input.ObjFuncValue, varNames, cTypes, Slack, ShPr, redCost);

Solved.SolTime = (System.currentTimeMillis() - StartTime);

Solved.GetFeasSolTime = GetFeasSolTime;

Solved.LaTeXString = LaTeXString;

Solved.ConsoleString = ConsoleString;

return Solved; }}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]