Пример #1
0
/**********************
   init
**********************/
static float init(signature_t *Signature1, signature_t *Signature2, 
		  float (*Dist)(feature_t *, feature_t *))
{
  int i, j;
  double sSum, dSum, diff;
  feature_t *P1, *P2;
  double S[MAX_SIG_SIZE1], D[MAX_SIG_SIZE1];
 
  _n1 = Signature1->n;
  _n2 = Signature2->n;

  if (_n1 > MAX_SIG_SIZE || _n2 > MAX_SIG_SIZE)
    {
      fprintf(stderr, "emd: Signature size is limited to %d\n", MAX_SIG_SIZE);
      exit(1);
    }
  
  /* COMPUTE THE DISTANCE MATRIX */
  _maxC = 0;
  for(i=0, P1=Signature1->Features; i < _n1; i++, P1++)
    for(j=0, P2=Signature2->Features; j < _n2; j++, P2++) 
      {
	_C[i][j] = Dist(P1, P2);
	if (_C[i][j] > _maxC)
	  _maxC = _C[i][j];
      }
	
  /* SUM UP THE SUPPLY AND DEMAND */
  sSum = 0.0;
  for(i=0; i < _n1; i++)
    {
      S[i] = Signature1->Weights[i];
      sSum += Signature1->Weights[i];
      _RowsX[i] = NULL;
    }
  dSum = 0.0;
  for(j=0; j < _n2; j++)
    {
      D[j] = Signature2->Weights[j];
      dSum += Signature2->Weights[j];
      _ColsX[j] = NULL;
    }

  /* IF SUPPLY DIFFERENT THAN THE DEMAND, ADD A ZERO-COST DUMMY CLUSTER */
  diff = sSum - dSum;
  if (fabs(diff) >= EPSILON * sSum)
    {
      if (diff < 0.0)
	{
	  for (j=0; j < _n2; j++)
	    _C[_n1][j] = 0;
	  S[_n1] = -diff;
	  _RowsX[_n1] = NULL;
	  _n1++;
	}
      else
	{
	  for (i=0; i < _n1; i++)
	    _C[i][_n2] = 0;
	  D[_n2] = diff;
	  _ColsX[_n2] = NULL;
	  _n2++;
	}
    }

  /* INITIALIZE THE BASIC VARIABLE STRUCTURES */
  for (i=0; i < _n1; i++)
    for (j=0; j < _n2; j++)
	_IsX[i][j] = 0;
  _EndX = _X;
   
  _maxW = sSum > dSum ? sSum : dSum;

  /* FIND INITIAL SOLUTION */
  russel(S, D);

  _EnterX = _EndX++;  /* AN EMPTY SLOT (ONLY _n1+_n2-1 BASIC VARIABLES) */

  return (float)(sSum > dSum ? dSum : sSum);
}
Пример #2
0
float CEmdWrapper::init(signature_t *Signature1, signature_t *Signature2){
	int i, j;
	float sSum, dSum, diff;
	feature_t *P1, *P2;
	float S[MAX_SIG_SIZE1], D[MAX_SIG_SIZE1];
	
	_n1 = Signature1->n;
	_n2 = Signature2->n;
	
	if (_n1 > MAX_SIG_SIZE || _n2 > MAX_SIG_SIZE){
		fprintf(stderr, "emd: Signature size is limited to %d\n", MAX_SIG_SIZE);
		exit(1);
    }
	
	_maxC = 0;
	
	float DeltaX,DeltaY;
	for(i = 0, P1 = Signature1->Features; i < _n1; i++, P1++){
		for(j = 0, P2 = Signature2->Features; j < _n2; j++, P2++){
			DeltaX=(float)fabs(P1->px-P2->px);
			DeltaY=(float)fabs(P1->py-P2->py);
			
			DeltaX=DeltaX>110?110:DeltaX;
			DeltaY=DeltaY>350?350:DeltaY;
			
			int IndexX=(int)((DeltaX+0.25)/5);
			int IndexY=(int)((DeltaY+0.25)/5);
			
			int Index=IndexX*71+IndexY;
			_C[i][j]=(float)sqrt(DeltaX*DeltaX+DeltaY*DeltaY);
			
			if (_C[i][j] > _maxC)
				_maxC = _C[i][j];
		}
	}

	memcpy(S,Signature1->Weights,sizeof(float)*_n1);
	memcpy(D,Signature2->Weights,sizeof(float)*_n2);
	
	sSum = 0.0;
	for(i=0; i < _n1; i++){
		sSum += Signature1->Weights[i];
		_RowsX[i] = NULL;
	}
	
	dSum = 0.0;
	for(j=0; j < _n2; j++){
		dSum += Signature2->Weights[j];
		_ColsX[j] = NULL;
	}
	
	diff = sSum - dSum;
	if (fabs(diff) >= EPSILON * sSum){
		if (diff < 0.0){
			memset(_C[_n1],0,sizeof(float)*_n2);
			S[_n1] = -diff;
			_RowsX[_n1] = NULL;
			_n1++;
		}else{
			for (i=0; i < _n1; i++)
				_C[i][_n2] = 0;
			D[_n2] = diff;
			_ColsX[_n2] = NULL;
			_n2++;
		}
	}
	
	memset(_IsX[0],0,MAX_SIG_SIZE1*MAX_SIG_SIZE1);
	
	_EndX = _X;
	
	_maxW = sSum > dSum ? sSum : dSum;
	
	russel(S, D);
	
	_EnterX = _EndX++;  /* AN EMPTY SLOT (ONLY _n1+_n2-1 BASIC VARIABLES) */
	
	return sSum > dSum ? dSum : sSum;
}