呵呵,项目的第一个阶段今天终于可以结束了。奋斗了好几个月,终于可以让自己喘口气。
先不说太多,能比较顺利的结束,还要说说一个算法,我们在比对的结果中得到了很多数值,可是我们要在这些数值中找到与正确解相邻的数值,然后去平均来作为下一步算法的输入参数。所以这个平均值对后面的计算结果尤其重要。之前我们尝试过一些方法。比如全部先取平均,然后去除离平均值最大的数值,这样重复几次之后,留下的应该是比较理想的结果。可是事与愿违。在找同学商量之后,发现一下的算法还不错。比如:你要在这些数值中,找到三个最相近的数,那么先把这些数值排序,然后每隔一个做减法取绝对值,然后在这些绝对值中取其最小值,那么这个最小值对应的三个数就是最后的答案。
我测试了下:
package test;
public class FindCloseNumbers {
public static void main(String[] args){
double nums[]= new double[10];
//product numbers randomly
for(int i=0;i<10;i++){
nums[i] = Math.random()*32;
System.out.println("):"+nums[i]);
}
//sort the array
for(int j=0;j<nums.length;j++){
for(int i=j+1;i<nums.length;i++){
if(nums[j]>nums[i]){
double temp = nums[i];
nums[i]= nums[j];
nums[j]=temp;
}
}
}
for(int i=0;i<10;i++){
System.out.println(")--(:"+nums[i]);
}
//check which three ones are close to each other
int count = 0;
double minerror = Math.abs(nums[0] -nums[3]);
for(int k=1;k<nums.length-3;k++){
double temperror = Math.abs(nums[k]-nums[k+3]);
if(temperror < minerror){
count = k;
}
}
System.out.println("count(:"+count);
//print four close numbers
for(int p=count;p<count+3;p++){
System.out.println("||:"+nums[p]);
}
}
}
结果还可以,用在项目上也比以前的效果好。虽然不能全部的问题,但是正确率提高了很多。在使用概率的算法之前,这个算是比较理想的了。多谢Day 。
突然觉得,我们之前写了那些程序,其实还有许多需要优化的,只不过老师要求从Java转到C++,才没有去认真的考虑。首先,项目是分工的,我们两个人一起写,命名方式都五花八门,更不用说一看变量名,就知道作具体用途啦。所以一旦在代码整合之后,发现很难调试。中间尝尽了不少苦头。所以在写C++之前,我们需要把需要的那些数据结构先定义好。避免后面又乱了。
还有就是,就是碰到不知道是程序代码问题,还是算法本身问题的时候。请不要想苍蝇那样到处乱撞。要学会用某种方法来辅助调试,打印中间运行结果,如果需要的话,可以人工计算与电脑计算相结合,比较中间可能出现的问题。有时候这一招很管用,至少可以让你知道是代码的错误还是算法本身的缺陷,因为如果比较复杂,事先可能考虑不周到,经验有限,所以只能使用这个比较笨的方法。
呵呵,又是周末,这学期课程增多,而且还是一些比较偏的课程,智能信息系统和计算机组成结构。够我折腾的。谁会SysemC的,可以帮忙指导下啊。还有很多琐碎的事情,哦,对了忘记了把TA作业带回来批改了,算了,也好,休息下先。