资源简介
备注无比详细,格式美观,绝对看得懂!!基于启发式遗传算法的带容量限制的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; /
- 上一篇:C++实现小游戏flappy bird
- 下一篇:用c语言编写ATM取款机模拟系统
相关资源
- C++实现小游戏flappy bird
- C++builder实现计算器
- MFC 2010编写 C++ 求1元4次方程解,含1元
- c++版创建并输出二叉树完整代码
- c++练习题2015
- 最新传智播客C/C++第五期完整视频 R
- 影碟出租系统C++源代码
- C++&CLR 编写 Windows 窗体应用程序
- 用c语言写的8数码游戏
- ue4,c++平面最小封闭区域识别
- vs2013 c++串口助手源码
- c++21点游戏
- 蛮力法求解旅行商问题C++
- 理发师睡觉问题
- 常用的VC界面模板
- 20多个常用的Hash算法C++ 实现
- C++仿360新界面源代码
- 遗传、禁忌、模拟退火解背包问题
- C++语言程序设计 郑莉 第四版 课后题
- 蚁群算法C++版
- C++开发精灵对战小游戏
- C++与js相互调用
- 使用Qt做的数据管理系统
- c++测试题aaaa
- c++职工工资管理系统
- 分数计算器C++
- c++职工管理系统链表
- c++密度据类MFC可视化
- 电信计费系统C++
- c++ 最小二乘算法拟合球心 使用Vs200
评论
共有 条评论