节约里程法的C#实现
节约里程法需求因素有三个:车辆容量 节点需求量 两两点对间最短距离
节约里程法具体原理不 做详述,此处采用清华大学出版社《运筹学》第四版(非本科生版)P536-P538页所所讲述算法实现;
如下图所示:




具体代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace Save_Distance
{public class Save_Distance{//创建线路结构体,包含节约里程,起点,终点public struct path{public double save_diatance;public int head;public int tail;}//路径规划算法public static ArrayList find_path(double whole_capacity, ArrayList demand, double[,] minpath){double real_capacity = whole_capacity;//对站点需求量进行预处理;如果该站点需求量大于车辆整车容量,则直接减去该整车容量;//  double capacity = 3;//将节点需求量数据保存到ArryList当中//  ArrayList demand = new ArrayList();//    demand.Add(0.6); demand.Add(2.6); demand.Add(12.3); demand.Add(3.4);int i, j;ArrayList route_result = new ArrayList();ArrayList planed_node = new ArrayList();/*double[,] minpath = new double[100, 100];minpath[0, 0] = 12; minpath[0, 1] = 3.6; minpath[0, 2] = 6.6; minpath[0, 3] = 13.6;minpath[1, 0] = 7.7; minpath[1, 1] = 21.7; minpath[1, 2] = 0.9;minpath[2, 0] = 3.7; minpath[2, 1] = 49.7;minpath[3, 0] = 8.7; *///计算节约里程,将数据保存到struct path类型的ArryList当中ArrayList Save_distance = new ArrayList();for (i = 0, j = 0; minpath[i, 0] != 0; i++){for (j = 0; minpath[i, j + 1] != 0; j++){path p;p.head = i;p.tail = i + j + 1;p.save_diatance = (minpath[0, i] + minpath[0, i + j + 1] - minpath[i + 1, j]);Save_distance.Add(p);}}//对Save_distance 按照save_distance进行递减排序;for (i = 0; i < Save_distance.Count; i++){for (j = 0; j < Save_distance.Count - i - 1; j++){path x = (path)Save_distance[j];path y = (path)Save_distance[j + 1];path temp_jiedian;if (x.save_diatance < y.save_diatance){ temp_jiedian = (path)Save_distance[j]; Save_distance[j] = (path)Save_distance[j + 1]; Save_distance[j + 1] = temp_jiedian; }}}//寻找节约里程,将其保存到Arrylist 当中;//确保所有节点都被正确规划;while (planed_node.Count != demand.Count){double capacity = real_capacity;ArrayList plan_path = new ArrayList();//如果当前还有未添加的单个节点,但此时线路全被删除完毕,则单独规划一条路径;                   if (Save_distance.Count == 0){for (i = 0; i < demand.Count; i++){if (!planed_node.Contains(i)){planed_node.Add(i);plan_path.Add(i);route_result.Add(plan_path);break;}}}else{//寻找可能的起始线路(节约里程尽可能的大,且路线上下标满足节点要求);foreach (path innitial in Save_distance){if ((double)demand[innitial.head] + (double)demand[innitial.tail] < capacity){plan_path.Add(innitial.head);plan_path.Add(innitial.tail);capacity -= ((double)demand[innitial.head] + (double)demand[innitial.tail]);break;}}//如果当前节点中未能找到初始路线,则表明当前所有的节点都应当单独设置为一条路径if (plan_path.Count == 0){for (i = 0; i < demand.Count; i++){if (!planed_node.Contains(i)){ArrayList many_path = new ArrayList();many_path.Add(i);planed_node.Add(i);route_result.Add(many_path);}}}else{//遍历所有节点;//如果当前线路中有head或者tail中有一个值等于plan_path的头,并且该点需求量满足车辆容量限制,则将tail或者head添加到plan_path的头部//如果当前线路中有head或者tail中有一个值等于plan_path的尾,则将tail或者head添加到plan_path的尾部//一旦找到一条符合要求的,则需要重新回到起点,从头遍历;int bianli = 0;while (bianli < Save_distance.Count){foreach (path temppath in Save_distance){if (temppath.head == (int)plan_path[0] && !plan_path.Contains(temppath.tail) && (double)demand[temppath.tail] <= capacity){plan_path.Insert(0, temppath.tail);//获取尾部的需求量,更新车辆剩余容量;capacity -= (double)demand[temppath.tail];break;}else if (temppath.head == (int)plan_path[plan_path.Count - 1] && !plan_path.Contains(temppath.tail) && (double)demand[temppath.tail] <= capacity){plan_path.Add(temppath.tail);capacity -= (double)demand[temppath.tail];break;}else if (temppath.tail == (int)plan_path[0] && !plan_path.Contains(temppath.head) && (double)demand[temppath.head] <= capacity){plan_path.Insert(0, temppath.head);capacity -= (double)demand[temppath.head];break;}else if (temppath.tail == (int)plan_path[plan_path.Count - 1] && !plan_path.Contains(temppath.head) && (double)demand[temppath.head] <= capacity){plan_path.Add(temppath.head);capacity -= (double)demand[temppath.head];break;}}bianli += 1;}//将所有节点添加到已规划节点中;foreach (int node in plan_path){planed_node.Add(node);}route_result.Add(plan_path);//找出一条线路后,删除已经不可能的线路;for (i = 0; i < plan_path.Count; i++){for (j = 0; j < Save_distance.Count; j++){path temp = (path)Save_distance[j];if (temp.head == (int)plan_path[i] || temp.tail == (int)plan_path[i]){Save_distance.Remove(temp);j -= 1;}}}}}}foreach (ArrayList my_path in route_result){foreach (int node in my_path){Console.WriteLine(node);}Console.WriteLine("another");}Console.WriteLine("结束");return route_result;}static void Main(string[] args){// find_path();Console.ReadLine();}}
}

C# 节约里程法实现相关推荐

  1. 节约里程法java代码_患者,男,70岁,有多年排尿困难,呈淋漓状,近2年来双侧腹股沟区出现半年圆形肿块,站立时明显,平卧后消失,体检时压迫内环肿块仍出现,诊断为...

    In cross-cultural training process, language can have a important impact on social adaptation. 关于环己烷 ...

  2. 求解VRP问题的节约里程法、sweep扫描算法和λ互换法

    第05章  求解容量约束车辆路径问题的启发式算法 Edited by Jiannywang@163.com 目  录 5.1 节约里程法. 1 5.1.1 C-W节约算法简介. 1 5.1.2 C-W ...

  3. matlab节约里程法_芳烃产业链里程碑:唐山旭阳30万吨/年苯乙烯项目一次性开车成功...

    近日,中国旭阳集团(1907.HK)旗下唐山旭阳30万吨/年苯乙烯项目分析化验合格后的苯乙烯从退料管线切至产品采出管线,标志着年产30万吨苯乙烯装置各流程全部打通,产品合格采出,装置一次性开车成功,使 ...

  4. 【路径规划】基于节约算法实现CVRP问题

    带有容量约束的车辆路径问题(CVRP) 该模型很难拓展到VRP的其他场景,并且不知道具体车辆的执行路径,因此对其模型继续改进. C-W节约算法: 一.算法思想 节约里程法,顾名思义,是根据里程的节约值 ...

  5. 微机原理换行代码_设置段落样式的标记中,用来换行的标记是:

    [判断题]( )经检验,收退货品为良品,退货上架员用RF终端设备扫描,并根据指示进行良品入库作业. [单选题]Web of Science中,SAME算符(). [多选题]在进行人员培训时必须考虑的事 ...

  6. 物流科技杂志物流科技杂志社物流科技编辑部2022年第11期目录

    物流科技杂志物流科技杂志社物流科技编辑部2022年第11期目录 专家特稿     高铁运输参与的多目标绿色多式联运路径优化 梁晓磊;刘星雨;李文婷;马千慧;梅磊; 1-8 理论研究<物流科技&g ...

  7. 物流--配送管理(九)

    发达的商品经济,现代的运输工具和高水平的经营管理是配送的前提,但配送系统的成功建立和完善还必须依赖现代信息技术的应用.配送有利于改进和加快流通速度,特别有利于零售环节实现低库存甚至零库存,降低供货的缺 ...

  8. 某太阳能企业终端配送与安装的改善研究

    目录 摘要 I 目录 III 1 绪论 1 1.1 研究背景和意义 1 1.2 国内外研究现状 2 1.3 研究内容.方法.技术路线 3 2 企业现状分析 5 2.1 企业简介-. 5 2.2 配送安 ...

  9. 物流一体化实施方案建议

    物流一体化实施方案建议:[@more@] 一.仓储服务 1.提供全天24小时综合物流服务: 可根据客户公司企业营销及战略发展要求,提供全天候.不间断仓储服务,使客户公司在同行业的在销售物流中能够提供鲜 ...

  10. 神经网络最短路径算法,最短路径算法的原理

    节约里程法求解最短路问题 你只要记住2点之间直线最短.节约里程法是用来解决运输车辆数目不确定的问题的最有名的启发式算法.1.节约里程法优化过程分为并行方式和串行方式两种. 核心思想是依次将运输问题中的 ...

最新文章

  1. mybatisGenerator 代码自动生成报错 Result Maps collection already contains value for BaseResultMap...
  2. Java常用设计模式————单例模式
  3. 【AI视野·今日NLP 自然语言处理论文速览 第十六期】Tue, 29 Jun 2021
  4. 【CVPR2019】 教程 Tutorials List
  5. 和平精英有电脑版吗_群雄逐鹿丨攀升电脑见证NEST和平精英王者诞生!
  6. 开源计算机集群监控Ganglia应用视频
  7. 王者荣耀显示聊天服务器异常,王者荣耀功能存在异常暂时关闭怎么回事 解决办法...
  8. 【错误】函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
  9. php 递归函数返回数组,php递归函数 PHP中Array相关函数简介
  10. ubuntu装指定分区_ubuntu安装时候硬盘如何分区
  11. 每日10行代码34:wordcloud生成词云时过滤掉某些词
  12. 简化字与繁体字的关系
  13. C++11 std::mutex使用以及std::lock_guard自动解锁避免忘记解锁
  14. vpu测试_一种普适的手机平台vpu视频编解码性能检测方法
  15. 大白菜装机教程win10_win10安装教程
  16. UI自动化框架如何设计及搭建?
  17. 【更新21.02.03】百分浏览器继续使用Flash Player的临时解决方案!
  18. 四旋翼飞行器轨迹跟踪仿真MATLAB simulink/simscape
  19. 服务器系统通用串行总线控制器,win7系统usb设备不能用通用串行总线控制器无法启动的解决方法...
  20. windows对话框窗口DialogBox模式对话框、EndDialog、CreateDialog非模式对话框、DestroyWindow、WM_INITDIALOG

热门文章

  1. 【资料】avr单片机和stm32区别,avr单片机选型技巧
  2. 数据仓库与数据挖掘知识点梳理
  3. x黑客X档案2006年07期
  4. matlab gui系统设计,matlabgui系统设计
  5. 猎豹网校java版算法_猎豹网校JAVA语言数据结构与算法视频教程 Java语言
  6. 安卓手机小说阅读器_粉笔免费小说阅读器app下载-粉笔免费小说阅读器APP手机版v1.0.1...
  7. 如何让Low Poly好看
  8. HTML静态网页我的家乡,html网站家乡 !
  9. Linux版QQ安装教程
  10. 如何在移动端转换CAD图纸?