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

📄 thinker.java

📁 基于Web的动物识别专家系统(Java实现)
💻 JAVA
字号:



import java.util.*;

/*该类实现了推理过程*/
public class Thinker {
	private ArrayList<String> userDemandList = new ArrayList<String>();

	private ArrayList<ArrayList> infCause;

	private ArrayList<String> infResult;

	// 用户希望得到结果,是下面其中的某个动物
	String[] str = new String[] { "该动物是虎", "该动物是金钱豹", "该动物是长颈鹿", "该动物是企鹅",
			"该动物是鸵鸟", "该动物是斑马", "该动物是信天翁" };

	List<String> strList;
	

	public Thinker(ArrayList<String> userDemandList) {
		this.userDemandList = userDemandList;
		strList = Arrays.asList(str);

		infCause = new ArrayList<ArrayList>();

		infResult = new ArrayList<String>();
	}
/*该方法通过比较用户输入和规则列表中条件部分,判定用户输入是否包含了某条规则的条件部分,
 * 若不是,就比较下条规则的条件,不停地循环,直至最后一条规则.
 * 若是,判定该条规则的结论是否为最终结论,若是,则返回结论!否则,判断该条规则的结论是否应放置在用户输入列表中.
 * */
	public String findCause(ArrayList<Rule> rulesList) {
		/*判定用户输入是否为空,以及是否矛盾*/
		if (userDemandList != null && isContradict(userDemandList)) {
			for (int i = 0; i < rulesList.size(); i++) {

				List<String> causeList = new ArrayList<String>(
						rulesList.get(i).cause.size());
				for (String tempString : rulesList.get(i).cause) {
					causeList.add(tempString.trim());
				}
				String result = new String(rulesList.get(i).result.trim());
				if (userDemandList.containsAll(causeList))

					if (strList.contains(result)) {

						return result;
					}

					else {
						if (!userDemandList.contains(result)) {
							userDemandList.add(result);
							if (!isContradict(userDemandList))
								return null;
							i = 0;
						} else
							continue;

					}

			}
		}
		return null;

	}

	//用于判断用户输入是否包含矛盾的条件
	public boolean isContradict(ArrayList<String> userDemandList) {
		if ((userDemandList.contains("该动物有毛发") || userDemandList
				.contains("该动物有奶"))
				&& (userDemandList.contains("该动物有羽毛")
						|| userDemandList.contains("该动物会飞") || userDemandList
						.contains("会下蛋")))
			return false;
		if (userDemandList.contains("该动物是哺乳动物")
				&& userDemandList.contains("该动物是鸟"))
			return false;
		if (userDemandList.contains("有爪") && userDemandList.contains("有蹄"))
			return false;
		if (userDemandList.contains("该动物是食肉动物")
				&& userDemandList.contains("该动物是有蹄类动物"))
			return false;

		return true;
	}

	/*该方法核心与findCause()相同,都是基于字符串的匹配.不同之处在于,当某几个条件能够推出某一结论时,
	 * 用户列表将删除能够推出该结论的所有的条件*/
	public String find(ArrayList<Rule> rulesList) {

		ArrayList<String> tempList = new ArrayList<String>();
		while (userDemandList != null) {

			for (String str : userDemandList) {
				tempList.add(str);
			}

			findcause(rulesList);
			if (!findcause(rulesList)) {
				if (userDemandList.size() == 1)
					return userDemandList.get(0);
				else
					break;
			}

		}

		return null;

	}

	/*实现了字符串的匹配和删除条件*/
	private boolean findcause(ArrayList<Rule> rulesList) {
		boolean odd = false;
		for (int i = 0; i < rulesList.size(); i++) {

			ArrayList<String> causeList = new ArrayList<String>(rulesList
					.get(i).cause.size());

			for (String tempString : rulesList.get(i).cause) {
				causeList.add(tempString.trim());
			}

			String result = new String(rulesList.get(i).result.trim());

			if (userDemandList.containsAll(causeList)) {

				infCause.add(causeList);

				infResult.add(result);

				userDemandList.removeAll(causeList);
				odd = true;
				if (!userDemandList.contains(result)) {
					userDemandList.add(result);
				}
			}
		}
		return odd;
	}

	/*以下两个方法体实现获得到推理步骤*/
	public List<ArrayList> getInfCause() {
		return infCause;

	}

	public List<String> getInfResult() {
		return infResult;

	}

}

⌨️ 快捷键说明

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