?? afsa.cpp
字號:
for(int j=0;j<this->Amount_Of_Dimension;j++){
temp_position[j]=this->Fish[Symbol_Of_Fish].Position[j];
}
//對temp做一次隨機移動
for(int j=0;j<this->Amount_Of_Dimension;j++){//沒選過的維賦值為0
temp[j]=0;
}
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[i]=0;
}
for(i=0;i<this->Number_Of_fish;i++){
if(i!=Symbol_Of_Fish)
if(this->Relation_Of_Fishes[Symbol_Of_Fish][i]==1)
for(int j=0;j<this->Amount_Of_Dimension;j++) centre[j]+=this->Fish[i].Position[j];
}
for(i=0;i<this->Amount_Of_Dimension;i++)
centre[i]/=this->Fish[Symbol_Of_Fish].Amount_Of_Neighbour;
for(i=0;i<this->Amount_Of_Dimension;i++)
if(centre[i]>=0.5) centre2[i]=1;
else centre2[i]=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[i]!=centre2[i]){
int rand_number=rand()%2;
this->Fish[Symbol_Of_Fish].Position[i]=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][i]==1)
if(best==-1||this->Fish[i].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 可表示更大迭代次數
time_t time1,time2;
time1=time(NULL);
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(Try_Number>=0){
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;
}
}
else{
time2=time(NULL);
if((time2-time1)>(0-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[i].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\n試題列表:\n",this->Amount_Of_Dimension);
for(int i=0;i<this->Amount_Of_Dimension;i++){
printf("\n難度%d,題號%d,分值%d,覆蓋面積%d,所包含知識點:\n",this->Question_List[i].Question_Hard_Level,this->Question_List[i].Question_Number,this->Question_List[i].Question_Value,this->Question_List[i].Number_Of_Cover_Knowledge);
for(int j=0;j<this->Question_List[i].Number_Of_Cover_Knowledge;j++)
printf("知識點號:%d,",this->Question_List[i].Knowledge_Number_List[j]);
}
printf("\n");
printf("公告板:\n鄰居數:%d,食物:%f\n",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[i]);
printf("\n");
printf("覆蓋權:%f\n",this->Cover_Weight);
printf("擁擠系數:%f\n",this->Delta);
printf("%d條魚:\n",this->Number_Of_fish);
for(i=0;i<this->Number_Of_fish;i++){
printf("第%d條: 鄰居數 %d,食物 %f\n位置:",i,this->Fish[i].Amount_Of_Neighbour,this->Fish[i].Food_Consistence);
for(int j=0;j<this->Amount_Of_Dimension;j++)
printf("%d,",this->Fish[i].Position[j]);
printf("\n");
}
printf("\n");
printf("知識點數%d\n知識點:",this->Number_Of_Knowledge);
for(i=0;i<this->Number_Of_Knowledge;i++)
printf("%d,",this->Knowledge_Number_List[i]);
printf("\n");
printf("難度權:%f\n", this->Level_Weight);
printf("總分權:%f\n",this->Point_Weight);
printf("相鄰關系:\n");
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[i][j]);
printf("\n");
}
printf("\n");
printf("嘗試次數:%d\n",this->Try_Number);
printf("可見域:%d\n",this->Visual);
printf("Want_Easist:%f\n",(float)this->Want_Easist);
printf("Want_Easy:%f\n",(float)this->Want_Easy);
printf("Want_Hard:%f\n",(float)this->Want_Hard);
printf("Want_Hardest:%f\n",(float)this->Want_Hardest);
printf("Want_Normal:%f\n",(float)this->Want_Normal);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -