- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在运行一项具有简单的一对一出发地和目的地的预订服务。随着我的服务不断增长,我正在考虑实现多个下车点,目的地如下
A----->B----->C----->D
假设从 A(出发地)到 D(目的地)的旅程在旅途中经过 B 和 C。
我的用户可以预订 A->B、A->C、A->D、B->C、B->D 和 C->D 的座位。我的问题是找到一个很好的座位可用性算法,给出一个问题例如 B->D。
我想出了一个简单的解决方案,如下
Routes:
-------------
id orig dest seats many_drop_off_points desc
1 A D 40 yes multiple drop-offs
2 A H 20 no straight
3 B H 12 no straight
4 A D 12 no straight
我有一个包含出发地、目的地的路线表。为简单起见,我只输入该路线的座位总数。
路由表可以有一个或多个路由,如下所示
Routhings
-----------------
id orig dest route_id denormalize_seats
1 A B 1 40
2 B C 1 40
3 C D 1 40
4 A H 2 20
路由属于特定的路由。路线可以在特定日期有多个预订。
RoutingReservation
---------------------------------
id routing_id date customer_id
当设置从 A 到 D 并经过 B 和 C 的路线时。
create in Routings table three record as shown in the table above(A->B, B->C, C->D).
如果从A->H直行,没有经过任何地方。 在路由表中创建一条记录(A->H)
当客户想要搜索从C->D的路线时,我只需从Route或Routings中搜索(复杂的计算)
预留座位也复杂。
使用 1 号路线从 A -> D 预订 10 个座位(多个下车点)
Create 10 reservations for Routing 1 (from A->B)
Create 10 reservations for Routing 2 (from B->C)
Create 10 reservations for Routing 3 (from C->D)
预留 5 个座位,从 A -> C
Create 5 reservations from Routing 1 (from A->B)
Create 5 reservations from Routing 2 (from B->C)
从 B -> D 预订 10 个座位
Create 10 seats from Routing 2 (from B->C)
Create 10 seats from Routing 3 (from C->D)
通过上述 3 个步骤计算路由的预留总数(复杂计算)
Routing 1 (from A->B) 10 + 5
Routing 2 (from B->C) 10 + 5 + 10
Routing 3 (from C->D) 10 + 10
A->D路线的可用座位
Total - Max(total number of reservation) from A->B, B->C, C->D
40 - Max(15, 25, 20) = 15 # Route with id 1
20 - 0 = 0 # Route with id 4
A->C航线的可用座位
Total - Max(total number of reservation) from A->B, B->C
40 - Max(15, 25) = 15
B->D 的可用座位
Total - Max(total number of reservation) from B->C, C->D
40 - Max(25, 20) = 15 # Route with id 1
C->D 的可用座位
Total - Max(total number of reservation) from C->D
40 - Max(20) = 20 # Route with id 1
这种多下车点好像是可以实现的,但是需要大量的计算,目前我有超过30个合作伙伴,一千多条路线,但我想介绍一下这几个合作伙伴的多个下车点作为我的起点。
我正在寻找一种可以更有效地解决这个问题的算法。我当前的环境是 rubyonrails 和 mysql。
感谢您提前提供的帮助。
ps:我也对其他类型的数据存储持开放态度,例如elasticsearch或mongodb。
最佳答案
如果您认为所有路线都有许多下车点,并且仅将简单路线(A->B、B->C)视为微不足道的情况,那么这可能是最简单的。然后,您的数据库架构可能如下所示:
== routes table ==
id | seats | name
---|-------|------------------
1 | 10 | simple route
2 | 30 | the scenic route
== stops table ==
id | route_id | location | next_location
--------------------------------------------
1 | 1 | A | B
2 | 1 | B |
3 | 2 | A | B
4 | 2 | B | C
5 | 2 | C | D
6 | 2 | D |
== reservations table ==
// for one trip from A to B on route 1 for 5ppl
// and one trip from A to C on route 2 for 20ppl
id | route_id | start_stop_id | end_stop_id | seats_needed
------------------------------------------------------------
1 | 1 | 1 | 2 | 5
2 | 2 | 3 | 5 | 20
您会注意到,我通过添加 next_location
稍微对停靠点表进行了非规范化,这一列不一定会添加任何额外信息,但会简化我们以后的计算。
使用此模式,我们可以通过这个相当简单的查询计算(每条路线或每条可能的航段)总容量和已用容量 :
robert=# SELECT routes.id as route_id, stops.id as stop_id, location, next_location,
SUM(routes.seats) as capacity,
SUM(reservations.seats_needed) as used
FROM stops
JOIN routes ON routes.id = stops.route_id
LEFT JOIN reservations
ON reservations.route_id = routes.id
AND reservations.start_stop_id <= stops.id
AND reservations.end_stop_id > stops.id
WHERE next_location IS NOT NULL
GROUP BY routes.id, stops.id
ORDER BY routes.id, location;
route_id | stop_id | location | next_location | capacity | used
----------+---------+----------+---------------+----------+------
1 | 1 | A | B | 10 | 5
2 | 3 | A | B | 30 | 20
2 | 4 | B | C | 30 | 20
2 | 5 | C | D | 30 |
此表简明地表示了您的路线。我们可以用它来回答更复杂的问题。
假设您想知道从 A 到 D 的旅程有多少个座位。此查询将找到所有此类座位,但它不会告诉您可以使用什么路线来执行此操作:
SELECT MIN(available) as available
FROM (
SELECT location, next_location, SUM(routes.seats) - COALESCE(SUM(reservations.seats_needed),0) as available
FROM stops
JOIN routes ON routes.id = stops.route_id
LEFT JOIN reservations
ON reservations.route_id = routes.id
AND reservations.start_stop_id <= stops.id
AND reservations.end_stop_id > stops.id
WHERE next_location IS NOT NULL
GROUP BY location, next_location
) availabilities
JOIN (
SELECT 'A' as a, 'B' as b
UNION ALL
SELECT 'B' as a, 'C' as b
UNION ALL
SELECT 'C' as a, 'D' as b
) legs
ON legs.a = location AND legs.b = next_location;
available
-----------
10
现在,这是很多 SQL,它并不能完全回答你的问题。但是,我所做的是创建一个模式来对设置的有向图进行建模,并演示了一些有关如何使用该有向图的查询。所以,是的,可以在 SQL 中进行图形计算 - 但正如您所看到的,特别是对于上面查询中的 legs
表,它有时会很麻烦。但这绝不是不可能的。
关于mysql - 使用 Rails 和 mysql 的具有多个下车点、目的地的机票预订算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35448158/
我在哪里可以从 RFCDES 表中获得 RFCOPTIONS 字符串的描述?每个参数的含义是什么? (H=?,N=?,g=?,l=?, ...) 最佳答案 我认为您应该在交易 sm59 中看到: ht
我在导航组件架构中使用底部导航。我想动态更改第一个 fragment 目标。所以我有 Fragment1 和 Fragment2。我想在某些情况下,单击底部导航栏中的第一项打开 Fragment1,在
有没有使用非硬编码 RFC 目的地的好方法? 现在我们的解决方案是检查使用的是哪个系统,然后将目的地分配给一个变量 IF cl_role EQ 'P'. p_dest = 'ESW300'
我能够使目标沿着屏幕顶部随机生成并在屏幕底部消失。唯一的问题是目标每次只能移动到一个固定点。我希望它们移动到屏幕底部的随机点。有任何想法吗?谢谢。 这是代码: -(void)addTarget{ CC
我有一个列表,其中包含推送 View 的行。该 View 有另一个列表,它推送另一个 View 。原来的List,第一个推送的List会随着数据的变化而更新。但是,推送时最后一个 View 不会更新。
我目前正在致力于将 IBM Webshere 应用程序迁移到 Spring Boot。 作为其中的一部分,有一个 MDB 类需要转换为 @JmsListener。该 MDB 有一个监听多个队列的方法。
我需要使用 phpmailer 发送存储在 mysql 数据库中的多封电子邮件,但是当我想执行它时,它返回 500 页错误,我明白问题出在我在其中输入数据时: ->setTo(["'".$row['e
我正在准备环游世界,并且很想知道世界各地的顶级景点有哪些,因此我正在尝试抓取某个地方的顶级目的地。我想最终到达一个国家的顶级地方以及他们最好的景点。最近添加了 Google Destinations
我想用箭头从当前用户位置旋转 ImageView 到以前保存的某个 GPS 位置。我该怎么做? 从 Location.distanceBetween 方法中获取的 Initial Bearing 是否
我希望能够从 application.properties 设置 @JMSlistener 目标 我的代码是这样的 @Service public class ListenerService {
我有一个 View “B”,它有一个带有参数的初始化程序。 struct B: View { let arg: Int init(arg: Int) { self.ar
好的,我们开始吧。我有一个 cocos2d 应用程序,并且有一些目标朝玩家移动。当玩家移动时,我希望他们再次慢慢地将目的地更改为玩家,这样他们就不会只是移动到空旷的空间中。是否可以更改 Sprite
我正在将 OnDestinationChangedListener 附加到我的 Activity 中的 NavController。 它适用于所有 fragment 目标。但是,当我导航到 Activ
我正在通过制作一个定向的表格对我们的表格进行一些 FK 分析 表示 FK 依赖关系的图,然后遍历 图形。在我的代码中,我使用有向图命名所有内容 术语,但我想多说一点 报告中的“用户友好”。 在这种情况
在 SSIS 包中,我将平面文件中的数据导入数据库,执行 sql 查询并将结果导出到 excel 目的地。我的问题是我有一个 convert,cast 语句,它在 sql 中很好,它返回一个值为 HH
我有一个 Spring 应用程序,它需要查找 JMS 目标才能完成工作。根据我们处于开发环境还是系统测试环境,我们将使用不同的 JMS 实现。 (Oracle AQ在系统测试中使用WebLogic,A
我有一个包含三列(原点、目的地、距离)的矩阵,我想用 Pandas 将其转换为原点/目的地矩阵,有没有一种快速方法(lambda、map)可以在不使用 for 循环的情况下执行此操作? 例如(我拥有的
拥有原始的 websocket 实现: @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocke
自从切换到 Storyboard后,我通过以下方式加载了一个 View Controller [self performSegueWithIdentifier:@"identifier" sender
我有一个名为“detailViewController”的 UIViewController。 使用推送转场通过多个不同的转场访问此 View Controller 。 我面临的问题是 detailV
我是一名优秀的程序员,十分优秀!