第1次实验——NPC问题(回溯算法、聚类分析)

本文通过Java实现八皇后问题的解决方法,并探讨了使用K均值聚类算法对学生进行分类的可能性及其实施方案。

(1)八皇后及N皇后问题

 部分代码来自:http://www.java3z.com/cwbwebhome/article/article5/51051.html?id=2444

package kfj;

public class Queen {
	//定义两个int型变量,用于以下循环程序。
	private int i,k;
	private int n=0;
	//列指示器
	private int pointer = 1;
	//解
	int[] cellpos = new int[9];
    public Queen() {
    	cellpos[pointer] = 1;
    	cellpos[2] = 3;
    	pointer = 3;
    	//给第二列之后的列赋一个初值1,因为默认是0,而我们约定的是从1开始.
    	clean(2);
    	
    	while(cellpos[1] <= 8) {
    		/**
    		 * 特殊点第一列,这里不写cellpos[pointer]++;
    		 * 是因为后面的程序中已经加过了.
    		 * 这点不是特殊点,更新时间(2010-3-15 22:06)
    		 */
    		//if(pointer == 1) {
    			//cellpos[pointer]++;
    			//pointer++;
    			//continue;
    		//}
    		
    		/**
    		 * 特殊点第八行,这里为什么还要加一个判断呢
    		 * 也许你会问后面不是有i>8判断吗?试想一下,当倒数第二列
    		 * 正好等于8,求完解后,回到倒数第二列,
    		 * 并且后面的程序会使倒数第二列加1,现在还认为它多余么.
    		 */
    		if(cellpos[pointer]>8) {
    			pointer--;
    			cellpos[pointer]++;
    			//清理
    			clean(pointer);
    			continue;
    		}
    		
    		/**
    		 * 扫描
    		 */
    		for(i=cellpos[pointer]; i<=8; i++)
    			if(canStay(i)) break;
    		
    		
    		if(i>8) {
    			pointer--;
    			cellpos[pointer]++;
    			//清理
    			clean(pointer);
    			continue;
    		}else{
    			cellpos[pointer] = i;
    		}
    		
    		if(pointer==8) {
    			//将解打印出来
    			if(n<3){
    			   printQueen();
    			   n=n+1;
    			}
    			pointer--;
    			cellpos[pointer]++;
    			//清理
    			clean(pointer);
    		}else{
    			pointer++;
    		}
    	}
    }
    
    private boolean canStay(int ci) {
    	//行扫描,判断同一行是否有其它皇后.
    	for(k=1; k<pointer; k++)
    		if(cellpos[k]==ci) return false;
    	//对角线扫描,判断对角线上是否有其它皇后.注意有两条对角线.
    	for(k=1; k<pointer; k++)
    		if((ci==cellpos[k]+(pointer-k)) || 
    			(ci==cellpos[k]-(pointer-k)))
    				return false;
    	return true;
    }
    
    private void clean(int pointer) {
    	for(k=pointer+1; k<9; k++)
    		cellpos[k] = 1;
    }
    
    private void printQueen() {
    	System.out.println("第"+(n+1)+"个棋盘分布为:");
    	for(k = 1; k<9; k++) {
    		for(int i=1;i<9;i++){
    			if(i==cellpos[k])
    				System.out.print(" "+"Q");
    			else
    				System.out.print(" "+"X");
    		}
    		System.out.println();
    		//System.out.print(""+cellpos[k]);
    		
    		//if(k!=8)
    			//System.out.print(",");
    	}
    	System.out.println();
    }
    
    public static void main(String[] args) {
    	new Queen();
    }
}
运行结果为:


(2)学生聚类分析思考

        为了实现因材施教的目标,现教务处计划对学生进行摸底并分类,假如使用K均值聚类算法,并且认为学生大概可以分为四类,分别为“积极主动型”、“学霸型”、“游戏人生型”、“迷茫无目标型”。现在你是该项目的负责人,(1)请设计一个较为完整的项目实施方案;(2)你是否认可对学生进行分类?(3)按照你给定的实施方案与需要测量的要素(如天学习时间),请尝试按照自身情况对其进行回答,以及对自身的评价与定位和努力目标。

   我的意见:(1)我认为需要对以下的要素进行分类:课后学习时间,游戏时间,是否进行课外学习,课外学习的数量,学习成绩,他人看法。实施的方案:测试的数据来源为:学校记录的成绩,对学生的问卷调查(调查问卷分为对本人的调查(课后学习时间,游戏时间,是否进行课外学习,课外学习的数量),对他人的的感觉(课后学习时间,游戏时间,是否进行课外学习,是否主动学习));(2)我对学生进行分类持不认可意见,理由:采集数据困难,数据的真实性无法确认 ;(3)我对自己的定位认:我是“迷茫无目标型”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值