Tìm lộ trình ngắn nhất (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

gauchoigameonline

Thành viên chính thức
Tham gia
18/3/20
Bài viết
64
Được thích
36
Nghề nghiệp
Tool writer
Dear a/e



Hiện tại mình có bài toán như sau:

Cho n vị trí cộ định, biết trước khoảng cách giữa các điểm với nhau (mỗi điểm đều có khoảng cách đến tất cả các điểm còn lại)

Yêu cầu bài toán là tìm lộ trình ngắn nhất đi qua n điểm, cụ thể

1, Vị trí xuất phát, vị trí kết thúc? (thuộc n vị trí cố định)

2, Lộ trình di chuyển: thứ tự từng vị trí đi qua (tại mỗi Node, lộ trình có thể lặp lại - đi qua Node đó nhiều lần)

※ Map tuyến đường & ví dụ minh họa tham khảo file đính kèm!

>> A/e có cao kiến gì hỗ trợ mình cái nhé. Thank so much!
 

File đính kèm

Lần chỉnh sửa cuối:
Dear a/e



Hiện tại mình có bài toán như sau:

Cho n vị trí cộ định, biết trước khoảng cách giữa các điểm với nhau (mỗi điểm đều có khoảng cách đến tất cả các điểm còn lại)

Yêu cầu bài toán là tìm lộ trình ngắn nhất đi qua n điểm, cụ thể

1, Vị trí xuất phát? (thuộc n vị trí cố định)

2, Lộ trình di chuyển: thứ tự từng vị trí đi qua
※ Ví dụ tham khảo file đính kèm
>> A/e có cao kiến gì hỗ trợ mình cái nhé. Thank so much!
Bài toán của bạn có số nút max là khoảng bao nhiêu?
 
Upvote 0
Cái này trước xem chương trình shark tank của VTV3 thấy có 1 đơn vị họ làm được (mà có tính phí), nghe nói thuật toán gì gì đó chỉ có 1-2 đơn vị có thể làm được
 
Upvote 0
Upvote 0
Dear a/e



Hiện tại mình có bài toán như sau:

Cho n vị trí cộ định, biết trước khoảng cách giữa các điểm với nhau (mỗi điểm đều có khoảng cách đến tất cả các điểm còn lại)

Yêu cầu bài toán là tìm lộ trình ngắn nhất đi qua n điểm, cụ thể

1, Vị trí xuất phát? (thuộc n vị trí cố định)

2, Lộ trình di chuyển: thứ tự từng vị trí đi qua
※ Ví dụ tham khảo file đính kèm
>> A/e có cao kiến gì hỗ trợ mình cái nhé. Thank so much!
Bạn cho hỏi:
1/ việc đi có cần đi hết các nút không?
2/ có qui định vị trí cuối cùng không?
3/ có qui luật ràng buộc đi như thế nào không?
 
Upvote 0
Bạn cho hỏi:
1/ việc đi có cần đi hết các nút không?
2/ có qui định vị trí cuối cùng không?
Bạn ơi yêu cầu bài toán có ghi cụ thể mà:
1, Lộ trình phải đi qua tất cả các điểm (n điểm)
2, Không quy định vị trí xuất phát và vị trí kết thúc
 
Upvote 0
Hình như bạn giỏi tiếng Anh lắm thì phải.
Từ khoá để tra: heuristic
Bài này giống "chinese postman problem algorithm". Giống vì bài "người đưa thư TQ" đi và trở về điểm xuất phát.

Không biết có tam giác ABC như trong bài không nhỉ: AB + AC = BC. :D

1. Nhớ hồi học hình học thì biết: tổng 2 cạnh của tam giác bất kỳ luôn lớn hơn cạnh thứ ba.
2. Chắc chắn cả những người không đi học biết là "đường chim bay" luôn là con đường ngắn nhất giữa 2 điểm bất kỳ.
 
Upvote 0
Thôi lỡ gợi ý rồi, chỉ luôn cho tiện.
shortest path visiting all nodes
(Java, Python, C++ codes)
 
Upvote 0
Bạn gửi mẫu vài chục nút bố trí theo cách của bạn lên để thử xem sao
Đây nhé bạn, mình chỉ lấy ví dụ thôi nhé!
Bài đã được tự động gộp:

Thôi lỡ gợi ý rồi, chỉ luôn cho tiện.
shortest path visiting all nodes
(Java, Python, C++ codes)
Mình có đọc qua mấy bài viết liên quan đến 「heuristic」như bạn gợi ý.
Hình như là đang nói đến việc tìm đường đi ngắn nhất giữa 2 điểm bất kỳ mà bạn (dùng giải thuật Dijkstra or Floyd)?
Bài đã được tự động gộp:

Hình như bạn giỏi tiếng Anh lắm thì phải.
Từ khoá để tra: heuristic
Có căn cứ nào mà bạn bảo mk giỏi tiếng anh thế ?===\.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đây là bài toán cổ điển rồi, Cứ tìm kiếm google là ra
Đường đi ngắn nhất
Thuật toán đồ thị
Thuật toán duyệt cây
....
Chỉ e rằng quy mô bài toán , khi lớn thì khó đạt kết quả tốt nhất
Và tính ứng dụng bài toán thường hạn hẹp
 
Upvote 0
Đây là bài toán cổ điển rồi, Cứ tìm kiếm google là ra
Đường đi ngắn nhất
Thuật toán đồ thị
Thuật toán duyệt cây
....
Chỉ e rằng quy mô bài toán , khi lớn thì khó đạt kết quả tốt nhất
Và tính ứng dụng bài toán thường hạn hẹp
Mấy thuật toán đó toàn là tìm đường đi ngắn nhất giữa 2 điểm bất kỳ, chứ không phải là tìm cả lộ trình ngắn nhất đi qua những điểm cố định cho trước, hjk!!

Thank bạn nhé!
 
Upvote 0
Mấy thuật toán đó toàn là tìm đường đi ngắn nhất giữa 2 điểm bất kỳ, chứ không phải là tìm cả lộ trình ngắn nhất đi qua những điểm cố định cho trước, hjk!!

Thank bạn nhé!
Có nhé, 2 điểm thì đâu phải tìm nữa. Cứ tìm đi, ví dụ thuật toán Vét cạn sẽ bao hết các phương án
 
Upvote 0
Bài này giống "chinese postman problem algorithm". Giống vì bài "người đưa thư TQ" đi và trở về điểm xuất phát.

Không biết có tam giác ABC như trong bài không nhỉ: AB + AC = BC. :D

1. Nhớ hồi học hình học thì biết: tổng 2 cạnh của tam giác bất kỳ luôn lớn hơn cạnh thứ ba.
2. Chắc chắn cả những người không đi học biết là "đường chim bay" luôn là con đường ngắn nhất giữa 2 điểm bất kỳ.
^^ Bạn có làm cái code nào tương tự như bài người đưa thư này ko?
 
Upvote 0
Cần số liệu giả định đó bạn.
Trong bài của bạn, tất cả các nút đều liên thông?
Nó là bài toán thực tế luôn nhé bạn chứ không phải là giả định.
Đường đi ngắn nhất giữa 2 Node bất kỳ sẽ được tự động tính toán bằng giải thuật (Dijstka) >> Số liệu tự động tính toán
Mô hình chính là mạng lưới giao thông, trong đó các Node đều liên thông được với nhau.
 
Upvote 0
@gauchoigameonline
Chạy solver trong file đính kèm.
Số liệu 4 nút trong file cũ của bạn.
---
Thực tế với giả định máy tính nó có phân biệt được không bạn?
---
Chạy sheet3
 

File đính kèm

Upvote 0
Upvote 0
Bài này giống "chinese postman problem algorithm". Giống vì bài "người đưa thư TQ" đi và trở về điểm xuất phát.

Không biết có tam giác ABC như trong bài không nhỉ: AB + AC = BC. :D

1. Nhớ hồi học hình học thì biết: tổng 2 cạnh của tam giác bất kỳ luôn lớn hơn cạnh thứ ba.
2. Chắc chắn cả những người không đi học biết là "đường chim bay" luôn là con đường ngắn nhất giữa 2 điểm bất kỳ.

Chắc kiểu lối cũ ta về
 
Upvote 0
Tải cả 2 file đều không thấy Sheet thứ 2 nào. Chỉ thấy 1 sheet duy nhất.

View attachment 245338


View attachment 245345
Đây nhé bạn (File đăng lên chỉ chứa đc 1 Sheet hay sao ấy, file nguồn của mk vẫn có 2 Sheet mà).
Bài đã được tự động gộp:

@gauchoigameonline
Chạy solver trong file đính kèm.
Số liệu 4 nút trong file cũ của bạn.
---
Thực tế với giả định máy tính nó có phân biệt được không bạn?
---
Chạy sheet3
Mình chẳng thấy phần chạy ở đâu vậy bạn?
Thực tế với giả định (mô hình Map mình lập) chương trình tự động phân biệt được nhé.
(Đang hướng tới việc xây dung hệ thống tương tự Google map trên Excel: tự nhận biết vị trí hiện tại, chỉ đường…)
 

File đính kèm

Upvote 0
Mình chẳng thấy phần chạy ở đâu vậy bạn?
Thực tế với giả định (mô hình Map mình lập) chương trình tự động phân biệt được nhé.
(Đang hướng tới việc xây dung hệ thống tương tự Google map trên Excel: tự nhận biết vị trí hiện tại, chỉ đường…)
Chọn sheet3, vào menu data, tìm biểu tượng solver, ấn vào đấy
 
Upvote 0
Bạn ơi, gửi giúp mk file text để tham khảo được không. Thank bạn nhé!
Bài đã được tự động gộp:

Xổ thiếng Anh tưng bừng như ngày hội thì không giỏi chẳng nhẽ là Tây bồi à?
Đúng rồi bạn, Tây bồi mà. Từ nào mà khó diễn đạt ngữ nghĩa quá chuyển sang dung tiếng Tây cho dễ :p
(Sửa lại cho bạn hiểu đúng ngữ nghĩa của câu này nhé!)
 
Lần chỉnh sửa cuối:
Upvote 0
...
Đúng rồi bạn, Tây bồi mà. Từ nào mà khó diễn đạt ngữ nghĩa quá chuyển sang dung tiếng Tây cho dễ
In such case, you should not have had any problems following the key words in post #9.
Searching "postman problem algorithm" would have given you hundreds of solutions.

Đúng là trường hợp này dùng tiếng Tây mới dễ diễn tả cái ý trong các cụm từ tô đậm.
 
Upvote 0
Đây nhé bạn (File đăng lên chỉ chứa đc 1 Sheet hay sao ấy, file nguồn của mk vẫn có 2 Sheet mà).
Bài đã được tự động gộp:


Mình chẳng thấy phần chạy ở đâu vậy bạn?
Thực tế với giả định (mô hình Map mình lập) chương trình tự động phân biệt được nhé.
(Đang hướng tới việc xây dung hệ thống tương tự Google map trên Excel: tự nhận biết vị trí hiện tại, chỉ đường…)
Muốn làm vậy phải làm từ phần nhỏ
Phần nhỏ đầu tiên là tự tìm kiếm (tự search) tự thử, tự suy nghĩ, tự làm để hiểu vấn đề

Miết đọc topic này không biết ai hỏi ai, ai giúp ai?
 
Upvote 0
Bạn ơi, gửi giúp mk file text để tham khảo được không. Thank bạn nhé!

Đúng rồi bạn, Tây bồi mà. Từ nào mà khó diễn đạt ngữ nghĩa quá chuyển sang dung tiếng Tây cho dễ
mk là "mẹ kiếp" hay là gì bạn? còn "cám ơn" là rất khó diễn đạt ngữ nghĩa nên phải dùng "thank" sao? Tôi ít khi bắt bẻ tiếng Anh, từ viết tắt, nhưng kiểu "mk" là rất dị ứng và kiểu biện minh vô lý cũng vậy
 
Upvote 0
mk là "mẹ kiếp" hay là gì bạn? còn "cám ơn" là rất khó diễn đạt ngữ nghĩa nên phải dùng "thank" sao? Tôi ít khi bắt bẻ tiếng Anh, từ viết tắt, nhưng kiểu "mk" là rất dị ứng và kiểu biện minh vô lý cũng vậy
Các cụm từ "cám ơn", "xin lỗi" trong tiếng Việt khá nặng. Vì văn hoá Việt nó đặt trọng các chỗ đó.
Từ "thanks", "sorry" trong tiếng Anh nó nhẹ hơn nhiều.
Vì vậy, khi muốn cám ơn hay xin lỗi một cách hời hợt, không hoàn toàn cố ý thì người ta dùng tiếng Anh.

Trong trường hợp này thì tôi tin là lý luận của thớt chấp nhận được: dùng tiếng Việt rất khó mà nói "cám ơn" trong khi bụng không hẳn 100% "cám ơn"

mk thì tôi không biết. Tôi đoán là từ moã (moi, tiếng Pháp)
 
Upvote 0
Các cụm từ "cám ơn", "xin lỗi" trong tiếng Việt khá nặng. Vì văn hoá Việt nó đặt trọng các chỗ đó.
Từ "thanks", "sorry" trong tiếng Anh nó nhẹ hơn nhiều.
Vì vậy, khi muốn cám ơn hay xin lỗi một cách hời hợt, không hoàn toàn cố ý thì người ta dùng tiếng Anh.

Trong trường hợp này thì tôi tin là lý luận của thớt chấp nhận được: dùng tiếng Việt rất khó mà nói "cám ơn" trong khi bụng không hẳn 100% "cám ơn"

mk thì tôi không biết. Tôi đoán là từ moã (moi, tiếng Pháp)

Các bạn nghĩ sao vậy, mình không nghĩ được sâu xa như vậy đâu. Sao không nghĩ đơn giản hơn chút cho cuộc sống nó nhẹ nhàng nhỉ? Đơn giản:
Tùy từng văn hóa vùng miền, thói quen, lứa tuổi... mà ngôn ngữ giao tiếp có thể khác nhau.
Và quan trọng hơn chính là cách nhìn của bản thân mỗi người là hướng tích cực hay tiêu cực thôi ^^
 
Upvote 0
Các bạn nghĩ sao vậy, mình không nghĩ được sâu xa như vậy đâu. Sao không nghĩ đơn giản hơn chút cho cuộc sống nó nhẹ nhàng nhỉ? Đơn giản:
Tùy từng văn hóa vùng miền, thói quen, lứa tuổi... mà ngôn ngữ giao tiếp có thể khác nhau.
Và quan trọng hơn chính là cách nhìn của bản thân mỗi người là hướng tích cực hay tiêu cực thôi ^^
Ở trên tôi nhắc bạn trên cương vị là quản trị diễn đàn và căn cứ vào nội quy để giữ gìn sự trong sáng của tiếng Việt. Nếu như bạn không bỏ những từ ngữ kiểu chat chit như mk, mn, ... thì tôi sẽ xoá bài. Từ tiếng Anh thì nội quy chưa có, nhưng là thể hiện văn hoá và sự tôn trọng cũng như tự trọng.
Văn hoá là những điều tốt đẹp chứ không phải những kiểu ngôn ngữ giao tiếp như vậy. Vùng miền lại càng không có. Đây lại là 1 thứ biện minh vô lý khác
 
Upvote 0
Các bạn nghĩ sao vậy, mình không nghĩ được sâu xa như vậy đâu. Sao không nghĩ đơn giản hơn chút cho cuộc sống nó nhẹ nhàng nhỉ? Đơn giản:
Tùy từng văn hóa vùng miền, thói quen, lứa tuổi... mà ngôn ngữ giao tiếp có thể khác nhau.
Và quan trọng hơn chính là cách nhìn của bản thân mỗi người là hướng tích cực hay tiêu cực thôi ^^
Thì chính vì hai cái từ văn hoá, và cái vụ vùng miền, vân vân,... mà tôi không muốn ba cái tiếng ba rọi ấy lan qua "văn hoá vùng miền" của tôi.
Đối với bạn thì quan trọng ở chỗ qua cho xong cho nên nói búa xua tiếng Tây là tích cực.
Đối với tôi, cái quan trọng là văn hoá Việt cho nên tôi thấy Tây bồi là tiêu cực.

Cái quan trọng hơn nữa là ở đây tôi không phải là người nhờ vết code.
Nếu từ đầu tôi cảm thấy xứng đáng "tích cực" thì đã bỏ công dịch C++ sang VBA rồi. Đâu đợi đến giờ này.
 
Upvote 0
Các bạn nghĩ sao vậy, mình không nghĩ được sâu xa như vậy đâu. Sao không nghĩ đơn giản hơn chút cho cuộc sống nó nhẹ nhàng nhỉ? Đơn giản:
Tùy từng văn hóa vùng miền, thói quen, lứa tuổi... mà ngôn ngữ giao tiếp có thể khác nhau.
Và quan trọng hơn chính là cách nhìn của bản thân mỗi người là hướng tích cực hay tiêu cực thôi ^^
Theo bạn, phần chữ đậm có liên quan gì tới việc cộng điểm khi thi đại học không bạn?
 
Upvote 0
2 điểm thì đâu phải tìm nữa.
Bạn không hiểu ý tác giả rồi.

Bài toán: cho vd. 10 điểm A, B, ..., I, J.
1. Bài của tác giả. Trong tất cả những con đường đi từ A tới J mà đi quả tất cả 10 điểm hãy tìm lộ trình ngắn nhất.

2. Bài toán "đi qua 2 điểm" mà tác giả lưu ý bạn. Trong tất cả những con đường đi từ A tới J tìm lộ trình ngắn nhất.

Nên biết rằng trong bài 2 có thể giữa A và J không có đường trực tiếp. Vậy mọi lộ trình trong trường hợp tổng quát là đường gấp khúc có ít nhất 2 đoạn. Hãy tìm đường gấp khúc ngắn nhất. Không có đòi hỏi đi qua tất cả các điểm đã cho như bài 1. Và thuật toán cho bài 2 tác giả cũng đã biết. Đó là thuật toán Dijkstra.
 
Upvote 0
Bạn không hiểu ý tác giả rồi.

Bài toán: cho vd. 10 điểm A, B, ..., I, J.
1. Bài của tác giả. Trong tất cả những con đường đi từ A tới J mà đi quả tất cả 10 điểm hãy tìm lộ trình ngắn nhất.

...
Phần tôi thì không hiểu là thớt có hiểu mình muốn gì không?
Bài toán postman buộc phải đi qua mọi điểm. Và mọi đường nối giữa hai điểm đều khả thi.
Mục đích mà thớt nêu ra ở bài #25 là bài toán chỉ đường, không nhất thiết phải qua mọi điểm. Và có một số đường không khả thi (điển hình đường 1 chiều, hay không có đường trực tiếp giữa 2 điểm nào đó)
Hai vấn đề rất khác biệt nhau.
 
Upvote 0
Mình có đoạn code này cho mọi người tham khảo nhé: Cơ bản nó như sau: Nó sẽ làm theo phương pháp cộng dần quãng đường đi và tìm cái ngắn nhất (Mỗi ô cell là 1 đơn vị quãng đường đi). Đoạn code này có hạn chế như sau và cần mọi người tự nâng cấp code lên nhá:
1) Nó phải lặp khá nhều lần trong vùng bản đồ mà tôi cài ở dạng "Range Name" Nên khi cài đặt với vùng bản đồ lớn nó sẽ chạy lâu.
2) Nó chưa chỉ ra thêm cung đường có cùng độ dài. Cái này tôi sử lý được nhưng tôi ngại quá, mọi người tự sử lý thêm.
3) Tất cả các ô mình bôi đậm ở dòng code bạn có thể thay đổi khi bạn làm bản đồ mới hay cái bảng mới.
3.1) Mình có file đính kèm bên dưới các bạn có thể tham khảo. ^^


Option Explicit.
Public LastColMap As Double
Public LastRowMap As Double
Public C_FCol As Double
Public C_FRow As Double
Public cell_start As Range
Public cell_end As Range
Public SetBackGround As String
Public SetWalls As String
Public Sub FindMinRoad()
Dim cell_current As Range
Dim l_smallest_path As Long
Dim l_col As Long
Dim l_LastRowMap As Long
Dim my_DeleteCell As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Range(Range("B30").Value).Style = "Good"
Range(Range("B29").Value).Style = "Bad"
Range(Range("B28").Value).Name = "SetUpMapMe"
SetBackGround = Range("B27").Value
SetWalls = Range("B31").Value
LastColMap = Range(Range("B28").Value).Columns.Count + Range(Range("B28").Value).Column - 1
LastRowMap = Range(Range("B28").Value).Row + Range(Range("B28").Value).Rows.Count - 1
C_FCol = Range(Range("B28").Value).Column - 1
C_FRow = Range(Range("B28").Value).Row - 1
Set cell_start = Cells(Range(Range("B29").Value).Row, Range(Range("B29").Value).Column)
Set cell_end = Cells(Range(Range("B30").Value).Row, Range(Range("B30").Value).Column)
Set cell_current = cell_start
cell_current.Value = cell_current.Address & "*" & 0
Do While True
If CheckBy1(cell_current) Then Exit Do
Set cell_current = PathNewSmall(cell_current)
cell_current.Style = "Input"
Loop
Do While True
cell_current.Style = "Accent2"
If CheckBy1(cell_current, False) Then Exit Do
Set cell_current = Range(Split(cell_current, "*")(0))
Loop
For Each my_DeleteCell In [Playground]
If my_DeleteCell.Style <> SetWalls And my_DeleteCell.Style <> "Accent2" Then
my_DeleteCell.Clear
my_DeleteCell.Style = SetBackGround
ElseIf my_DeleteCell.Style = "Accent2" Then
my_DeleteCell.Value = VBA.Split(my_DeleteCell, "*")(1)
End If
Next my_DeleteCell
Range(Range("B30").Value).Interior.Color = 65535
Range(Range("B29").Value).Interior.Color = 10498160
Set cell_start = Nothing
Set cell_end = Nothing
Set cell_current = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Public Sub Reset()
Dim sName As String
Dim my_DeleteCell As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Range(Range("B28").Value).Name = "SetUpMapMe"
SetWalls = Range("B31").Value
SetBackGround = Range("B27").Value
For Each my_DeleteCell In [Playground]
If my_DeleteCell.Style <> SetWalls Then
my_DeleteCell.Clear
my_DeleteCell.Style = SetBackGround
End If
Next my_DeleteCell
[Playground].RowHeight = 14
[Playground].ColumnWidth = 2.3
[Playground].WrapText = True
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Public Function CheckBy1(ByRef cell_current As Range, Optional b_going_back As Boolean = True) As Boolean ' Ham tra ve True or false
Dim my_cell As Range
If cell_current.Column < LastColMap Then
If cell_current.Column + 1 > C_FCol Then
Set my_cell = cell_current.Offset(0, 1)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
If cell_current.Row < LastRowMap Then
If cell_current.Row > C_FRow Then
Set my_cell = cell_current.Offset(1, 0)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
If cell_current.Column > 1 Then
If cell_current.Column - 1 > C_FCol Then
Set my_cell = cell_current.Offset(0, -1)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
If cell_current.Row > 1 Then
If cell_current.Row - 1 > C_FRow Then
Set my_cell = cell_current.Offset(-1, 0)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
Set my_cell = Nothing
End Function
Public Function NewDataCell(ByRef my_cell As Range, ByRef b_going_back As Boolean, cell_current As Range) As Boolean
If my_cell.Style = IIf(b_going_back, "Good", "Bad") Then NewDataCell = True
If my_cell.Style = SetBackGround Then
my_cell.Style = "Calculation"
my_cell = cell_current.Address & "*" & VBA.Split(cell_current.Value, "*")(1) + 1
End If
End Function
Public Function PathNewSmall(ByRef current_cell As Range) As Range
Dim my_cell As Range
Dim my_result_cell As Range
Dim l_result As Long
l_result = 1000000000
Set my_result_cell = Nothing
For Each my_cell In [Playground]
If my_cell.Style = "Calculation" Then
If VBA.Split(my_cell, "*")(1) < l_result Then
l_result = Split(my_cell, "*")(1)
Set my_result_cell = my_cell
End If
End If
Next my_cell
Set PathNewSmall = my_result_cell
Set my_result_cell = Nothing
End Function




Hi vọng đúng ý chủ thớt. Good luck!
Bài đã được tự động gộp:

À quên mình có hướng dẫn thêm tí là nếu bạn làm bản đồ mới thì cần khái báo định dạng cái vật cản theo đúng cái tên bên dưới hoặc theo một cái tên trong "Styles" cho tường cũng được: 1599830523840.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn không hiểu ý tác giả rồi.

Bài toán: cho vd. 10 điểm A, B, ..., I, J.
1. Bài của tác giả. Trong tất cả những con đường đi từ A tới J mà đi quả tất cả 10 điểm hãy tìm lộ trình ngắn nhất.

2. Bài toán "đi qua 2 điểm" mà tác giả lưu ý bạn. Trong tất cả những con đường đi từ A tới J tìm lộ trình ngắn nhất.

Nên biết rằng trong bài 2 có thể giữa A và J không có đường trực tiếp. Vậy mọi lộ trình trong trường hợp tổng quát là đường gấp khúc có ít nhất 2 đoạn. Hãy tìm đường gấp khúc ngắn nhất. Không có đòi hỏi đi qua tất cả các điểm đã cho như bài 1. Và thuật toán cho bài 2 tác giả cũng đã biết. Đó là thuật toán Dijkstra.
Bài toán yêu cầu rất rõ rồi, cho n điểm cố định tìm lộ trình ngắn nhất qua n điểm.
Hình như nhiều bạn đang hiểu đây là bài toán tìm quãng đường đi ngắn nhất giữa 2 điểm đó đấy batman!
Bài đã được tự động gộp:

Mình có đoạn code này cho mọi người tham khảo nhé: Cơ bản nó như sau: Nó sẽ làm theo phương pháp cộng dần quãng đường đi và tìm cái ngắn nhất (Mỗi ô cell là 1 đơn vị quãng đường đi). Đoạn code này có hạn chế như sau và cần mọi người tự nâng cấp code lên nhá:
1) Nó phải lặp khá nhều lần trong vùng bản đồ mà tôi cài ở dạng "Range Name" Nên khi cài đặt với vùng bản đồ lớn nó sẽ chạy lâu.
2) Nó chưa chỉ ra thêm cung đường có cùng độ dài. Cái này tôi sử lý được nhưng tôi ngại quá, mọi người tự sử lý thêm.
3) Tất cả các ô mình bôi đậm ở dòng code bạn có thể thay đổi khi bạn làm bản đồ mới hay cái bảng mới.
3.1) Mình có file đính kèm bên dưới các bạn có thể tham khảo. ^^


Option Explicit.
Public LastColMap As Double
Public LastRowMap As Double
Public C_FCol As Double
Public C_FRow As Double
Public cell_start As Range
Public cell_end As Range
Public SetBackGround As String
Public SetWalls As String
Public Sub FindMinRoad()
Dim cell_current As Range
Dim l_smallest_path As Long
Dim l_col As Long
Dim l_LastRowMap As Long
Dim my_DeleteCell As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Range(Range("B30").Value).Style = "Good"
Range(Range("B29").Value).Style = "Bad"
Range(Range("B28").Value).Name = "SetUpMapMe"
SetBackGround = Range("B27").Value
SetWalls = Range("B31").Value
LastColMap = Range(Range("B28").Value).Columns.Count + Range(Range("B28").Value).Column - 1
LastRowMap = Range(Range("B28").Value).Row + Range(Range("B28").Value).Rows.Count - 1
C_FCol = Range(Range("B28").Value).Column - 1
C_FRow = Range(Range("B28").Value).Row - 1
Set cell_start = Cells(Range(Range("B29").Value).Row, Range(Range("B29").Value).Column)
Set cell_end = Cells(Range(Range("B30").Value).Row, Range(Range("B30").Value).Column)
Set cell_current = cell_start
cell_current.Value = cell_current.Address & "*" & 0
Do While True
If CheckBy1(cell_current) Then Exit Do
Set cell_current = PathNewSmall(cell_current)
cell_current.Style = "Input"
Loop
Do While True
cell_current.Style = "Accent2"
If CheckBy1(cell_current, False) Then Exit Do
Set cell_current = Range(Split(cell_current, "*")(0))
Loop
For Each my_DeleteCell In [Playground]
If my_DeleteCell.Style <> SetWalls And my_DeleteCell.Style <> "Accent2" Then
my_DeleteCell.Clear
my_DeleteCell.Style = SetBackGround
ElseIf my_DeleteCell.Style = "Accent2" Then
my_DeleteCell.Value = VBA.Split(my_DeleteCell, "*")(1)
End If
Next my_DeleteCell
Range(Range("B30").Value).Interior.Color = 65535
Range(Range("B29").Value).Interior.Color = 10498160
Set cell_start = Nothing
Set cell_end = Nothing
Set cell_current = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Public Sub Reset()
Dim sName As String
Dim my_DeleteCell As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Range(Range("B28").Value).Name = "SetUpMapMe"
SetWalls = Range("B31").Value
SetBackGround = Range("B27").Value
For Each my_DeleteCell In [Playground]
If my_DeleteCell.Style <> SetWalls Then
my_DeleteCell.Clear
my_DeleteCell.Style = SetBackGround
End If
Next my_DeleteCell
[Playground].RowHeight = 14
[Playground].ColumnWidth = 2.3
[Playground].WrapText = True
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Public Function CheckBy1(ByRef cell_current As Range, Optional b_going_back As Boolean = True) As Boolean ' Ham tra ve True or false
Dim my_cell As Range
If cell_current.Column < LastColMap Then
If cell_current.Column + 1 > C_FCol Then
Set my_cell = cell_current.Offset(0, 1)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
If cell_current.Row < LastRowMap Then
If cell_current.Row > C_FRow Then
Set my_cell = cell_current.Offset(1, 0)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
If cell_current.Column > 1 Then
If cell_current.Column - 1 > C_FCol Then
Set my_cell = cell_current.Offset(0, -1)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
If cell_current.Row > 1 Then
If cell_current.Row - 1 > C_FRow Then
Set my_cell = cell_current.Offset(-1, 0)
CheckBy1 = NewDataCell(my_cell, b_going_back, cell_current)
If CheckBy1 Then Exit Function
End If
End If
Set my_cell = Nothing
End Function
Public Function NewDataCell(ByRef my_cell As Range, ByRef b_going_back As Boolean, cell_current As Range) As Boolean
If my_cell.Style = IIf(b_going_back, "Good", "Bad") Then NewDataCell = True
If my_cell.Style = SetBackGround Then
my_cell.Style = "Calculation"
my_cell = cell_current.Address & "*" & VBA.Split(cell_current.Value, "*")(1) + 1
End If
End Function
Public Function PathNewSmall(ByRef current_cell As Range) As Range
Dim my_cell As Range
Dim my_result_cell As Range
Dim l_result As Long
l_result = 1000000000
Set my_result_cell = Nothing
For Each my_cell In [Playground]
If my_cell.Style = "Calculation" Then
If VBA.Split(my_cell, "*")(1) < l_result Then
l_result = Split(my_cell, "*")(1)
Set my_result_cell = my_cell
End If
End If
Next my_cell
Set PathNewSmall = my_result_cell
Set my_result_cell = Nothing
End Function




Hi vọng đúng ý chủ thớt. Good luck!
Bài đã được tự động gộp:

À quên mình có hướng dẫn thêm tí là nếu bạn làm bản đồ mới thì cần khái báo định dạng cái vật cản theo đúng cái tên bên dưới hoặc theo một cái tên trong "Styles" cho tường cũng được: View attachment 245403
Tuy không phải đúng theo ý mình muốn (bài toán yêu cầu tìm lộ trình ngắn nhất đi qua n điểm chứ không phải là bài toán tìm đường đi ngắn nhất giữa 2 điểm) nhưng bạn đã rất nhiệt tình giúp mình.
Cảm ơn bạn nhiều nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Phần tôi thì không hiểu là thớt có hiểu mình muốn gì không?
Bài toán postman buộc phải đi qua mọi điểm. Và mọi đường nối giữa hai điểm đều khả thi.
Mục đích mà thớt nêu ra ở bài #25 là bài toán chỉ đường, không nhất thiết phải qua mọi điểm. Và có một số đường không khả thi (điển hình đường 1 chiều, hay không có đường trực tiếp giữa 2 điểm nào đó)
Hai vấn đề rất khác biệt nhau.
Bài toán mình đưa ra yêu cầu rất cụ thể mà bạn. Nó chính là chính là bài toán Postman đó.
Trong map mình gửi những vị trí cố định được tô màu cam trên các tuyến đường đi.
Lộ trình phải đi qua toàn bộ những vị trí màu cam này.
Lộ trình có thể đi lặp lại nhiều lần trên vị trí cố định (ví dụ như bạn nói A không đi được đến C vì AC là đường 1 chiều thì lộ trình là A→B→C→B→D...)
Nói chung đi kiểu gì thì đi cũng phải qua toàn bộ những vị trí màu cam đó.
Còn về việc đi từ A→B, từ B→C....cũng sẽ phải là tuyến đường đi ngắn nhất (mình đã xử lý được bằng thuật toán Dijska)
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom