AMPL实现中国邮递员问题,你get到了吗

article/2025/10/7 13:02:08

本文所有代码全部使用AMPL语言实现

中国邮递员问题和旅行商问题不太相同,旅行商问题是不能回头的,而邮递员问题要求是访问所有街道,也就是说每个街道必须访问到。

1、哥尼斯堡七桥问题

要解出中国邮递员问题,首先我们一起来了解哥尼斯堡七桥问题,这样助于后面的学习。这个故事是发生在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。问是否可能从这四块陆地中任一块出发,恰好通过每座桥一次,再回到起点?

BFDE921726CF0ED45A2A6FF6BCD0A6CA.jpg

将将哥尼斯堡七桥问题中的每一块地看作一个点,而每一座桥看作一条线,则可得到下图,不难看出,下面图的每一点所连接的线数目皆为奇数,则引入欧拉概念。

894F5C0CA7932DFD823DB28B4668A8F4.jpg

在1736年29岁的欧拉向圣彼得堡科学院递交了《哥尼斯堡的七座桥》的论文,在解答问题的同时,开创了数学的一个新的分支——图论与几何拓扑,也由此展开了数学史上的新历程。
由于欧拉对于哥尼斯堡的七桥问题的解决,图论中把可完成“一笔画”的图称作欧拉图(Euler Graph),由此又有了欧拉回路(Euler Circuit)与欧拉路径(Euler Path)的概念。
概念:欧拉路径是指通过图中所有边的简单路,而欧拉回路指闭合的欧拉路径。拥有欧拉回路的图即可称为欧拉图。

2、中国邮递员问题

(1)介绍

邮递员问题,若把它抽象为图的语言,就给定一个连通图,在每边ei上赋予一个非负的权W(ei),要求一个圈,每边至少一次,并使圈的总权最小。该问题是中国数学家管梅谷在1962年首先提出了这个问题,在国际上通称为中国邮递员问题。广泛比如:扫雪车、处理垃圾车、散水车、送信员等。

(2)欧拉回路

  • 给定一个连通多重图G,若存在一条链,过每边一次,且仅一次,则称为这条链为欧拉链。
  • 若存在一个简单图,过每边一次,且仅一次,称为这个圈为欧拉圈
  • 一个图若有欧拉圈,则称为欧拉图。

(3)邮递员案例

通过上面,我们知道图若能一笔画出,这个必是欧拉图,它是没有奇点的。现在我们讨论中国邮递员对于有奇数又如何求解。

在任何一个图中,奇点个数必为偶数,才能构成欧拉回路。如果图中有奇点,我们将它们变为偶数点,所有将它们配成对,也就是给奇点添加一条重复边,这样就无奇点了,也就构成欧拉图一个可行方案。

(4)中国邮递员问题例子

现在一个邮递员从邮局出发,要走完他所管辖范围内的每一条街道至少一次再返回邮局,如何选择一条尽可能短的路线,现假设该城市的区域,道路网络如下图所示,线代表道路,点代表十字路口。各条路的成本为(i, j, d),距离在图中已经标出(单位KM),现在请问:送货员从“1”点出发,如何选择最短路线,每条街道至少经过一次,送完邮件后返回“1” 点。(本例题来自运筹学第4版课后习题,328页11.16题)

34E12C9A-54A9-46D2-A28D-F9B89A9C7A7A.png

(5)数学模型

m i n ∑ ( i , j ) ∈ E D i , j X i , j min\sum_{(i,j)\in E}D_{i,j}X_{i,j} min(i,j)EDi,jXi,j

​ s.t.
∑ j X j , i − ∑ i X i , j = 0 , ( i = 1 , 2 , . . . , n ) \sum_jX_{j,i}-\sum_i X_{i,j}=0 ,(i=1,2,...,n) jXj,iiXi,j=0,(i=1,2,...,n)

X i , j + X j , i ≥ 1 , ∀ ( i , j ) ∈ E X_{i,j}+X_{j,i}\geq1,∀(i,j)\in E Xi,j+Xj,i1,(i,j)E

X i , j = 0 或 1 , ∀ ( i , j ) ∈ E X_{i,j}=0或1,∀(i,j)\in E Xi,j=01,(i,j)E

解释上述数学公式:

  • i,j = (1,2,…,n)代表顶点集合,也就是所有相邻街道交叉的点
  • d代表i,j两点之间的距离或单位行驶成本
  • Min代表单位时间内产生成本或距离的最小值
  • Xi,j代表连接i,j两点组成的线段(即街道)送信员是否行驶通过(0是代表不通过道路,1 是代表通过道路)

(6)代码实现

  • 模型文件
#1 集合
set node;#定义node集合,表示存放每个结点的意思
set road within node cross node;#代表所有线的一个子集
#2 参数
param d{road};##每一条道路的距离
#3 变量(注意这个是未知的所以正好设置为变量)
var X{(i,j)in road}binary;#0,1变量(0是代表不通过道路,1是代表通过道路)
#4 目标函数
#d[i,j]*X[i,j];【表示i与j间距离】乘【i与j间是否可行1表示可行0表示不可行】还不懂意思就慢慢想
minimize CPP:sum{(i,j)in road}d[i,j]*X[i,j];
#5 约束条件(根据上述数学模型,很简单这里就不解释了)
subject to limit1{(i,j) in road}:
X[i,j]+X[j,i]>=1;
subject to limit2{k in node}:
sum{(i,k) in road}X[i,k] = sum{(k,j)in road}X[k,j];
  • 数据模型
set node:=1 2 3 4 5 6 7 8 9 10 11 12;#根据上图有12个点
set road:=
(1,3)  (3,1)  (1,2)  (2,1)  (2,5)   (5,2)  (2,6)   (6,2)
(3,6)  (6,3)  (3,7)  (7,3)  (4,6)   (6,4)  (4,5)   (5,4)
(4,11) (11,4) (7,10) (10,7) (7,9)   (9,7)  (8,12)  (12,8)
(8,11) (11,8) (9,12) (12,9) (10,12) (12,10) (9,11) (11,9);
#表示区域内各街道构成的行驶距离
param:d:=
1 3 5
3 1 5
1 2 6
2 1 6
2 5 1
5 2 1
2 6 4
6 2 4
3 7 2
7 3 2
3 6 1
6 3 1
4 6 1
6 4 1
4 5 3
5 4 3
4 11 2
11 4 2
7 10 3
10 7 3
7 9 2
9 7 2
8 11 3
11 8 3
8 12 7
12 8 7
9 12 4
12 9 4
9 11 6
11 9 6
10 12 2
12 10 2;
  • 运行结果
reset;
model cpp1.mod;
data cpp1.dat;
option solver cplex;
solve;
display X;

详细如下图所示:

1FD1EF842A71892EE1758A9D67F34AE7.jpg

创作不易,熬夜不易,你的【一键三连】是我最大鼓励与支持。

如有问题可以去WX问

F28378BFA71CADA0A0E56AA0A8F0249C.jpg


http://chatgpt.dhexx.cn/article/MMK4JpAk.shtml

相关文章

关于中国邮递员问题和欧拉图应用

关于中国邮递员问题和欧拉图应用 中国邮递员问题: 1962年有管梅谷先生提出中国邮递员问题(简称CPP)。一个邮递员从邮局出发,要走完他所管辖的每一条街道,可重复走一条街道,然后返回邮局。任何选择一条尽可…

欧拉环游和中国邮递员问题

文章目录 前言欧拉环游Fleury算法中国邮递员问题 前言 这篇文章介绍了欧拉环游的定义判定,Fleury算法求欧拉图中的欧拉环游,最后给出了中国邮递员问题的解决步骤。 欧拉环游 所谓欧拉环游就是指在一个无向图中,从一个点出发,每…

中国邮递员问题最短路径(代码+实现)

奇点需要配合LINGO进行去除,有需要请联系1822285076qq.com,需要一定费用。 总程序: 奇点消除lingo代码:

一笔画问题(中国邮递员问题)

一笔画与中国邮递员问题 一、引述 一笔画问题: 节点可以重复走边不可以重复走要求把所有边都走一次 欧拉图(Euler graph): 从任何节点开始,都可以一笔画 每一个节点都是偶数价(价数指的是从该节点能够伸出去的边的数目&#x…

用遗传算法解决中国邮递员问题

中国邮递员问题 所谓中国邮递员问题,见下面无向图 ,假设邮递员初始位置在A点,现在他要访问所有其他4个结点以便投递邮件,结点与结点之间的距离已经标注在边上。问:邮递员应该依次访问哪些结点才能以最短路径遍历所有结…

中国邮路问题邮递员问题欧拉路径图论C++

下载链接:https://download.csdn.net/download/RONNIE_Zz/13094843 通路:在无向图中由点边交替组成的序列就是通路(如果这个图是简单的,那么也可以使用点的序列来表示),如果首尾的点相同,则称为…

邮局问题

原题:POJ 1160 题意: 一些村庄被建立在一条笔直的高速公路边上,我们用一条坐标轴来描述这条高速公路,每一个村庄的坐标都是整数,没有两个村庄坐标相同。两个村庄间的距离,定义为它们的坐标值差的绝对值。我们需要在一…

c语言邮递员问题算法,中国邮递员问题的求解实例

中国邮递员问题的求解实例 前面已经讲过,对于欧拉图,可以直接用Fleury算法找出一条欧拉巡回路线;对于半欧拉图,可以先求出奇点u和v之间的最短路径P,令G G P,贝U G *为欧拉图,然后用Fleury算法来确定一个G *…

ACM图论算法—邮递员投递问题

题目描述 著名图论问题之一。邮递员从邮局出发送信,要求对辖区内每条街,都至少通过一次,再回邮局。在此条件下,怎样选择一条最短路线?此问题由中国数学家管梅谷于1960年首先研究并给出算法,故名。 中国邮…

百子作业 —— 中国邮递员问题

题目 严老师和宋老板去勘测武威市区的道路网,每一条路都需要勘测,且需要两人合作.武威市区可以近似地看成六横六纵组成的道路网,自西向东依次为学府路、民勤路、西关路、中关路、富民路、滨河路;自北向南依次为雷海路、宣武路、祁…

邮递员算法问题之c++实现

目录 前言演示问题介绍思路代码复现尾言 前言 大家好,我是Ericam_。 近些时间,通过一个项目接触到了邮递员算法问题,还是挺有意思的(虽然做起来经历了不少的困难)。最后勉强复现了吧,写个文章就当记录一下。…

中国邮递员问题+代码实现(cpp)

中国邮递员问题是一个和旅行商问题比较相关但又不太相同的一个问题,而且个人感觉理解的难度更大一点,当然,这就是仁者见仁,智者见智了,旅行商问题是不能回头的,一个节点访问过了不能回来了,并不…

离散数学实验----中国邮递员问题

实验目的和要求 实验目的: 理解什么是欧拉图,熟悉欧拉路和欧拉回路的概念。掌握Dijkstra算法,求解最短路径掌握Fleury算法,求解欧拉回路。了解Edmonds-Johnson算法解决中国邮递员问题的基本思路。通过程序实现中国邮递员问题&…

数据结构——中国邮递员问题

问题描述 代码 #include <stdio.h> #include <stdlib.h> #include <string.h>#define min(a,b) ( (a) < (b) ? (a) : (b) ) #define MAX_NODE 100 #define MAX_EDGE 100 #define INF 0x7fffffff // 表示两点不连通typedef struct {int number; …

[算法导论] 邮递员问题

邮递员问题 旅行商问题&#xff1a;给定一系列城市和每对城市之间的距离&#xff0c;求解访问每一座城市一次并回到起始城市的最短回路。&#xff08;遍历点&#xff0c;回到起点&#xff09; 哈密顿路径 哈密顿图 中国邮递员问题&#xff1a;邮差要设法找到一条最短路径&…

中国邮递员问题的深入剖析与算法实现(附例题及MATLAB、LINGO代码)

中国邮递员问题的深入剖析与算法实现 一、研究背景1.1 哥尼斯堡七桥问题1.2 欧拉图1.3 中国邮递员问题 二、中国邮递员问题深入解读2.1 问题重述2.2 奇偶点图上作业法[^1]2.3 最小二分匹配法1) 针对无向图2) 针对有向图 2.4 $fleury$算法 三、经典中国邮递员问题的具体实现3.1 …

中国邮路算法(中国邮递员问题)(详细)

通路&#xff1a;在无向图中由点边交替组成的序列就是通路&#xff08;如果这个图是简单的&#xff0c;那么也可以使用点的序列来表示&#xff09;&#xff0c;如果首尾的点相同&#xff0c;则称为一条回路 无向图的连通性&#xff1a;无向图中任意一对点之间均有通路 欧拉通路…

那些有趣的网站

之前分享过那些有意思的网站 &#xff0c;这里继续分享一波&#xff0c;也许你用得上。 福利单词 一边背单词一边看妹子的网站&#xff0c;用电脑打开&#xff0c;配合ctrlw 关闭新窗口&#xff0c;不知不觉就背了百来个词了 https://easychen.gitee.io/foxdict/ 工资计算器 简…

常用又有趣的网站大合集

〇、【Python challenge】通关代码及攻略 一、PIECES 拼图 PIECES 拼图网站用 30 个 CSS 碎片进行拼图&#xff0c;向我们呈现了 30 种濒临灭绝的动物。 二、小甲鱼编程学习工作室 包含了各种编程语言学习以及计算机基本操作的教学与奇技淫巧 三、Wolfram Alpha 这是由Wol…

超酷的13个CSS有趣学习网站

13个CSS有趣学习网站 今天来给大家推荐13个辅助你学习巩固知识的网站&#xff0c;让你边玩边学边记&#xff01; 因为这些网站大多都是国外的大佬们做的&#xff0c;所以网页大多都是英文&#xff0c;为了更好地使用&#xff0c;给你们推荐两个翻译的方式&#xff1a; 使用C…