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

📄 simpclient.java

📁 [数学问题]用分支定界发解线性混合整数规划问题
💻 JAVA
字号:
package com.sea0108.simpmethod;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class SimpClient {
	public static final Font FONT = new Font("黑体", Font.PLAIN, 12);
	private BranchDemarkationMethod bdm = null;
	private SimpFrame sf = new SimpFrame();
	private int demoCount;
	public ArrayList<String> demoProcess;

	public SimpClient() {
		sf.setVisible(true);
		sf.panels[5].setVisible(false);
		sf.buttons[6].setEnabled(false);
		sf.buttons[7].setEnabled(false);
		sf.textArea.setEditable(false);
		sf.textArea.setFont(FONT);		
		listen();
	}

	private void listen() {
		sf.buttons[2].addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				if (getBdm()) {
					demoCount = -1;
					sf.buttons[5].setEnabled(true);
					sf.buttons[6].setEnabled(true);
					demoProcess = new ArrayList<String>();
					demoProcess.add("\n\t分支定界法解混合整数规划问题的动态演示\n");
					demoProcess.addAll(bdm.iterProcess);
					demoProcess.add(getResult());
				}
			}
		});

		sf.buttons[4].addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				if (demoCount > 0)
					sf.textArea.setText("\n\n"
							+ (String) demoProcess.get(--demoCount));
				previousNextUpdate();
			}
		});

		sf.buttons[5].addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				sf.panels[5].setVisible(true);
				if (demoCount < demoProcess.size() - 1)
					sf.textArea.setText("\n\n"
							+ (String) demoProcess.get(++demoCount));
				previousNextUpdate();
			}
		});

		sf.buttons[6].addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				sf.panels[5].setVisible(true);
				sf.buttons[7].setEnabled(true);
				sf.textArea.setText("");
				for (String s : demoProcess)
					sf.textArea.append(s + "\t\n");
			}
		});
	}

	private void previousNextUpdate() {
		if (demoCount == 0)
			sf.buttons[4].setEnabled(false);
		else if (demoCount == demoProcess.size() - 1)
			sf.buttons[5].setEnabled(false);
		else {
			sf.buttons[4].setEnabled(true);
			sf.buttons[5].setEnabled(true);
		}
		sf.buttons[7].setEnabled(true);
	}

	// if the value being returned is true then an Exception occures
	private boolean getBdm() {
		try {
			String[][] mA = sf.getMatrixA();
			String[] vB = sf.getVectorB();
			String[] fCoefs = sf.getVectorObj();
			int[] equationTypes = sf.getInequationsType();
			boolean[] isInteger = sf.getIsInteger();
			boolean isMaximization = sf.getObjType();

			final int row = mA.length;
			final int col = mA[0].length;
			Fraction[][] matA = new Fraction[row][col];
			Fraction[] vecB = new Fraction[row];
			Fraction[] funCoefs = new Fraction[col];

			for (int i = 0; i < row; i++) {
				for (int j = 0; j < col; j++)
					matA[i][j] = new Fraction(mA[i][j]);
				vecB[i] = new Fraction(vB[i]);
			}
			for (int j = 0; j < col; j++)
				funCoefs[j] = new Fraction(fCoefs[j]);

			bdm = new BranchDemarkationMethod(matA, vecB, funCoefs,
					equationTypes, isInteger, isMaximization);
			return true;
		} catch (Exception e) {
			MDialog dlg = new MDialog(sf, "错误提示", "输入数据不完整或有误");
			dlg.setVisible(true);
			e.printStackTrace();
			return false;
		}
	}

	public String getResult() {
		if (bdm == null || bdm.fval == null)
			return "\t(无解)";
		else {
			StringBuilder sb = new StringBuilder("\t(最优解(");
			for (int i = 0; i < bdm.ans.length - 1; i++)
				sb.append("x" + (i + 1) + ",");
			sb.append("x" + bdm.ans.length + ")=(");
			for (int i = 0; i < bdm.ans.length - 1; i++)
				sb.append(bdm.ans[i] + ",");
			sb.append(bdm.ans[bdm.ans.length - 1] + "),目标函数值:");
			sb.append(bdm.fval + ")");
			return sb.toString();
		}
	}

	public static void main(String args[]) {
		new SimpClient();
	}
}

⌨️ 快捷键说明

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