资源简介

备注无比详细,格式美观,绝对看得懂!!基于启发式遗传算法的带容量限制的P-median设施选址问题(在N个需求点中找出P个点建设设施满足全部需求,各点设施建设有容量限制,目标为最小化距离与对应需求量的乘积),通过轮盘法进行染色体种群进化,数据部分可导入文件计算,可动态设置种群规模和繁衍次数。

资源截图

代码片段和文件信息

//———————基于遗传算法的带容量限制的p中位问题——————// 
//————————华中科技大学 管理学院 信管专业————————//
//——————————————作者:WRX————————————// 
#include 
# include 
# include 
# include 
# include 
# include 
# include 
# include 

# define N 12       //需求点个数
# define P 3        //设施点个数 
# define PopulationSize 500     //种群规模 
# define Multiply 500           //繁殖次数 
# define Crossing 0.8           //交叉概率 
# define Variation 0.1          //变异概率 
using namespace std;  


struct genotype//定义结构体 
{
  int gene[N];   //gene[i]的值表示i点获得满足的设施点的下标(设施点编号-1) 
   int facility[P];    //facility[j]的值表示设施点的下标(设施点的编号-1) 
  double Z;          //解对应的目标函数值 
double area;         //选取染色体的概率 
   double scale;        //染色体在轮盘上的刻度(累积概率) 
int tag;  //tag=0表示染色体解不符合容量限制,tag=1表示染色体解符合容量限制 
};
struct genotype population[PopulationSize+1]; //染色体数组 
struct genotype newpopulation[PopulationSize];  //用于更新代内染色体的数组 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
int RandomInt(int lowint high)//生成一个随机整数,使其落在[lowhigh]之间  √ 

int addrandomint;
    
add = rand()%(high-low);
randomint=low+add; 

return (randomint);
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void Value(int (*distance)[N]int *demand)//计算代内各染色体(解)的目标函数值 √ 
{
genotype *p;
for( int i = 0;i < PopulationSize; i++ )  //遍历代内所有染色体 
{
p = &population[i];  //p指向代内的第i个染色体 
for( int j = 0;j < N; j++ )  //计算每个染色体(解)的目标函数值 
p->Z += distance[j][ p->gene[j] ]*demand[j];      //函数值=ΣΣdij*ni(xij=1已隐含在p->gene[j]中满足) 
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void Limit(int *Qint *demand)//判断各染色体是否符合容量限制 
{
int service[P];
for( int i = 0;i < PopulationSize; i++ )  //遍历代内所有染色体解,对每个解i 
{
population[i].tag = 1; //初始化假设均为可行解 
for( int j = 0;j < P; j++ )     //遍历所有服务站j  并判断是否超出容量 
{
service[j] = 0; //初始化服务站服务量 
for( int k = 0;k < N; k++ ) //遍历需求点
if( population[i].gene[k] == population[i].facility[j] )// 计数服务站j提供服务的量
service[j] += demand[k]; 
if( service[j] > Q[population[i].facility[j]] )//只要有一个服务站超出容量限制,就更改染色体解的tag 
population[i].tag = 0;

}


}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void SelectBest()//寻找并记录最优解染色体到population[PopulationSize]  
{
int best=PopulationSize;                                        

for( int i = 0;i < PopulationSize; i++ )  //遍历代内染色体寻找最优函数值 
{
     if ( population[i].Z < population[PopulationSize].Z && population[i].tag == 1 )//找出符合容量限制的最优染色体解 
     {
       best = i; /

评论

共有 条评论