Làm thế nào tôi có thể duy trì một đội hình chữ nhật khi các đơn vị được thêm hoặc xóa?


18

Tôi đã có bot trong một hình chữ nhật với các hàng và cột. Một vấn đề phát sinh khi một bot được thêm hoặc xóa khỏi đội hình. Khi điều này xảy ra, các bot phải tự sắp xếp lại sao cho hình dạng hình chữ nhật vẫn có cùng tỷ lệ khung hình và càng hình chữ nhật càng tốt. làm như thế nào?

Một vài ý tưởng:

  • Khi một bot được thêm hoặc xóa, hãy sử dụng tổng số bot mới và tỷ lệ khung hình không đổi mong muốn để tính chiều rộng và chiều cao mới của đội hình phù hợp nhất với tỷ lệ khung hình đó. Sau đó bằng cách nào đó cải tổ các bot để phù hợp với kích thước mới.

  • Khi một bot bị loại bỏ, di chuyển bot phía sau nó vào vị trí của nó và tiếp tục cho đến khi bạn đạt đến cuối của đội hình. Sau đó, thậm chí xếp hạng trở lại càng nhiều càng tốt bằng cách bằng cách nào đó xáo trộn các bot trong xếp hạng trở lại.

  • Một ý tưởng khác hoàn toàn khác là bắt chước cách các cấu trúc phân tử ở lại với nhau. Làm cho mọi bot muốn được bao quanh bởi bốn bot khác bằng cách thu hút bốn bot gần nhất và đẩy lùi phần còn lại. Đẩy lùi tất cả các bot (bao gồm cả bốn) quá gần để đảm bảo phân tách bằng luật bình phương nghịch đảo. Bạn cũng cần một lực bổ sung để định hình toàn bộ cấu trúc. Nhưng, điều này nghe có vẻ rất đắt tiền.

CẬP NHẬT : Vì vậy, nhìn vào câu trả lời của sarahm, tôi đã đưa ra một chức năng chung tốt mang lại kích thước tốt.

Đầu tiên tôi giải phương trình đồng thời dưới đây cho chiều rộng và chiều cao, sau đó làm tròn các câu trả lời.

width/height=aspect ratio of your choice
width*height=number of bots

Điều này cung cấp cho bạn hình chữ nhật số nguyên gần nhất với tỷ lệ khung hình đó cho số lượng bot của bạn. Hình chữ nhật gần nhất sẽ là một nửa thời gian là quá lớn và một nửa thời gian là quá nhỏ (tất nhiên đôi khi nó sẽ vừa phải nhưng ai quan tâm đến những điều đó). Trong trường hợp hình chữ nhật là một chút quá lớn, nhu cầu gì để được thực hiện. Thứ hạng trở lại sẽ chỉ là gần đầy, đó là lý tưởng. Trong trường hợp hình chữ nhật là một chút quá nhỏ, bạn có vấn đề, vì đó teeny tràn nhỏ sẽ phải đi đến cấp bậc riêng của nó tạo ra một cấp bậc chỉ với một vài chương trình trên đó, mà không trông khá. Cũng có trường hợp chênh lệch lớn(lớn hơn một nửa chiều rộng), trong trường hợp đó cộng hoặc trừ một cấp bậc để tạo sự khác biệt nhỏ. Sau đó, khi hình chữ nhật quá nhỏ, thêm một cột để làm cho nó chỉ lớn hơn một chút. Sau khi làm điều đó, có vẻ như thứ hạng trở lại sẽ luôn có ít nhất một nửa số bot như các thứ hạng khác.

CẬP NHẬT

Khi bạn đã có kích thước, hãy so sánh chúng với kích thước hiện tại. Nếu mặt tiền của kích thước mới lớn hơn, đối với mọi cấp bậc, các bot pop từ thứ hạng bên dưới và đẩy chúng lên thứ hạng hiện tại cho đến khi số lượng bot trên thứ hạng đó bằng với mặt tiền. Tiếp tục thuật toán đó cho đến khi bạn đạt được thứ hạng trở lại. Sử dụng thuật toán này, các bot sẽ di chuyển để phù hợp với chiều mới một cách hiệu quả. Sau đó, tôi chỉ đơn giản là đẩy cái cũ mới lên thứ hạng trở lại. Thuật toán hơi khác nhau đối với các trường hợp mặt tiền mới nhỏ hơn, nhưng bạn có thể tìm ra nó!

Có hai vấn đề tiếp theo. Xóa và một phương pháp bổ sung linh hoạt hơn trong đó các bot mới không nhất thiết phải được gán cho thứ hạng trở lại nhưng bất kỳ vị trí nào gần với chúng nhất tại thời điểm chúng được thêm vào.


Số lượng bot tối đa trong một đơn vị là bao nhiêu? Nếu nó tương đối nhỏ, bạn có thể mã hóa số lượng hàng và cột trong một số lượng bot nhất định.
Exilyth

3
Bạn có thể đăng một hình ảnh của hình thành hợp lệ so với không hợp lệ? Tôi gặp một chút khó khăn để hiểu những gì bạn đang theo đuổi. Các hàng / cột không đầy đủ được phép?
MichaelHouse

3
Bạn có nhận ra rằng điều này sẽ không làm việc cho số nguyên tố? ví dụ: với 7 bot, bạn phải tạo một đơn vị 3x2 với một bot duy nhất ở phía sau.
Exilyth

1
Vâng, điều này là xấu hổ. Tôi hoàn toàn quên mất số nguyên tố. Sau đó, có lẽ điều tốt nhất tiếp theo sẽ là chỉ cho phép các hàng và cột được điền đầy đủ. Một Bot trên một hàng trông không ổn, nhưng một Bot ít hơn trên một hàng sẽ không tệ.
Tiby312

3
Số nguyên tố không phải là số duy nhất sẽ gây rắc rối - chọn kích thước đội hình bằng cách bao thanh toán có thể mang lại cho bạn hình dạng dài và gầy một cách vô lý. Ví dụ: nếu bạn có 14 bot, hình dạng hình chữ nhật hoàn hảo duy nhất là 7x2, trong khi nó có thể có hình dạng 3x4 tốt hơn với một hàng thêm 2 bot.
Nathan Reed

Câu trả lời:


16

Một kỹ thuật khác là bắt chước được sử dụng bởi các tiểu đoàn Napoleonic (và có thể lùi xa như phalanxes của Hy Lạp nếu không muốn nói thêm).

Mặt tiền nói chung được duy trì không đổi, và khi một người đàn ông ngã (ở bất kỳ cấp bậc nào ngoại trừ phía sau), anh ta được thay thế bởi người đàn ông ngay phía sau anh ta bước về phía trước. Thứ hạng phía sau được NCO xáo trộn để đảm bảo một vài người đàn ông ở cực bên của mỗi bên, và mặt khác để điền vào đều.

Mặt tiền chỉ được giảm khi thứ hạng phía sau giảm xuống dưới mật độ quy định trước. Tương tự như vậy, khi thứ hạng phía sau quá đầy, các tính năng bổ sung trước tiên bắt đầu điền vào một thứ hạng bổ sung từ cả hai bên, và sau đó mặt tiền được tăng lên.

Khi thay đổi mặt tiền, tôi khuyên bạn nên để bot của bạn chuyển từ xếp hạng phía sau sang cả hai bên khi tăng mặt tiền và nộp từ cả hai bên sang thứ hạng phía sau khi giảm mặt tiền.

Nếu tôi đúng khi suy luận rằng bạn đang tìm kiếm một ấn tượng "quân sự" và để các tổ chức bot của bạn trông giống như phalanxes, tôi tin rằng sự sắp xếp lại theo thứ tự này là một cách tốt hơn để đạt được mục đích đó.

Cập nhật :
Một cách đơn giản để quản lý hàng sau là chia các đơn vị hàng sau thành ba đội: một ở mỗi bên và một ở trung tâm. Tùy thuộc vào việc mặt tiền là số lẻ hay số chẵn và số lượng đơn vị hàng sau có đồng nhất với 0,1 hoặc 2 mod 3 hay không, có chính xác sáu trường hợp để quản lý.

Để cải thiện vấn đề trên, hãy xem xét khoảng cách (các) đơn vị cuối cùng của mỗi đội hình hàng sau khi điền vào dưới ngưỡng, như sau:
xxx.x .... x.xxx.x .... x. xxx
hoặc này:
xx.xx..x.xxx.x ... xxxx
Công việc nhiều hơn một chút, cho một diện mạo thậm chí còn tốt hơn.

