//文件nodeset.h
#pragma once
#include "resource.h"
using namespace GeneResource;
class NodeSet
{
public:
NodeSet(void)
: nodeNum(0)
, nodeArray(NULL)
{
}
NodeSet(int _nodeNum)
{
nodeNum = _nodeNum;
nodeArray = new int[GENE_LENGTH];
for(int i=0;i<GENE_LENGTH;i++)
nodeArray[i]=-1;
}
NodeSet(NodeSet &_nodeSet)
{
nodeNum = _nodeSet.nodeNum;
nodeArray = new int[GENE_LENGTH];
for(int i=0;i<GENE_LENGTH;i++)
nodeArray[i]=*(_nodeSet.nodeArray+i);
}
~NodeSet(void)
{
Clear();
}
public:
void SetNodeNum(int _nodeNum)
{
Clear();
nodeNum = _nodeNum;
nodeArray = new int[GENE_LENGTH];
for(int i=0;i<GENE_LENGTH;i++)
nodeArray[i]=-1;//空集合
}
void Clear(void)
{
if(nodeArray!=NULL)
delete []nodeArray;
}
int *& GetpNodeSet()
{
return nodeArray;
}
int GetNodeNum()
{
return nodeNum;
}
friend int RANDOM(NodeSet &_nodeSet)
{
int n=0,MAX=0;
double p = 0.0;
for(int i=0;i<GENE_LENGTH;i++)
if( *(_nodeSet.nodeArray+i) != -1)
MAX ++;
//0.1的概率选择失败
p = RandInteger(1000);
if( p/1000 > 0.9 )
return -1;
//随即选择结点
n = RandInteger(MAX);
if(_nodeSet.nodeArray!=NULL)
return *(_nodeSet.nodeArray+n);
else
return -1;
}
//获得最后一个结点的标号;返回-1为空
int GetLastIndex()
{
for(int i=0;i<GENE_LENGTH;i++)
if(*(nodeArray+i) == -1)
return i-1;
return -1;
}
//从_nodeSet1中减去也在_nodeSet2出现的结点
friend NodeSet & operator -(NodeSet &_nodeSet1,NodeSet &_nodeSet2)
{
//TODO: return statement
int n=_nodeSet1.nodeNum;
int k=0;
bool bVal=true;
NodeSet *nodeSet=new NodeSet(n);
for(int i=0;i<GENE_LENGTH;i++)
{
for(int j=0;j<GENE_LENGTH;j++)
if( *(_nodeSet1.nodeArray+i)
== *(_nodeSet2.nodeArray+j) )
{
bVal=false;
break;
}
if(bVal)
{
*(nodeSet->nodeArray+k)=*(_nodeSet1.nodeArray+i);
k++;
}else
bVal=true;
}
return *nodeSet;
}
void operator =(NodeSet &_nodeSet)
{
if(nodeNum!=_nodeSet.nodeNum)
SetNodeNum(_nodeSet.nodeNum);
for(int i=0;i<GENE_LENGTH;i++)
*(nodeArray+i)=*(_nodeSet.nodeArray+i);
}
private:
int nodeNum;
int *nodeArray;
};