彻底解决jtopo节点间存在多条连线时,路径重合的问题

首先申明一点,如果没有解决欢迎来打脸(因为CSDN之前有一个类似的帖子,但没有彻底解决问题,纯粹是骗分)!!!!

    本文所提的版本为jtopo-0.4.8-dev,所有的修改也都是基于此版本,修改后的两个节点正反双向连接效果如下:

    三条连线、四条连线:

    多条正反方向随意连接也没有问题:

 

    这是三条正向、三条反向的连线,效果很明显,没有任何的重合,好了,废话不多说,进入正题说说具体的实现。

    连线重合,打眼一看应该是计算路径出现了问题,那么我们直接看源代码路径函数是怎么实现的

从上图可以看出,计算连线路径的思路其实和简单,首先通过e函数求出当前连线关联的两个节点间总共的连线条数,var d = e(this.nodeA, this.nodeZ);如果d==1,那么就直接返回了首位节点的坐标,因为不需要拐点,直线连接就行了,只有一条连线;如果d不等于1(这里只能是大于1了,为啥大于自己想啊),就需要拐点来防止连线重合了,所以下面的大段算法就是通过三角函数计算出了中间的两个拐点的坐标,和首位节点坐标总共四个坐标返回了,所以问题肯定出在了三角算法这里,正反双向两条连线完全重合,肯定是所有的坐标点完全重合了(通过断点跟踪确定证实我的猜想是对的),在返回的路径数组中,正向的四个坐标点和反向的四个坐标点完全相同,只是顺序反了,比如正向坐标返回的是[(10,1),(10,2),(-10,1),(-10,2)],反向连线返回的坐标是[(-10,2),(-10,1),(10,2),(10,1)],很明显所有的点都在一条折线上(这里只是举例,不必深究坐标点是否合理),好了,大概的病根处是确定了,确定就是三角函数计算中间的两个拐点出的问题,也就是说最终返回数组a的0,、1下标的坐标点算错了,而拐点的变量是m、n坐标点,影响m、n坐标点的是k和l,很明显k是常量,最有嫌疑的是l, l = this.bundleGap * this.nodeIndex,而this.bundleGap也是一个常量,所以唯一可能错了的就是 this.nodeIndex,再看看nodeIndex是怎么实现的

不必慌,再看看e函数的实现:

好了,现在清楚了 this.nodeIndex就是计算出两个节点间所有连线的总数再减一,然后作为当前连线的nodeIndex的,这样做咋一看没啥问题,但是问题恰恰就出在了这里,nodeIndex应该是同方向的连线的下标,因为我们画的是有向线段,找到了问题的根节点,想必大家都知道应该怎么做了,这里不再累述,自己动手实现吧。下边是笔者自己修复后的代码,按照上面的分析做了相应的代码改动,经过验证,彻底解决了连线重复的问题(顺便调整了鼠标滚动缩放反向的问题),有问题、有疑问欢迎留言,欢迎指正,大家一起学习,共同进步。

彻底解决jtopo连线重合的问题.rar

 

最后,博主有一个小小的心愿,就是希望大家点一下下方的点赞、分享和收藏,博主希望大家都支持下,后期有好的东西我会继续分享给大家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多车辆单源配送路径规划问题(Multi-Vehicle Single-Source Pickup and Delivery Problem,简称MSPPD)的数学模型可以表示为: 假设有n个客户需要从仓库出发进行配送,每个客户i需要送货到指定的目的地j,每个客户的货物数量为q[i],每个车辆的最大载重量为Q,车辆的数量为K。我们需要确定每个车辆的路径,使得满足以下条件: 1.每个客户都可以被服务,即每个客户的需求量都被满足; 2.每个车辆的最大载重量不超过Q; 3.每个车辆的路径长度最小。 为了建立这个问题的数学模型,我们可以定义以下变量: 1. $x_{ij}^k$表示车辆k是否经过节点i和节点j之路径,即: $x_{ij}^k= \begin{cases} 1, & \text{如果车辆k经过节点i和节点j之路径}\\ 0, & \text{其他情况} \end{cases}$ 2. $u_i$表示节点i的需求量是否被满足,即: $u_i= \begin{cases} 1, & \text{如果节点i的需求量被满足}\\ 0, & \text{其他情况} \end{cases}$ 然后,我们可以建立以下线性规划模型: $\min \sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{K}c_{ij}x_{ij}^k$ $\text{s.t.}$ $\sum_{j=1}^{n}x_{ij}^k-\sum_{j=1}^{n}x_{ji}^k= \begin{cases} 1, & \text{i=0}\\ 0, & \text{i$\neq$0} \end{cases}$ $\sum_{i=1}^{n}x_{ij}^k-\sum_{i=1}^{n}x_{ji}^k= \begin{cases} -1, & \text{j=0}\\ 0, & \text{j$\neq$0} \end{cases}$ $\sum_{i=1}^{n}q_iu_i\leq Q$ $\sum_{i\in S}u_i\geq 1, S\subseteq V, S\neq \emptyset, S\neq V$ $x_{ij}^k\in\{0,1\}$ $u_i\in\{0,1\}$ 其中,$c_{ij}$表示节点i和节点j之的距离或成本,$V$表示所有的节点集合,$S$表示任意节点子集,且$S\neq \emptyset$,$S\neq V$。 这个线性规划模型可以使用贪心算法求解,具体思路是: 1.初始化所有节点的需求量为未满足状态,即$u_i=0$。 2.选取一个未被服务的节点i,以i为起点,使用贪心算法确定一条路径,使得路径长度最小且满足车辆载重量不超过Q。 3.将路径上经过的节点的需求量标记为已满足状态,即$u_i=1$。 4.重复步骤2和步骤3,直到所有节点的需求量都被满足。 5.如果存在未被服务的节点,返回无解。 这样,就可以使用贪心算法解决多车辆单源配送路径规划问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不脱发的牧码人

你的鼓励将是我前进的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值