C/C++,优化算法——使用遗传算法的旅行商问题(traveling-salesman-problem)的源程序

1 文本格式

#include <bits/stdc++.h>
#include <limits.h>
using namespace std;

// Number of cities in TSP
#define V 5

// Names of the cities
#define GENES ABCDE

// Starting Node Value
#define START 0

// Initial population size for the algorithm
#define POP_SIZE 10

// Structure of a GNOME
// string defines the path traversed
// by the salesman while the fitness value
// of the path is stored in an integer

struct individual {
    string gnome;
    int fitness;
};

// Function to return a random number
// from start and end
int rand_num(int start, int end)
{
    int r = end - start;
    int rnum = start + rand() % r;
    return rnum;
}

// Function to check if the character
// has already occurred in the string
bool repeat(string s, char ch)
{
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == ch)
            return true;
    }
    return false;
}

// Function to return a mutated GNOME
// Mutated GNOME is a string
// with a random interchange
// of two genes to create variation in species
string mutatedGene(string gnome)
{
    while (true) {
        int r = rand_num(1, V);
        int r1 = rand_num(1, V);
        if (r1 != r) {
            char temp = gnome[r];
            gnome[r] = gnome[r1];
            gnome[r1] = temp;
            break;
        }
    }
    return gnome;
}

// Function to return a valid GNOME string
// required to create the population
string create_gnome()
{
    string gnome = "0";
    while (true) {
        if (gnome.size() == V) {
            gnome += gnome[0];
            break;
        }
        int temp = rand_num(1, V);
        if (!repeat(gnome, (char)(temp + 48)))
            gnome += (char)(temp + 48);
    }
    return gnome;
}

// Function to return the fitness value of a gnome.
// The fitness value is the path length
// of the path represented by the GNOME.
int cal_fitness(string gnome)
{
    int map[V][V] = { { 0, 2, INT_MAX, 12, 5 },
                    { 2, 0, 4, 8, INT_MAX },
                    { INT_MAX, 4, 0, 3, 3 },
                    { 12, 8, 3, 0, 10 },
                    { 5, INT_MAX, 3, 10, 0 } };
    int f = 0;
    for (int i = 0; i < gnome.size() - 1; i++) {
        if (map[gnome[i] - 48][gnome[i + 1] - 48] == INT_MAX)
            return INT_MAX;
        f += map[gnome[i] - 48][gnome[i + 1] - 48];
    }
    return f;
}

// Function to return the updated value
// of the cooling element.
int cooldown(int temp)
{
    return (90 * temp) / 100;
}

// Comparator for GNOME struct.
bool lessthan(struct individual t1,
            struct individual t2)
{
    return t1.fitness < t2.fitness;
}

// Utility function for TSP problem.
void TSPUtil(int map[V][V])
{
    // Generation Number
    int gen = 1;
    // Number of Gene Iterations
    int gen_thres = 5;

    vector<struct individual> population;
    struct individual temp;

    // Populating the GNOME pool.
    for (int i = 0; i < POP_SIZE; i++) {
        temp.gnome = create_gnome();
        temp.fitness = cal_fitness(temp.gnome);
        population.push_back(temp);
    }

    cout << "\nInitial population: " << endl
        << "GNOME     FITNESS VALUE\n";
    for (int i = 0; i < POP_SIZE; i++)
        cout << population[i].gnome << " "
        << population[i].fitness << endl;
    cout << "\n";

    bool found = false;
    int temperature = 10000;

    // Iteration to perform
    // population crossing and gene mutation.
    while (temperature > 1000 && gen <= gen_thres) {
        sort(population.begin(), population.end(), lessthan);
        cout << "\nCurrent temp: " << temperature << "\n";
        vector<struct individual> new_population;

        for (int i = 0; i < POP_SIZE; i++) {
            struct individual p1 = population[i];

            while (true) {
                string new_g = mutatedGene(p1.gnome);
                struct individual new_gnome;
                new_gnome.gnome = new_g;
                new_gnome.fitness = cal_fitness(new_gnome.gnome);

                if (new_gnome.fitness <= population[i].fitness) {
                    new_population.push_back(new_gnome);
                    break;
                }
                else {

                    // Accepting the rejected children at
                    // a possible probability above threshold.
                    float prob = pow(2.7,
                        -1 * ((float)(new_gnome.fitness
                            - population[i].fitness)
                            / temperature));
                    if (prob > 0.5) {
                        new_population.push_back(new_gnome);
                        break;
                    }
                }
            }
        }

        temperature = cooldown(temperature);
        population = new_population;
        cout << "Generation " << gen << " \n";
        cout << "GNOME     FITNESS VALUE\n";

        for (int i = 0; i < POP_SIZE; i++)
            cout << population[i].gnome << " "
            << population[i].fitness << endl;
        gen++;
    }
}

int main()
{

    int map[V][V] = { { 0, 2, INT_MAX, 12, 5 },
                    { 2, 0, 4, 8, INT_MAX },
                    { INT_MAX, 4, 0, 3, 3 },
                    { 12, 8, 3, 0, 10 },
                    { 5, INT_MAX, 3, 10, 0 } };
    TSPUtil(map);
}
 

2 代码格式

#include <bits/stdc++.h>
#include <limits.h>
using namespace std;// Number of cities in TSP
#define V 5// Names of the cities
#define GENES ABCDE// Starting Node Value
#define START 0// Initial population size for the algorithm
#define POP_SIZE 10// Structure of a GNOME
// string defines the path traversed
// by the salesman while the fitness value
// of the path is stored in an integerstruct individual {string gnome;int fitness;
};// Function to return a random number
// from start and end
int rand_num(int start, int end)
{int r = end - start;int rnum = start + rand() % r;return rnum;
}// Function to check if the character
// has already occurred in the string
bool repeat(string s, char ch)
{for (int i = 0; i < s.size(); i++) {if (s[i] == ch)return true;}return false;
}// Function to return a mutated GNOME
// Mutated GNOME is a string
// with a random interchange
// of two genes to create variation in species
string mutatedGene(string gnome)
{while (true) {int r = rand_num(1, V);int r1 = rand_num(1, V);if (r1 != r) {char temp = gnome[r];gnome[r] = gnome[r1];gnome[r1] = temp;break;}}return gnome;
}// Function to return a valid GNOME string
// required to create the population
string create_gnome()
{string gnome = "0";while (true) {if (gnome.size() == V) {gnome += gnome[0];break;}int temp = rand_num(1, V);if (!repeat(gnome, (char)(temp + 48)))gnome += (char)(temp + 48);}return gnome;
}// Function to return the fitness value of a gnome.
// The fitness value is the path length
// of the path represented by the GNOME.
int cal_fitness(string gnome)
{int map[V][V] = { { 0, 2, INT_MAX, 12, 5 },{ 2, 0, 4, 8, INT_MAX },{ INT_MAX, 4, 0, 3, 3 },{ 12, 8, 3, 0, 10 },{ 5, INT_MAX, 3, 10, 0 } };int f = 0;for (int i = 0; i < gnome.size() - 1; i++) {if (map[gnome[i] - 48][gnome[i + 1] - 48] == INT_MAX)return INT_MAX;f += map[gnome[i] - 48][gnome[i + 1] - 48];}return f;
}// Function to return the updated value
// of the cooling element.
int cooldown(int temp)
{return (90 * temp) / 100;
}// Comparator for GNOME struct.
bool lessthan(struct individual t1,struct individual t2)
{return t1.fitness < t2.fitness;
}// Utility function for TSP problem.
void TSPUtil(int map[V][V])
{// Generation Numberint gen = 1;// Number of Gene Iterationsint gen_thres = 5;vector<struct individual> population;struct individual temp;// Populating the GNOME pool.for (int i = 0; i < POP_SIZE; i++) {temp.gnome = create_gnome();temp.fitness = cal_fitness(temp.gnome);population.push_back(temp);}cout << "\nInitial population: " << endl<< "GNOME     FITNESS VALUE\n";for (int i = 0; i < POP_SIZE; i++)cout << population[i].gnome << " "<< population[i].fitness << endl;cout << "\n";bool found = false;int temperature = 10000;// Iteration to perform// population crossing and gene mutation.while (temperature > 1000 && gen <= gen_thres) {sort(population.begin(), population.end(), lessthan);cout << "\nCurrent temp: " << temperature << "\n";vector<struct individual> new_population;for (int i = 0; i < POP_SIZE; i++) {struct individual p1 = population[i];while (true) {string new_g = mutatedGene(p1.gnome);struct individual new_gnome;new_gnome.gnome = new_g;new_gnome.fitness = cal_fitness(new_gnome.gnome);if (new_gnome.fitness <= population[i].fitness) {new_population.push_back(new_gnome);break;}else {// Accepting the rejected children at// a possible probability above threshold.float prob = pow(2.7,-1 * ((float)(new_gnome.fitness- population[i].fitness)/ temperature));if (prob > 0.5) {new_population.push_back(new_gnome);break;}}}}temperature = cooldown(temperature);population = new_population;cout << "Generation " << gen << " \n";cout << "GNOME     FITNESS VALUE\n";for (int i = 0; i < POP_SIZE; i++)cout << population[i].gnome << " "<< population[i].fitness << endl;gen++;}
}int main()
{int map[V][V] = { { 0, 2, INT_MAX, 12, 5 },{ 2, 0, 4, 8, INT_MAX },{ INT_MAX, 4, 0, 3, 3 },{ 12, 8, 3, 0, 10 },{ 5, INT_MAX, 3, 10, 0 } };TSPUtil(map);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法题】一种字符串压缩表示的解压(js)

输入&#xff1a;2dff 输出 !error 两个d不需要压缩&#xff0c;故输入不合法 输入:4eA 输出:!error 全部由小写英文字母组成&#xff0c;压缩后不会出现&#xff0c;故输出不合法 function solution(str) {const error "!error";// 只能包含小写字母和数字 [^a-z0…

详解线段树

前段时间写过一篇关于树状数组的博客树状数组&#xff0c;今天我们要介绍的是线段树&#xff0c;线段树比树状数组中的应用场景更加的广泛。这些问题也是在leetcode 11月的每日一题频繁遇到的问题&#xff0c;实际上线段树就和红黑树 、堆一样是一类模板&#xff0c;但是标准库…

【荣誉】科东软件荣获广州市软件行业协会双料大奖!

软件产业在数字经济中扮演着基础支撑的角色&#xff0c;对于优化产业结构、提高自主可控、赋能整体经济高质量发展具有关键作用。 近日&#xff0c;广州市软件行业第七届会员大会第三次会议成功召开&#xff01;此次会议旨在回顾过去一年的行业发展&#xff0c;展望未来的趋势和…

nginx编译安装及配置文件的修改

编译安装nginx 1.关闭防火墙&#xff0c;安全机制&#xff0c;去官网下载nginx压缩包&#xff0c;并进行解压 systemctl stop firewalld #关闭防火墙 systemctl disable --now firewalld #开机不自启并立即关闭防火墙 setenforce 0 #关闭安全机制 2.安装依赖包&#xff0…

CSU计算机学院2023秋C语言期中题目思路分享(前三道题)

文章目录 写在前面A&#xff1a;个税计算——阅读理解与数据类型转换原题输入输出样例输入样例输出 题目分析题目理解代码实现与问题解决 我的代码 B&#xff1a;时制转换——问题是一点点解决的原题输入输出样例输入样例输出 题目分析我的代码 C&#xff1a;统计进位——人教版…

编程语言分类

如果要将编程语言分成两大类&#xff0c;可以考虑以下分类方式&#xff1a; 编译型语言&#xff08;Compiled Languages&#xff09;&#xff1a;这类语言在运行之前需要通过编译器将源代码转换为机器码或类似形式的可执行代码。编译型语言的特点包括&#xff1a; 需要显式的编…

用PHP与html做一个简单的登录页面

用PHP与html做一个简单的登录页面 login.html的设计 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

我一人全干!之二,vue3后台管理系统树形目录的实现。

一个完整的后台管理系统需要一个树形结构的目录&#xff0c;方便用户切换页面。 因为使用的是element-plus的ui库&#xff0c;所以首选el-menu组件&#xff0c;点击查看文档。 因为此组件不是树形结构的&#xff0c;所以需要封装成系统需要的树形结构组件。可以使用vue的递归组…

Vue3 Element-Plus 一站式生成动态表单:简化前端开发流程

文章目录 1. 引言2. Vue3 和 Element-Plus 简介2.1 Vue32.2 Element-Plus 3. 动态表单的需求与挑战4. Vue3 和 Element-Plus 动态表单的优势4.1 Vue3的组合式API4.2 Element-Plus的表单组件 5. 一站式生成动态表单的实现5.1 准备工作5.2 创建动态表单组件5.3 使用动态表单组件 …

2023年2月8日 Go生态洞察:Profile-Guided Optimization预览

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

易点易动设备管理系统--提升设备能耗管理效率的工具

在当今的节能环保意识日益增强的社会背景下&#xff0c;设备能耗管理成为了市场推广人员关注的焦点之一。为了帮助市场推广人员提升设备能耗管理效率&#xff0c;易点易动设备管理系统应运而生。本文将详细介绍易点易动设备管理系统的功能和优势&#xff0c;以及如何借助该系统…

2023年12月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

音视频之旅 - 基础知识

图像基础知识 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素 分辨率 图像&#xff08;或视频&#xff09;的分辨率是指图像的大小或尺寸。…

简单桶排序

#include<stdio.h> int main() { int a[11], i, j, t; for (i 0;i < 10;i) a[i] 0;//初始化为零 for (int i 1;i < 5;i)//循环输入5个数&#xff1b; { scanf("%d", &t);//把每一数读取到变量t中 a[t];/…

阿里云上传文件出现的问题解决(跨域设置)

跨域设置引起的问题 起因&#xff1a;开通对象存储服务后&#xff0c;上传文件限制在5M 大小&#xff0c;无法上传大文件。 1.查看报错信息 2.分析阿里云服务端响应内容 <?xml version"1.0" encoding"UTF-8"?> <Error><Code>Invali…

Excel VBA应用技巧

文章目录 第一章 Range &#xff08;单元格&#xff09;对象1. 单元格的引用方法1.1 使用Range 属性1.2 使用Cells 属性1.3 使用快捷记号1.4 使用Offset 属性1.5 使用Resizae 属性1.6 使用Union 方法1.7 使用UsedRange 属性1.8 使用CurrentRegion 属性 2. 选定单元格区域的方法…

NX二次开发自制UI界面大小设置

1、进入NX&#xff0c;点击“应用模块->更多->块UI样式编辑器”&#xff0c;进入UI编辑界面&#xff1b; 2、设置“Dialog->其他->DialogSizing”为Allow Resize 3、添加滚动窗口控件&#xff0c;设置Width、Height的值即可改变UI界面大小&#xff0c;注意&#x…

异常捕获后,如果事务回滚了,后面对数据库的操作需要加事务,不然对数据库的修改不会生效

异常捕获后&#xff0c;如果事务回滚了&#xff0c;后面对数据库的操作需要加事务&#xff0c;不然对数据库的修改不会生效

service层报错:Invalid bound statement (not found)

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

2023中医药国际传承传播大会暨中医药图片和非遗艺术展隆重揭幕

由世界针灸学会联合会、中新社国际传播集团、中国新闻图片网、中国民族医药学会、中国针灸学会联合主办的“2023中医药国际传承传播大会”3日在广东省深圳市举办&#xff0c;“中医药国际传承传播图片展”与“非遗艺术展”在大会举办期间开展迎客。会议聚焦非遗健康、非遗传承等…