Beispiel #1
0
void setup(void) {
   add_area("2.4.5");

   set_short("Village church");
   set_long("You are in the local village church.  There is a huge " +
      "pit in the center, and a door in the west wall.  " +
      "There is a button beside the door.  This church has the service " +
      "of reviving ghosts.  Dead people come to the church and pray.  " +
      "there is a clock on the wall.  There is an exit to the south.");

   add_exit("south", DIR + "/rooms/vill_green.c");

   add_item("clock","The clock appears to be broken, it is stuck at: 1:26");
   add_item("pit","In the middle of the church is a deep pit.  IT was used " +
      "for sacrifice in the old times, but nowadays it is only " +
      "left for tourists to look at.");

   el = get_el();
   if (el) {
      if (el->query_location() == 3) {
         el_arrives();
      } else {
         el_leaves();
      }
   }
}
Beispiel #2
0
// Находим значение fris-функции, для верифицированной выборки, где определён единственный столп:
	// num_cl - номер класса, для которого определен единственный столп;
	// smpl - единственный столп класса num_cl;
	// dm - матрица подобия;
	// cl - вектор разбиения;
	// kol_st - количество верифицированных образов;
	// n - количество классов в разбиении;
	// rez - переменная для формирования результата;
void fris_compact_verified(int * num_cl, int * smpl, double * dm, int * cl, int * kol_st, int * n,  double * rrr, double *rez) {
	double rho_self, rho_alien, rho, rho_min, rho_cl[*n];
	double f=0, r=0;
	int k, i, j, num_class, el;

	
	for (k = 1; k <= *kol_st; k++){ 			// для каждого образца находим расстояние до ближайшего своего и ближайшего чужого. 
		rho_self=0;
		rho_alien=*rrr;
		if (k != *smpl){						// рассматриваем его, если только он не является передаваемым столпом
			if(cl[k-1] == *num_cl){				// находим расстояния, если он попадает в передаваемый класс 
				rho_self = get_el(dm, k, *smpl, kol_st);
				for ( i = 1; i <= *kol_st; i++){
					if (cl[i-1] != cl[k-1]){
						rho = get_el(dm, k, i, kol_st);
						if (rho_alien > rho){
							rho_alien = rho; 
						}
					}
				}
				}else{							// находим расстояния, если он не попадает в передаваемый класс
					rho = get_el(dm, k, *smpl, kol_st);
					if (rho_alien > rho){
						rho_alien = rho; 
					}
					for (i = 1; i <= *kol_st; i++){
						if(cl[i-1] == cl[k-1]){
							if (rho_self==0){
								rho_self=get_el(dm, k, i, kol_st);
							}else{
								rho = get_el(dm, k, i, kol_st);
								if (rho_self>rho){
									rho_self = rho;
								}
							}
						}
					}
				}		
		
		}
		f = fris(rho_self, rho_alien);			// считаем значение fris-функции для k образца
		r=r+f;									
	}
	
	*rez = r / *kol_st; 						// Находим значение fris- функции, сумму значений fris-функций делим на количество образцов в смешанной выборке
}
Beispiel #3
0
double get_min(int * ss, int * kol, int k, double * dm_mix, int * kol_ss){
	int i;
	double mn, rho;
	mn = 0;
	for (i=1; i<= *kol; i++){
		if (ss[i] != 0 && ss[i]!=k){
			if (mn == 0){
				mn = get_el(dm_mix, k, ss[i], kol_ss);
			}else{			
				rho = get_el(dm_mix, k, ss[i], kol_ss);
				if (mn > rho){
					mn = rho;
				}
			}
		}
	}
	i = 0;
	rho = 0; 
	return mn;
}
Beispiel #4
0
void reduced_fris(int * k, int * s, int * kol, double * dm, double * rho_alien, double * rez){
	int i, j;
	double rho_self, rho, f, re;
	
	for (i = 1; i <= *kol; i++){
		rho_self = 0;
		for (j = 1; j<= *k; j++){
			if(rho_self == 0){
				rho_self = get_el(dm, s[j-1], i, kol);
			}else{
				rho= get_el(dm, s[j-1], i, kol); 	
				if (rho_self > rho){
					rho_self = rho;
				}
			}
		} 
	f = fris(rho_self, *rho_alien);			// считаем значение fris-функции для k образца
	re=re+f;		
	}
*rez = re / *kol;		
}
Beispiel #5
0
void est(int * kol_class, int * s, int * kol, double * dm, double * rrr,  double * rez, int * cl){
	int i, j, k,  num, ss[*kol_class];
	double rho_self, rho, f, re, max;
	const l = 1;
	
	for (i = 1; i <= *kol; i++) {
		rho_self = get_el(dm, s[0], i, kol);
		num = 1;
		for (j = 1; j<= *kol_class; j++){
			rho= get_el(dm, s[j-1], i, kol); 	
			if (rho_self > rho){
				rho_self = rho;
				num = j;
			}

		}
		cl[i-1] = num;	
	}
	for (k = 1; k<=*kol_class; k++){
		fris_compact_verified(&k, &l, dm, cl, kol, kol_class, rrr, rez);
		max = *rez;
		num = i;

		for (i = 1; i <= *kol; i++){
			if (cl[i-1] == k){
				fris_compact_verified(&k, &i, dm, cl, kol, kol_class, rrr, rez);
				if (max < *rez){
					max = *rez;
					num = i;
				}
			}
		}
		ss[k-1] = num;
		s[k-1] = num;
	}
	fris_compact_ss_verified(&ss, kol, dm, cl, kol_class, &l, rrr, rez);
	
}
Beispiel #6
0
// Находим значение fris-функции, для смешанной выборки, где определён единственный столп:
	// num_cl - номер класса, для которого определен единственный столп;
	// smpl - единственный столп класса num_cl;
	// kol_ss - количество образцов в смешанной выборке;
	// dm_mix - матрица подобия;
	// cl - вектор разбиения;
	// kol_st - количество верифицированных образов;
	// n - количество классов в разбиении;
	// rez - переменная для формирования результата;
