📄 parser.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 + -