Tạo thuật toán tất cả các điểm lưới bên trong một hypercube


8

Vấn đề xuất phát trực tiếp từ toán học tính toán và có thể là nêu như sau:

Cho ma trận thông thường , tìm hiệu quả tất cả các vectơ sao cho \ n {Mv} \ leq1 , trong đó \ n {Mv} là thành phần tối đa của vectơ trong mô đun. v Z dM v 1 M v MRd×dvZdMv1Mv

Tôi đưa ra một thuật toán bên dưới, nhưng nó rất không hiệu quả, vì nó có nhiều bước hơn số lượng điểm lưới. Nó vẫn có thể chịu được cho d=5 trong trường hợp của tôi, nhưng nó hoàn toàn thất bại với d=6 , tôi không có nhiều thời gian đó; hơn nữa, tôi cũng muốn thực hiện một số công việc trên các kích thước cao hơn.


Thuật toán hiện tại của tôi dựa trên các điều sau (từ chối trách nhiệm: chứa nhiều toán học hơn): Đầu tiên, tính toán M1 . Sau đó, chúng tôi quan sát rằng vM1MvM1 . Điều này có nghĩa là chúng ta có thể tính L=floorM1 và sau đó thử tất cả các vectơ v{L,L+1,,L1,L}d ; có chính xác (2L+1)d trong số họ. (Và đây là vấn đề: nếu d=6L=18 , tôi nhận được 2.5E9 lần lặp, đó là các đơn đặt hàng có cường độ lớn hơn số điểm tôi nghĩ có.)


1
Bạn đã xem xét việc xây dựng vấn đề của mình như một chương trình tuyến tính nguyên và sau đó đếm các giải pháp? Tôi nghĩ rằng có các phương thức có sẵn trong bộ giải IP (ví dụ CPLEX) để làm điều này, nhưng tôi không biết chúng nhanh như thế nào trong thực tế. Một phương pháp để làm như vậy được gọi là Thuật toán của Barvinok.
Thương hiệu Cornelius

@ C.Brand Cảm ơn, tôi sẽ xem xét nó (tuy nhiên, đã lâu rồi kể từ lần cuối tôi nhìn thấy bất kỳ LP / IP nào). Trong mọi trường hợp, bạn có biết liệu điều này có mặt trong SageMath không?
yo '

Đối với mối quan tâm của bạn, công thức ban đầu của vấn đề đã (gần như) một chương trình số nguyên; điều duy nhất bạn sẽ phải quan tâm là việc sử dụng (phi tuyến tính) -norm. Nhưng tôi không biết liệu một thuật toán đếm các giải pháp IP có sẵn trong SageMath hay không.
Thương hiệu Cornelius

Câu trả lời:


3

Dưới đây là một cách khác để nhìn vào vấn đề: Bạn có một mạng được tạo ra bởi các cột của . Sử dụng thuật toán LenstraTHER Lenstra tội Lovász (LLL) để thu được cơ sở rút gọn của mạng này. Nếu bạn thay thế bằng một ma trận mới được hình thành bởi đầu ra của LLL, thì các cột của vẫn sẽ tạo ra cùng một mạng, nhưng các vectơ cơ sở sẽ gần với trực giao với nhau hơn và các mục của nên có cường độ nhỏ hơn.M M M - 1MMMM1

Từ đó, nó cũng sẽ giúp ràng buộc từng thành phần của một cách riêng biệt: tức là bạn có thể ràng buộc thành phần thứbởi. (Nhân tiện, ràng buộc là không chính xác; chúng ta cần sử dụng tổng các phần tử trên mỗi hàng, không phải tối đa.)vi|vi|j=1d|(M1)ij|vM1

Đối với các giá trị lên đến khoảng 30, thuật toán LLL sẽ hoàn thành thực tế ngay lập tức. Tiệm, phải mất , vì vậy nó sẽ làm chậm cho rất lớn , nhưng đồng thời số điểm chúng ta cần phải kiểm tra phát triển theo cấp số nhân trong , vì vậy thời gian chạy của LLL là không thực sự nút cổ chai. Mặt khác, sự tiết kiệm về số lượng điểm cần kiểm tra có thể rất lớn. Tôi đã viết một số mã GAP để tạo ma trận ngẫu nhiên (ngẫu nhiên) ngẫu nhiên và so sánh các giới hạn trên các thành phần củadO(d6)ddMv rằng chúng tôi có được bằng cách sử dụng cơ sở ban đầu, so với cơ sở giảm LLL (Nhân tiện, chúng tôi không cần phải giả sử rằng ma trận là thường xuyên; tôi đã thực hiện hạn chế này chỉ vì đây là trường hợp trong ứng dụng của bạn):

d: = 8;
M: = Danh tínhMat (d);
cho tôi trong [1..d] làm
  cho j trong [1..d] làm
    M [i] [j]: = Ngẫu nhiên ([- 10 ^ 8..10 ^ 8]);
  od;
  M [i]: = M [i] / Tổng (M [i]);
od;
L: = LLLReducesBocation (M) .bocation;
MM: = M ^ -1 * 1.0;
LL: = L ^ -1 * 1.0;
cho tôi trong [1..d] làm
  cho j trong [1..d] làm
    MM [i] [j]: = MM [i] [j] * SignFloat (MM [i] [j]);
    LL [i] [j]: = LL [i] [j] * SignFloat (LL [i] [j]);
  od;
od;

In ("Giới hạn cho cơ sở ban đầu:");
những cái: = [1..d] * 0 + 1;
v: = MM * cái;
cho tôi trong [1..d] làm
  v [i]: = Int (Tầng (v [i]));
  In (v [i]);
  In ("");
od;
In ("\ n (");
In (Sản phẩm (v * 2 + 1));
In ("điểm cần kiểm tra) \ n");

In ("Giới hạn cho cơ sở LLL:");
v: = LL * cái;
cho tôi trong [1..d] làm
  v [i]: = Int (Tầng (v [i]));
  In (v [i]);
  In ("");
od;
In ("\ n (");
In (Sản phẩm (v * 2 + 1));
In ("điểm cần kiểm tra) \ n");

Đầu ra sau (dựa trên hạt giống ngẫu nhiên mặc định, với ) không phải là không điển hình:d=8

Giới hạn cho cơ sở ban đầu: 9 23 24 4 23 16 23 4 
(258370076349 điểm để kiểm tra)
Giới hạn cho cơ sở LLL: 3 3 2 2 3 4 2 3 
(2701125 điểm để kiểm tra)

Chỉnh sửa : Vấn đề này là một trường hợp đặc biệt của vấn đề chung về liệt kê các điểm mạng trong đa giác lồi, hóa ra đây là một vấn đề được nghiên cứu kỹ lưỡng và có nhiều thuật toán hiệu quả hơn so với mô tả ở trên. Xem bài viết này để khảo sát.


Tôi đã nghĩ đến việc có được một cơ sở tốt của lưới trước tiên, nhưng tôi không chắc nó hiệu quả như thế nào trong các kích thước cao? (Lưu ý: Vấn đề hiện tại không thú vị đối với tôi vì chúng tôi đã xoay sở hoàn toàn, nhưng tôi sẽ cố gắng theo dõi câu hỏi này.)
yo '

Tôi đã thêm một số chi tiết vào câu trả lời của mình, với một số thông tin về hiệu quả của LLL, cũng như mã ví dụ và đầu ra.
Brent Kerby
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.