void fris_compact(int * num_cl, int * smpl, int * kol_ss, double * dm_mix, int * cl, int * kol_st, int * n, double *rez) {
	
	double rho_self, rho_alien, rho, rho_min, rho_cl[*n];
	double f=0, r=0;
	int k, i, j, num_class, el;
	
	for (k = 1; k <= *kol_ss; k++){ 			// для каждого образца находим расстояние до ближайшего своего и ближайшего чужого. 
		rho_self=0;
		rho_alien=3;
		if (k != *smpl-1){						// рассматриваем его, если только он не является передаваемым столпом
			if (k <= *kol_st){
				if(cl[k-1] == *num_cl){			// находим расстояния, если он попадает в передаваемый класс 
					rho_self = get_el(dm_mix, k, *smpl, kol_ss);
					for ( i = 1; i <= *kol_st; i++){
						if (cl[i-1] != cl[k-1]){
							rho = get_el(dm_mix, k, i, kol_ss);
							if (rho_alien > rho){
								rho_alien = rho; 
							}
						}
					}
				}else{							// находим расстояния, если он не попадает в передаваемый класс, но является верифицированным. 
					rho = get_el(dm_mix, k, *smpl, kol_ss);
					if (rho_alien > rho){
						rho_alien = rho; 
					}
					for (i = 1; i <= *kol_ss; i++){
						if(cl[i-1] == cl[k-1] || i > *kol_st){
							if (rho_self==0){
								rho_self=get_el(dm_mix, k, i, kol_ss);
							}else{
								rho = get_el(dm_mix, k, i, kol_ss);
								if (rho_self>rho){
									rho_self = rho;
								}
							}
						}
					}
				}		
			}else{								// находим расстояния, если образец является неверифицированным. 
				rho_min = 0;					// находим ближайший верифицированный элемент
				el = 0;
				for (j = 1; j <= *kol_st; j++){
					if (rho_min == 0){
						rho_min = get_el(dm_mix, k, j, kol_ss);
						el = j;
					}else{
						rho = get_el(dm_mix, k, j, kol_ss);
						if (rho_min > rho ){
							rho_min = rho;
							el = j; 
						}		
					}
				}
				num_class  = cl [el - 1];		// определяем класс, которому принадлежит ближайший элемент.
				if (num_class == *num_cl){		// считаем расстояния, если класс образца совпадает с передоваемым
					rho_self = get_el(dm_mix, k, *smpl, kol_ss);
					for ( i = 1; i <= *kol_st; i++){
						if (cl[i-1] != num_class){
							rho = get_el(dm_mix, k, i, kol_ss);
							if (rho_alien > rho){
								rho_alien = rho; 
							}
						}
					}
				}else{
					rho = get_el(dm_mix, k, *smpl, kol_ss);
					if (rho_alien > rho) {
						rho_alien = rho; 
					}
					for (i = 1; i <= *kol_ss; i++){
						if(cl[i-1] == num_class || i > *kol_st){
							if (rho_self==0){
								rho_self=get_el(dm_mix, k, i, kol_ss);
							}else{
								rho = get_el(dm_mix, k, i, kol_ss);
								if (rho_self > rho){
									rho_self = rho;
								}
							}
						}
					}
				
				}
			}
		}
		f = fris(rho_self, rho_alien);			// считаем значение fris-функции для k образца
		r=r+f;									
	}	
	*rez = r / *kol_ss; 						// Находим значение fris- функции, сумму значений fris-функций делим на количество образцов в смешанной выборке
}
Beispiel #7
0
void fris_class(double * dm, int *kol, int * kol_class, int * stolps, int * cl, double * ff, double * alpha ){
	int i, j, jj, k, l, area, points[*kol], count = 0, merger[* kol_class][* kol_class], a=-1, b=-1;
	double rho, rho_k, rho_l, f, rho_a, rho_b;
	
	for (k = 1; k<= *kol_class; k++){
		for (l = 1; l<= *kol_class; l++){
			if (k==l){
				merger[k][l] = 1;
			}else{
			merger[k][l] = 0 ;
			}
		}
	}
	
	for (k = 1; k < *kol_class; k++){
		for (l = k; l <= *kol_class; l++){
			if (l != k){
				for (i = 1; i <= *kol; i++){
					if (cl[i-1] == k || cl[i-1] == l){
						rho_k = get_el(dm, stolps[k-1], i, kol);
						rho_l = get_el(dm, stolps[l-1], i, kol);
						area = 1;
						for (j=0; j<*kol_class; j++){
							if (rho_k > get_el(dm, stolps[j], i, kol)  || rho_l > get_el(dm, stolps[j], i, kol)){
								area=0;
							}else{
								area = 1;
							}
						}
						if (area==1 & cl[i-1] == k){
							f = fris(rho_k, rho_l);
						}
						if (area==1 & cl[i-1] == l){
							f = fris(rho_l, rho_k);
						}
						if (f > *ff){
							area=0;
						}
						if (area == 1){
							points[count] = i; 							// точка попавшая в зону конкуренции
							count ++;
						}
					}
				}
			}
		}	
	}
	count--;
	for (i=0; i<=count; i++){											// идем по всем точкам, попавшим в зону конкуренции, проверяем надо ли объединять по ним классы. 
		k = cl[points[i]-1];											// k - класс первой точки
		rho_l = 0;
		for (j = 0; j<*kol_class; j++){
			if (rho_l == 0 && cl[stolps[j]-1] != k ){
				rho_l = get_el(dm, stolps[j], points[i], kol);
				l = cl[stolps[j]-1];
			}
			if(cl[stolps[j]-1] != k && rho_l > get_el(dm, stolps[j], points[i], kol)){
				l = cl[stolps[j]-1];									// l - класс второй точки 
			}
		}

		if (merger[k][l] != 1 && merger[l][k] != 1){					//проверяем надо ли объединять k и l классы
			rho_a = 0;													//расстояние до ближайшего своего от точки а;
			rho_b = 0;													//расстояние до ближайшего своего от точки b;
			rho = 0;													//минимальное расстояние между a и b точками из классов l и k;
			for (j = 0; j <= count; j++){
				for (jj = j+1; jj <= count; jj++){
						if(cl[points[j]-1] != cl[points[jj]-1]){
							if (rho == 0) {
								rho = get_el(dm, points[j], points[jj], kol);
								a=points[j];
								b=points[jj];
							}else{
								if (rho > get_el(dm, points[j], points[jj], kol)){
									rho = get_el(dm, points[j], points[jj], kol);
									a=points[j];
									b=points[jj];
								}
							}	
						}
				}
			}
			if (a < 0 || b < 0) {
				merger[k][l] = 0;
				merger[l][k] = 0;
			}else{
				for (j = 1; j <= *kol; j++){
					if (j != a && j != b){
						if (cl[j-1] == cl[a-1]){ 
							if (rho_a == 0){
								rho_a = get_el(dm, j, a, kol);
							}else{
								if(rho_a > get_el(dm, j, a, kol)){
									rho_a = get_el(dm, j, a, kol);
								}  
							}
						}
						if (cl[j-1] == cl[b-1]){
							if (rho_b == 0){
								rho_b = get_el(dm, j, b, kol);
							}else{
								if(rho_b > get_el(dm, j, b, kol)){
									rho_b = get_el(dm, j, b, kol);
								}  
							}
						}
					}	
				}  
				if (rho_a < (*alpha * rho_b) && rho_b < (*alpha * rho_a) && rho < *alpha *((rho_a+rho_b)/2)){
					merger[k][l] = 1;
					merger[l][k] = 1;
				}
			}
		}
	}
	
	for (k = *kol_class; k>=1; k--){
		for (i=1; i<=*kol; i++){
			if(cl[i-1] != k && merger[cl[i-1]][k]==1){
				cl[i-1] = k;
			}
		} 
	}
	
	/*int bb[*kol];
	count=0;
	for (i = 0; i<*kol; i++){
		if (cheking(cl[i], bb, *kol)=="TRUE"){
			bb[count]= cl[i];
			count ++;
		}
	}
	for (k=1; k<=count;k++){
		for (i = 0; i<*kol; i++){
			if(bb[k-1]==cl[i]){
				cl[i]=k;
			}
		}
	}*/
}