资源简介
备注无比详细,格式美观,绝对看得懂!!基于启发式遗传算法的带容量限制的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++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
评论
共有 条评论