Cập nhật # 2 :
Một suy nghĩ bổ sung về độ sâu hình thành. Tác động của lửa bóng chuyền, kết hợp với lưỡi lê hiện đại, đã tạo ra độ sâu 3 hoặc 4 đầy đủ vào cuối thế kỷ 18 và đầu thế kỷ 19. (Người Anh hiếm khi chiến đấu ở 2 cấp bậc, trái với niềm tin phổ biến, cho đến cuối trận chiến; đối với một người, nó khiến đường của họ quá dài để tạo thành hình vuông một cách nhanh chóng.) Trước đó, thông thường có độ sâu lớn hơn, có thể lên tới 8 hoặc 10 cho một phalanx Hy Lạp được trang bị Sarissa. Chọn một độ sâu tạo ra ấn tượng mà bạn mong muốn.

Quân đội trong đời thực cố gắng duy trì mặt trận đơn vị càng lâu càng tốt, với chi phí tăng độ giòn của đơn vị, vì điều này làm cho việc đặt ra một chiến trường đơn giản hơn. Caesar tại Pharsalus đã cố tình giảm độ sâu đơn vị của mình để tăng mặt tiền để phù hợp với lực lượng của Pompey. Như câu trích dẫn: "Chúng ta chiến thắng hoặc chết ngày hôm nay; Người của Pompey có những lựa chọn khác." (điều mà Caesar đã khéo léo và đảm bảo cẩn thận, tất nhiên).


Điều này nghe có vẻ như một giải pháp thanh lịch hơn nhiều. Không cần phải lo lắng về các số nguyên tố hoặc tỷ lệ khung hình, nhưng nó vẫn tránh được bất kỳ hàng nào có số lượng bot thấp bất thường, và điều kiện duy nhất cần được kiểm tra là mức độ backrank đầy đủ như thế nào!
Tiby312

Nhưng giữ lấy. Giả sử thứ hạng phía sau chỉ có 3 bot trong đó và nằm trong các cột 1, 2 và 3. Và tôi loại bỏ ai đó khỏi cột thứ 5 một ai đó ở gần phía trước. Tôi sẽ kết thúc với một vị trí miễn phí ở hàng thứ hai đến hàng cuối cùng trong cột thứ 5 mà không có bot nào đứng sau nó. Ai nên điền vào chỗ này?
Tiby312

Có lẽ, bot gần nhất trong xếp hạng trở lại (tức là bot trong cột 3) sẽ chạy để điền vào nó. Hoặc bạn có thể tiết kiệm một chút thời gian bằng cách để các bot ở cột 3 và 4 của thứ hạng từ thứ hai đến cuối mỗi bước một cột lên, di chuyển khoảng cách sang cột 3, và sau đó đưa bot ở cột 3 bước về phía trước để lấp đầy nó (IMO, chiến lược tìm kiếm "tự nhiên" nhất có lẽ sẽ là sự kết hợp heuristic của cả hai, có thể với một số ngẫu nhiên được đưa vào.)
Ilmari Karonen

1
Nếu thứ hạng phía sau có quá ít thành viên (ít hơn 50% so với các thứ hạng khác) và bạn tăng mặt tiền, điều này có đảm bảo để khắc phục sự cố không, hoặc có thể thứ hạng phía sau vẫn còn quá ít thành viên sau khi tăng mặt tiền đòi hỏi nó phải được lặp đi lặp lại hay cái gì đó?
Tiby312

1
@ Tiby312: Tôi tin rằng bạn đang suy nghĩ quá mức. Hãy dùng thử, biết rằng bạn luôn có thể điều chỉnh nó sau
Pieter Geerkens

7

Giả sử một đơn vị là một cơ sở hạ tầng tuyến tính (ví dụ: danh sách ) các bot.

Đầu tiên, bạn phải thêm / xóa bot đến / từ cơ sở hạ tầng và xác định số lượng bot mới trong đơn vị.

Sau đó, bạn phải xác định số lượng hàng và cột mới bằng cách sử dụng https://en.wikipedia.org/wiki/Integer_factorization .

Tất nhiên, điều này không phải lúc nào cũng có thể do số nguyên tố . Khi kích thước đơn vị mới là số nguyên tố, bạn cần sử dụng kích thước đơn vị lớn hơn tiếp theo.

Sau đó, chỉ cần lặp lại cơ sở hạ tầng, gán bot theo thứ tự cho các hàng và cột.

Để đặt bot, chỉ cần lặp qua cơ sở hạ tầng, gán cho mỗi bot một vị trí bù từ vị trí đơn vị theo số lượng được xác định bởi hàng và cột mà bot nằm trong (hoặc, đặt điểm đó làm mục tiêu cho chuyển động của bot).

Để tạo một đơn vị với trung tâm ở một góc , vị trí của bot được đưa ra bởi

unitPosition + tiêu đề * columnNumber * botSeparationDistance + rightVector * rowNumber * botSeparationDistance

Để tạo một đơn vị với trung tâm ở giữa , vị trí của bot được đưa ra bởi

unitPosition + tiêu đề * (columnNumber * unitSeparationDistance - 0,5 * (numberOfColumns * botSeparationDistance) + rightVector * rowNumber * botSeparationDistance - 0,5 * (numberOfRows * botSeparationDistance)

trong đó tiêu đề là một vectơ chỉ theo hướng mà đơn vị đang đối mặt và rightVector là một vectơ trực giao với tiêu đề .

botSeparationDistance có thể được điều chỉnh để làm cho các bot đứng cách xa nhau hoặc gần nhau hơn.

Nếu bạn cảm thấy thích thú, bạn có thể bù hàng bot cuối cùng bằng rightVector * 0,5 * (numberOfColumns - factNumberOfBotsInRow) để tập trung chúng vào đội hình .


Điều này rất gần với những gì tôi đang tìm kiếm! Sự bảo lưu duy nhất của tôi là khi gán các vị trí mới, một Bot ở bên phải của một hàng, có thể được gán ở bên trái của hàng tiếp theo trong hình chữ nhật mới, dẫn đến việc Bot phải di chuyển một quãng đường dài và trong các quy trình cản trở các bot khác cố gắng đạt đến vị trí được giao mới của riêng họ. Tôi lo lắng rằng khi một bot được thêm hoặc xóa, toàn bộ đội hình sẽ trở nên lộn xộn khi Bots hối hả và nhộn nhịp để đến đích xa xôi của họ.
Tiby312

2
Bạn luôn có thể tính toán các vị trí mới, sau đó di chuyển bot gần nhất đến vị trí đó thay vì thực hiện phép lặp tuyến tính.
Exilyth

Làm thế nào để làm điều này mà không kết thúc với một tính toán bình phương? Tôi phải tìm vị trí gần nhất trong mảng 2d từ vị trí hiện tại của chúng trong mảng 2d, cho mỗi Bot, nếu tôi hiểu chính xác điều này.
Tiby312

Trong mỗi lần lặp, một đơn vị sẽ được chỉ định (và do đó không cần phải xem xét các lần lặp tiếp theo), do đó thời gian chạy sẽ là O (n!). Mà, vẫn không tốt lắm. Sau đó, một lần nữa, xây dựng [cấu trúc tối ưu hóa lựa chọn] và thực hiện n truy vấn phạm vi cũng không nhanh. Điều duy nhất tôi có thể nghĩ đến lúc này là di chuyển những con bot cuối cùng ra phía sau hoặc lấp đầy những chỗ cuối cùng trong một hàng với những con bot từ phía sau.
Exilyth

Còn cái này thì sao. Nói rằng sự hình thành mới có kích thước hàng nhỏ hơn. Sau đó, trên mỗi hàng, bạn đã có thêm một bot. Bạn gán bot đó xuống, và một bên trái. Sau đó, ở hàng tiếp theo, bạn có hai Bots mà không có chỗ. Bạn chỉ định hai cái đó xuống và một cái bên trái. Sau đó, bạn có 3 bot mà không có một nơi. Tiếp tục cho đến khi bạn có thêm một hàng ở phía dưới. Tôi chỉ nhổ bóng ở đây. Tôi đã không nghĩ rằng tất cả các cách thông qua, nhưng có vẻ như nó sẽ hoạt động và nhanh chóng.
Tiby312

2

Tôi sẽ lưu trữ các vị trí có thể có trong một biểu đồ với giá trị lớn hơn là hình chữ nhật nhỏ hơn.

[4][3][2][1]
[3][3][2][1]
[2][2][2][1]
[1][1][1][1]

Mỗi khi robot được gỡ bỏ tìm kiếm mặc dù tất cả các robot khác và tìm thấy một trong một nút có giá trị nhỏ nhất. Sử dụng A * hoặc thuật toán BST để tìm cho nó một đường dẫn từ giá trị nhỏ nhất đến không gian trống. Nếu không có robot có giá trị nhỏ hơn loại bỏ thì không làm gì cả.

Bạn cũng có thể kiểm soát cách hình chữ nhật phân rã làm điều này. Ví dụ, trong biểu đồ bên dưới khi robot rời khỏi đáy từ bên cạnh sẽ đến chỗ của nó.

[4.9][3.8][2.7][1.0]
[4.8][3.7][2.6][1.0]
[3.9][3.6][2.5][1.0]
[3.5][3.4][2.4][1.0]
[2.9][2.8][2.3][1.0]
[2.0][2.1][2.2][1.0]
[1.9][1.8][1.7][1.0]
[1.6][1.5][1.4][1.0]

Ở đây, một ở 3,8 được loại bỏ để một ở 2,5 đến và lấp đầy vị trí của nó.

[o][x][o][ ]
[o][o][o][ ]
[o][o][r][ ]
[o][o][ ][ ]
[o][o][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]

Một vi dụ khac. Ở đây 2.8 được loại bỏ để nút 2.2 nhỏ nhất đi vào vị trí của nó.

[o][o][o][ ]
[o][o][o][ ]
[o][o][o][ ]
[o][o][o][ ]
[o][x][r][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]

Bạn có thể muốn một vòng các nút có giá trị 0 mà bạn không bao giờ cư trú ở bên ngoài để thuật toán tìm đường của bạn tìm ra lỗ hổng.

[0.0][0.0][0.0][0.0][0.0][0.0]
[0.0][4.9][3.8][2.7][1.0][0.0]
[0.0][4.8][3.7][2.6][1.0][0.0]
[0.0][3.9][3.6][2.5][1.0][0.0]
[0.0][3.5][3.4][2.4][1.0][0.0]
[0.0][2.9][2.8][2.3][1.0][0.0]
[0.0][2.0][2.1][2.2][1.0][0.0]
[0.0][1.9][1.8][1.7][1.0][0.0]
[0.0][1.6][1.5][1.4][1.0][0.0]
[0.0][0.0][0.0][0.0][0.0][0.0]

Một hướng dẫn tốt về A * có thể được tìm thấy ở đây .


Đây là một ý tưởng ngọt ngào, nhưng nếu tôi hiểu chính xác điều này, bạn đang cho phép các hình dạng không phải là hình chữ nhật hoàn hảo. Các hàng và cột trên đường viền có thể không đầy đủ. Tôi đã nghĩ rằng tôi có thể làm cho nó để nó luôn có đường viền hình chữ nhật, và thay vào đó thay đổi tỷ lệ khung hình một chút để đáp ứng yêu cầu này bằng cách thay đổi số lượng hàng và cột. Tôi đã có thể tính toán chiều rộng và chiều cao mới sẽ thực hiện được điều này, nhưng sau đó có một số cách phức tạp để gán lại các Bots cho Spot gần nhất..Tôi nghĩ.
Tiby312

@ Tiby312 Bạn dự định tạo một hình chữ nhật hoàn hảo như thế nào với ... 7 robot?
ClassicThunder

KHÔNG BAO GIỜ Tôi quên về số nguyên tố. Lấy làm tiếc. Nhưng tôi vẫn nghĩ rằng việc điều chỉnh số lượng hàng và cột có thể tránh được một hàng hoặc cột có số lượng Bots thấp bất thường trên đó.
Tiby312

@ Tiby312 Tôi nghĩ rằng bạn nên nhắm đến một tỷ lệ khung hình nhất quán (nghĩa là luôn luôn là 4: 3 hoặc 8: 5) hơn là cố gắng luôn biến nó thành một hình chữ nhật hoàn hảo.
corsiKa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.