📄 afsa.txt
字号:
}
int scope=this->Amount_Of_Dimension;
for(int i=0;i<this->Visual;i++,scope--){//随机移动的步长不超过visual
//随机选择一个尚未选过的维
int rand_number=rand()%scope;//从0开始
//选择第rand_number个未被选择的维
bool flag2=true;
for(int k=0;flag2;k++){
if(temp[k]==0){
if(rand_number==0){
temp[k]=1;
temp_position[k]=rand()%2;
flag2=false;
}
else{
rand_number--;
}
}
}
}
//是否找到更优解
int ignore1,ignore2;
float ignore3;
float food;
food=this->Get_Food_Consistence(temp_position,ignore1,ignore2,ignore3);
if(food<this->Fish[Symbol_Of_Fish].Food_Consistence){
flag=false;
for(int k=0;k<this->Amount_Of_Dimension;k++){
this->Fish[Symbol_Of_Fish].Position[k]=temp_position[k];
}
this->Set_Food_Consistence(Symbol_Of_Fish,food);
this->Set_Neighbour(Symbol_Of_Fish);
}
}
if(flag==false){
delete[] temp;
delete[] temp_position;
return 1;
}
else{
delete[] temp;
delete[] temp_position;
return this->Rand_Move(Symbol_Of_Fish);
}
}
}
// 聚群
int AFSA::Swarm(int Symbol_Of_Fish)
{
if(this->Number_Of_fish<=Symbol_Of_Fish||Symbol_Of_Fish<0||this->Fish==NULL) return 0;
else{//邻居数为0时,food*this->Fish[Symbol_Of_Fish].Amount_Of_Neighbour==0,条件横成立,应预防
if(this->Fish[Symbol_Of_Fish].Amount_Of_Neighbour!=0){
int *centre2=new int[this->Amount_Of_Dimension];
float *centre=new float[this->Amount_Of_Dimension];
for(int i=0;i<this->Amount_Of_Dimension;i++){
centre=0;
}
for(i=0;i<this->Number_Of_fish;i++){
if(i!=Symbol_Of_Fish)
if(this->Relation_Of_Fishes[Symbol_Of_Fish]==1)
for(int j=0;j<this->Amount_Of_Dimension;j++) centre[j]+=this->Fish.Position[j];
}
for(i=0;i<this->Amount_Of_Dimension;i++)
centre/=this->Fish[Symbol_Of_Fish].Amount_Of_Neighbour;
for(i=0;i<this->Amount_Of_Dimension;i++)
if(centre>=0.5) centre2=1;
else centre2=0;
delete[] centre;
int ignore1,ignore2;
float ignore3,food;
food=this->Get_Food_Consistence(centre2,ignore1,ignore2,ignore3);
if(food*this->Fish[Symbol_Of_Fish].Amount_Of_Neighbour<this->Delta*this->Fish[Symbol_Of_Fish].Food_Consistence){
for(i=0;i<this->Amount_Of_Dimension;i++){
if(this->Fish[Symbol_Of_Fish].Position!=centre2){
int rand_number=rand()%2;
this->Fish[Symbol_Of_Fish].Position=rand_number;
}
}
this->Set_Food_Consistence(Symbol_Of_Fish,this->Get_Food_Consistence(this->Fish[Symbol_Of_Fish].Position,ignore1,ignore2,ignore3));
this->Set_Neighbour(Symbol_Of_Fish);
delete[] centre2;
return 1;
}
else{
delete[] centre2;
return this->Prey(Symbol_Of_Fish);
}
}
else{
return this->Prey(Symbol_Of_Fish);
}
}
}
// 追尾
int AFSA::follow(int Symbol_Of_Fish)
{
if(this->Number_Of_fish<=Symbol_Of_Fish||Symbol_Of_Fish<0||this->Fish==NULL) return 0;
else{
int best=-1;//-1表示没有任何鱼在视线内
for(int i=0;i<this->Number_Of_fish;i++)
if(this->Relation_Of_Fishes[Symbol_Of_Fish]==1)
if(best==-1||this->Fish.Food_Consistence<this->Fish[best].Food_Consistence)
best=i;
if(best!=-1&&this->Fish[best].Food_Consistence*this->Fish[best].Amount_Of_Neighbour<this->Fish[Symbol_Of_Fish].Food_Consistence*this->Delta){
for(int j=0;j<this->Amount_Of_Dimension;j++)
if(this->Fish[best].Position[j]!=this->Fish[Symbol_Of_Fish].Position[j])
this->Fish[Symbol_Of_Fish].Position[j]=rand()%2;
int ignore1,ignore2;
float ignore3;
this->Set_Food_Consistence(Symbol_Of_Fish,this->Get_Food_Consistence(this->Fish[Symbol_Of_Fish].Position,ignore1,ignore2,ignore3));
this->Set_Neighbour(Symbol_Of_Fish);
return 1;
}
else{
return this->Swarm(Symbol_Of_Fish);
}
}
}
// 寻找最优解,试题列表以-1为结尾,try_number为迭代次数,Want_Most_Hard_Level_Difference可容忍的各难度部分最大分值差异,Want_Amount_Difference可容忍总分差异,Want_Cover_Difference可容忍知识点未覆盖率
int AFSA::move(long double Try_Number,long *&Questions,int Want_Most_Hard_Level_Difference,int Want_Amount_Difference,float Want_Cover_Difference)
{//使用long double 可表示更大迭代次数
for(long double k=0;true;k+=1){
int Most_Hard_Level_Difference,Amount_Difference;
float Cover_Difference;
this->Get_Food_Consistence(this->Bulletin_Board.Position,Most_Hard_Level_Difference,Amount_Difference,Cover_Difference);
if(Most_Hard_Level_Difference<=Want_Most_Hard_Level_Difference&&Amount_Difference<=Want_Amount_Difference&&Cover_Difference<=Want_Cover_Difference){
Questions=new long[this->Amount_Of_Dimension+1];//开辟足够的空间
for(int j=0,count=0;j<this->Amount_Of_Dimension;j++){
if(this->Bulletin_Board.Position[j]==1) Questions[count++]=this->Question_List[j].Question_Number;
}
Questions[count]=-1;
return 1;
}
if(k>=Try_Number){
Questions=new long[this->Amount_Of_Dimension+1];//开辟足够的空间
for(int j=0,count=0;j<this->Amount_Of_Dimension;j++){
if(this->Bulletin_Board.Position[j]==1) Questions[count++]=this->Question_List[j].Question_Number;
}
Questions[count]=-1;
return 0;
}
float best_food;
best_food=this->Bulletin_Board.Food_Consistence;
int best_position;
best_position=-1;//-1表示此次未找到比公告板好的
for(int i=0;i<this->Number_Of_fish;i++){
this->follow(i);
int ig1,ig2;
float ig3,food;
food=this->Get_Food_Consistence(this->Fish.Position,ig1,ig2,ig3);
if(food<best_food){
best_food=food;
best_position=i;
}
}
if(best_position!=-1){
for(int m=0;m<this->Amount_Of_Dimension;m++){
this->Bulletin_Board.Position[m]=this->Fish[best_position].Position[m];
}
this->Bulletin_Board.Food_Consistence=this->Fish[best_position].Food_Consistence;
this->Bulletin_Board.Amount_Of_Neighbour=this->Fish[best_position].Amount_Of_Neighbour;
}
}
}
// 仅用于测试
void AFSA::test(void)
{
printf("维数:%d
试题列表:
",this->Amount_Of_Dimension);
for(int i=0;i<this->Amount_Of_Dimension;i++){
printf("
难度%d,题号%d,分值%d,覆盖面积%d,所包含知识点:
",this->Question_List.Question_Hard_Level,this->Question_List.Question_Number,this->Question_List.Question_Value,this->Question_List.Number_Of_Cover_Knowledge);
for(int j=0;j<this->Question_List.Number_Of_Cover_Knowledge;j++)
printf("知识点号:%d,",this->Question_List.Knowledge_Number_List[j]);
}
printf("
");
printf("公告板:
邻居数:%d,食物:%f
",this->Bulletin_Board.Amount_Of_Neighbour,this->Bulletin_Board.Food_Consistence);
for(i=0;i<this->Amount_Of_Dimension;i++)
printf("%d,",this->Bulletin_Board.Position);
printf("
");
printf("覆盖权:%f
",this->Cover_Weight);
printf("拥挤系数:%f
",this->Delta);
printf("%d条鱼:
",this->Number_Of_fish);
for(i=0;i<this->Number_Of_fish;i++){
printf("第%d条: 邻居数 %d,食物 %f
位置:",i,this->Fish.Amount_Of_Neighbour,this->Fish.Food_Consistence);
for(int j=0;j<this->Amount_Of_Dimension;j++)
printf("%d,",this->Fish.Position[j]);
printf("
");
}
printf("
");
printf("知识点数%d
知识点:",this->Number_Of_Knowledge);
for(i=0;i<this->Number_Of_Knowledge;i++)
printf("%d,",this->Knowledge_Number_List);
printf("
");
printf("难度权:%f
", this->Level_Weight);
printf("总分权:%f
",this->Point_Weight);
printf("相邻关系:
");
for(i=0;i<this->Number_Of_fish;i++){
for(int j=0;j<this->Number_Of_fish;j++)
printf("%d ",this->Relation_Of_Fishes[j]);
printf("
");
}
printf("
");
printf("尝试次数:%d
",this->Try_Number);
printf("可见域:%d
",this->Visual);
printf("Want_Easist:%f
",(float)this->Want_Easist);
printf("Want_Easy:%f
",(float)this->Want_Easy);
printf("Want_Hard:%f
",(float)this->Want_Hard);
printf("Want_Hardest:%f
",(float)this->Want_Hardest);
printf("Want_Normal:%f
",(float)this->Want_Normal);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -