⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 Create a problem solver for linear programming
💻 JAVA
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package ro.utils;import java.util.ArrayList;import ro.simplex.*;/** * * @author Doan Chien Thang */public class Parser {    protected ArrayList<Variable> vars = new ArrayList<Variable>();    protected ArrayList<Fraction> objCoefs = new ArrayList<Fraction>();    protected ArrayList<Constraint> constraints = new ArrayList<Constraint>();        public boolean isExistVariable(int index) {        for (int i = 0; i < vars.size(); i++)            if (vars.get(i).getIndex() == index)                return true;        return false;    }    public Objective parseObjective(String objInput) {        String elements[] = objInput.split("=");        int type = elements[1].trim().compareTo("max") == 0 ?            Objective.MAXIMIZE : Objective.MINIMIZE;        String tmp = "";        for (int i = 0; i < elements[0].length(); i++) {            if (elements[0].charAt(i) == '+' || elements[0].charAt(i) == '-')                tmp += "*";            if (elements[0].charAt(i) != ' ')                tmp += elements[0].charAt(i);        }        String prefix = "x";        String varsStr[] = tmp.split("\\*");        for (int i = 0; i < varsStr.length; i++) {            Fraction coef;            String s[] = varsStr[i].split("x");            //System.out.println("__" + s[0]);            if (s[0].charAt(0) == '+')                coef = new Fraction(Integer.parseInt(s[0].substring(1)));            else if (s[0].charAt(0) == '-') {                coef = new Fraction(Integer.parseInt(s[0].substring(1)));                coef = coef.getOpposite();            } else                coef = new Fraction(Integer.parseInt(s[0]));            int index = Integer.parseInt(s[1]);            Variable var = new Variable (null, index, "x", ConstraintTypes.GREATER_THAN);            vars.add(var);            objCoefs.add(coef);        }        return new Objective(type, objCoefs, vars, new Fraction(0));    }    public Constraint parseConstraint(String conStr) {        ArrayList<Fraction> coefs = new ArrayList<Fraction>();        String elements[];        int type;        if (conStr.indexOf(">") > -1) {            elements = conStr.split(">=");            type = ConstraintTypes.GREATER_THAN;        }        else if (conStr.indexOf("<") > -1) {            elements = conStr.split("<=");            type = ConstraintTypes.LESS_THAN;        }        else {            elements = conStr.split("=");            type = ConstraintTypes.EQUAL_TO;        }        //System.out.println(elements[1]);        String val = elements[1].trim();        Fraction value;        if (val.charAt(0) == '-') {            val = val.substring(1);            value = new Fraction(Integer.parseInt(val));            value = value.getOpposite();        } else            value = new Fraction(Integer.parseInt(val));        String tmp = "";        for (int i = 0; i < elements[0].length(); i++) {            if (elements[0].charAt(i) == '+' || elements[0].charAt(i) == '-')                tmp += "*";            if (elements[0].charAt(i) != ' ')                tmp += elements[0].charAt(i);        }        System.out.println(tmp);        tmp = tmp.trim();        if (tmp.charAt(0) == '*')            tmp = tmp.substring(1);        String varsStr[] = tmp.split("\\*");        System.out.println();        for (int i = 0; i < varsStr.length; i++)            System.out.printf("+%20s+", varsStr[i]);        System.out.println();        for (int i = 0; i < varsStr.length; i++) {            Fraction coef;            String s[] = varsStr[i].split("x");            System.out.println("__" + s[0]);            if (s[0].charAt(0) == '+')                coef = new Fraction(Integer.parseInt(s[0].substring(1)));            else if (s[0].charAt(0) == '-') {                coef = new Fraction(Integer.parseInt(s[0].substring(1)));                coef = coef.getOpposite();            } else                coef = new Fraction(Integer.parseInt(s[0]));//            int index = Integer.parseInt(s[1]);            //Variable var = new Variable (null, index, "x", ConstraintTypes.GREATER_THAN);            //vars.add(var);            coefs.add(coef);        }        return new Constraint(type, coefs, vars, value);    }    public boolean isVariableConstraint(String input) {        String s[] = input.split(" ");        return (s.length == 3 && s[s.length - 1].compareTo("0") == 0);    }    public Problem parse(String objInput, String consInput) {        Objective objective = this.parseObjective(objInput);        ArrayList<Constraint> contraints = new ArrayList<Constraint>();        String s[] = consInput.split("\\n");        for (int i = 0; i < s.length; i++)            System.out.println(s[i]);        for (int i = 0; i < s.length; i++) {            if (!isVariableConstraint(s[i]))                constraints.add(parseConstraint(s[i]));            else                parseVariable(s[i]);        }        Problem p = new Problem(vars, constraints, objective);        System.out.println(p);        return p;    }    public void parseVariable(String varStr) {        int constraint;        if (varStr.indexOf(">") > -1)            constraint = ConstraintTypes.GREATER_THAN;        else if (varStr.indexOf("<") > -1)            constraint = ConstraintTypes.LESS_THAN;        else            constraint = ConstraintTypes.BELONG_R;        String elements[] = varStr.split(" ");        int varIndex = Integer.parseInt(elements[0].substring(1).trim());        for (int i = 0; i < vars.size(); i++)            if (vars.get(i).getIndex() == varIndex)                vars.get(i).setConstraint(constraint);    }    public static void main(String[] args) {        Parser p = new Parser();        Objective s = p.parseObjective("7x1 + 2x2 - 1x3 = max");        //System.out.println(s.toString());        Constraint constraint = p.parseConstraint("7x1 + 2x2 - 1x3 <= 122");        String objInput = "3x1 + 5x2 = max";        String consOutput = "0x1 + 2x2 <= 12\n" +                "1x1 - 2x2 <= -2\n" + "-3x1 - 2x2 <= -18\n" + "x1 >= 0\nx2 >= 0";        Problem problem = p.parse(objInput, consOutput);        System.out.println(problem.toString());    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -