C# 蚁群优化算法实现

需求为(自己编的,非实际项目):

某配送中心进行揽货,目标客户数为50个客户,配送中心目前的运力资源如下:

  1. 现有车辆5台
  2. 单台运力最大行驶距离200千米
  3. 单台运力最大载重公斤1吨

问:运力怎样走法才能以最低的成本完成针对这50个客户的揽货行为

是个最优化问题(运筹学),我们只考虑简化后的模型,不考虑路面交通、时间窗口这些复杂计算,用蚁群优化算法来实现接近最优解的计算。

关于蚁群优化算法的理论请看这篇文章:https://www.cnblogs.com/asxinyu/p/Path_Optimization_Tsp_Problem_Ant_System_CSharp.html

里面的基本算法已经写明了,也有demo,本文是针对如何适应到具体业务的介绍(本文用的蚁群核心代码也是上文中改来的)

蚁群主要步骤为:

  1. 初始化(如信息素)
  2. 开始迭代
    1. 构造各个蚂蚁,以及蚂蚁走的路径(核心是针对后续节点的SELECT)
    2. 计算适应度
    3. 加入优秀蚂蚁到跟踪列表
    4. 更新信息素(根据适应度)
  3. 结束迭代
  4. 给出报告

原文章里用的是TSP做DEMO,比较难看清楚如何应用到实际业务逻辑中

同样的,最困惑的核心中的核心,类似遗传算法,也是适应度值的计算,有的地方是一步一步增加vlaue,比如单纯距离的增加,但是复杂点的都没法这么操作,而是要看整体路径的指标(包括惩罚等)

由于蚁群优化算法和本文代码都能下载,所以只介绍适应度value的计算

下载

class FitnessValueCalculator
{
private static int 拥有运力车辆数 = 5;
private static int 单台运力最大行驶距离 = 200;
private static int 单台运力最大载重公斤 = 1000;
private static double 惩罚权重 = 20; public static double Calculator(ShortestDeliverAnt ant)
{
var paths = new List<string>(); var distances = new List<double>();
var weights = new List<double>(); double 当前行驶距离 = 0;
double 当前运力载重 = 0;
string 当前行驶路径 = "";
int 当前所需运力数 = 1; //计算枢纽到第一个客户配送距离
当前行驶路径 += "HUB-->" + ant.PathNodes.First();
当前行驶距离 += ant.DistanceHelper.hub.DistanceTo(ant.DistanceHelper.customers[ant.PathNodes.First()]);
当前运力载重 += ant.DistanceHelper.customers[ant.PathNodes.First()].需求量_公斤; foreach (var path in ant.Edges)
{
var fromNodeId = path.Key;
var toNodeId = path.Value; var fromNode = ant.DistanceHelper.customers[fromNodeId];
var toNode = ant.DistanceHelper.customers[toNodeId]; double newAddedDistance2Customer = 0;
double newAddedDistance2Hub = 0;
double newAddedWeight = 0; newAddedDistance2Customer = fromNode.DistanceTo(toNode);
newAddedDistance2Hub = toNode.DistanceTo(ant.DistanceHelper.hub); newAddedWeight = toNode.需求量_公斤; if (当前行驶距离 + newAddedDistance2Customer + newAddedDistance2Hub <= 单台运力最大行驶距离
&&
当前运力载重 <= 单台运力最大载重公斤)
{
当前行驶距离 += newAddedDistance2Customer;
当前运力载重 += newAddedWeight;
当前行驶路径 += "-->" + toNodeId;
}
else
{
//加当前客户距离、以及回到HUB的距离
当前行驶距离 += fromNode.DistanceTo(ant.DistanceHelper.hub);
distances.Add(当前行驶距离); weights.Add(当前运力载重); 当前行驶路径 += "-->HUB";
paths.Add(当前行驶路径); //RESET
当前行驶距离 = 0;
当前行驶距离 += ant.DistanceHelper.hub.DistanceTo(toNode); 当前运力载重 = 0;
当前运力载重 += toNode.需求量_公斤; 当前行驶路径 = "";
当前行驶路径 += "HUB-->" + toNodeId; 当前所需运力数++;
}
} //回到枢纽
当前行驶距离 += ant.DistanceHelper.customers[ant.PathNodes.Last()].DistanceTo(ant.DistanceHelper.hub);
distances.Add(当前行驶距离); 当前行驶路径 += "-->HUB";
paths.Add(当前行驶路径); int 惩罚系数 = 0;
if (当前所需运力数 > 拥有运力车辆数)
惩罚系数 = 当前所需运力数 - 拥有运力车辆数; ant.运输距离顺序 = distances;
ant.运输路径 = paths; ant.Total行驶距离 = distances.Sum();
ant.Total运力数 = 当前所需运力数; return ant.Total行驶距离 + 惩罚系数 * 惩罚权重;
}
}
ant.DistanceHelper.hub: 是配送中心的info,有地址信息
ant.DistanceHelper.customers: 是50个客户的info,也有地址信息
目前为了简化,是以街道距离来计算距离的
目前代码只是单目标优化算法,非多目标优化,后续研究研究再发文。
上述代码其实就是第一辆车从配送中心开出到第一个客户位置,然后加上客户需求(揽的货物重量)
接着判断能否开到下一个客户那里揽货,如果里程、重量都在限制条件只能,就开过去,不满足条件就开回枢纽;然后继续判断第二辆车,也是这么个逻辑
最终车辆的数量就是完成这50个客户揽货所需的运力数
万一碰到所需运力超出了限制(代码中为5辆车),这时就需要惩罚,由于最终函数返回是double,而且是越小代表越优越,因此碰到了需要惩罚的情况,实际就是大幅度的增加返回值(适应度值)
红色部分就是惩罚变量部分。 各种优化算法的核心写完框架后基本就不怎么变化了,最易变的其实是适应度函数的计算,如果适应度计算中用到了预测技术,还得在上面那函数里调机器学习的代码,感觉强化学习中动作施加后给出的反馈值也是这么个值

代码下载

C# 蚁群优化算法实现的更多相关文章

  1. 揽货最短路径解决方案算法 - C# 蚁群优化算法实现

    需求为(自己编的,非实际项目): 某配送中心进行揽货,目标客户数为50个客户,配送中心目前的运力资源如下: 现有车辆5台 单台运力最大行驶距离200千米 单台运力最大载重公斤1吨 问:运力怎样走法才能 ...

  2. MATLAB粒子群优化算法(PSO)

    MATLAB粒子群优化算法(PSO) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.介绍 粒子群优化算法(Particle Swarm Optim ...

  3. [Algorithm] 群体智能优化算法之粒子群优化算法

    同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...

  4. 粒子群优化算法PSO及matlab实现

    算法学习自:MATLAB与机器学习教学视频 1.粒子群优化算法概述 粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群 ...

  5. 计算智能(CI)之粒子群优化算法(PSO)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 计算智能(Computational Intelligence , ...

  6. 【CI】CN.一种多尺度协同变异的微粒群优化算法

    [论文标题]一种多尺度协同变异的微粒群优化算法 (2010) [论文作者]陶新民,刘福荣, 刘  玉 , 童智靖 [论文链接]Paper(14-pages // Single column) [摘要] ...

  7. ARIMA模型--粒子群优化算法(PSO)和遗传算法(GA)

    ARIMA模型(完整的Word文件可以去我的博客里面下载) ARIMA模型(英语:AutoregressiveIntegratedMovingAverage model),差分整合移动平均自回归模型, ...

  8. 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(二)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:Geppetto 前面我们介绍了特征选择(Feature S ...

  9. 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:Geppetto 在机器学习中,离散化(Discretiza ...

随机推荐

  1. angular-代码段

    重复代码 <div ng-app="" ng-init="names=['Jani','Hege','Kai']"> <p>使用 ng- ...

  2. linux svn命令具体解释

    检測是否安装svn:svnserve --version svn服务的关闭:killall svnserve 创建svn库:svnadmin create /opt/svn/repos 配置自己主动启 ...

  3. 一个通用Makefile的编写

    作者:杨老师,华清远见嵌入式学院讲师. 我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文件.如果我们用gcc去一个一个编译每一个源文件的 ...

  4. cocos2d-x-3.3rc2-003 cocos中的引用计数和自己主动释放池

    点击打开链接

  5. python爬虫 分页获取图片并下载

    --刚接触python2天,想高速上手,就写了个爬虫,写完之后,成就感暴增,用起来顺手多了. 1.源代码 #coding=utf-8 import urllib import re class Pag ...

  6. HTML打开摄像头,进行拍照上传

    html代码 <%@ page language="java" contentType="text/html; charset=utf-8" pageEn ...

  7. hdu1213 How Many Tables(并查集)

    How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. 14.MongoDBUtils工具类

    1. public class DbUtils { public static MongoCollection<Document> getMongoCollection(String lo ...

  9. Defining and using constants from PySide in QML

    Defining and using constants from PySide in QML This PySide tutorial shows you how to define constan ...

  10. Microsoft Edge 针对 Web 开发人员更新日志

    Windows 10 build16215 之 Edge 新功能 新功能: 增加了对高级事件监听器的支持(“once”和“passive”)via 增加了对CSS object-fit/object- ...