Nhờ hỗ trợ code VBA ngẫu nhiên để ra kết quả xác định trước

Liên hệ QC

hoangtuchanlon

Thành viên mới
Tham gia
23/9/09
Bài viết
10
Được thích
1
mình có Cột A1:A116 là mã hàng hóa. Cột B1:B116 là cột số lượng món ăn tối đa được cho trước. Cột C1:C116 là cột số lượng được tính bằng randbetween(0,số lượng món tối đa. Cột D1 : D116 là đơn giá bán được cho sẵn ---> Mình muốn đặt code VBA thế nào để cho ra kết quả sao cho Sum (E1 : E116) gần bằng 8.582.400 (Chênh lệch không quá 12.000). Mình đã đặt code đơn giản nhưng chạy quá lâu, chưa thấy ra kết quả. Nên muốn nhờ anh chị hỗ trợ giùm!1588133444978.png
 
Mình xin phép up file nhé
 

File đính kèm

  • GPEX hỗ trợ.xlsb
    21 KB · Đọc: 11
Upvote 0
Lại báo cáo ma.

Đây là bài toán cổ điển "bài toán ba lô / knapsack" nới rộng hơn một chút. Tra wiki sẽ ra một đống.
Đối vói người khong có học toán số bậc đại học thì hơi khó một chút. Chịu khó lên mấy diễn đàn Toán mà hỏi.

Đối với người làm mò thì sắp xếp giá từ lớn đến nhỏ. Xong ròi thì bốc từ lớn đến nhỏ cho đến khi gần đáp số thì bắt đầu chỉnh.
Cái mẹo chính là lựa những con số thật nhỏ để làm bảng chỉnh. Ví dụ 1, 2, 3, 4, 5 thì có thể cho ta 1 đến 15.

Mà dữ liệu đưa lên hình là dữ liệu dỏm. Không có món nào giá có số lẻ 400 thì lấy đâu ra tổng với số lẻ ấy.
 
Lần chỉnh sửa cuối:
Upvote 0
Lại báo cáo ma.

Đây là bài toán cổ điển "bài toán ba lô / knapsack" nới rộng hơn một chút. Tra wiki sẽ ra một đống.
Đối vói người khong có học toán số bậc đại học thì hơi khó một chút. Chịu khó lên mấy diễn đàn Toán mà hỏi.

Đối với người làm mò thì sắp xếp giá từ lớn đến nhỏ. Xong ròi thì bốc từ lớn đến nhỏ cho đến khi gần đáp số thì bắt đầu chỉnh.
Cái mẹo chính là lựa những con số thật nhỏ để làm bảng chỉnh. Ví dụ 1, 2, 3, 4, 5 thì có thể cho ta 1 đến 15.

Mà dữ liệu đưa lên hình là dữ liệu dỏm. Không có món nào giá có số lẻ 400 thì lấy đâu ra tổng với số lẻ ấy.
Vì mình mới biết VBA có mấy ngày nên mình mới hỏi cách làm như thế nào. Mình cũng đọc Sumsubset nhưng không hiểu. Nên mới nhờ diễn đàn.
Còn bạn biết thì chỉ giùm mình. Mình cũng hiểu là còn số càng nhỏ thì tính toán càng nhanh, nhưng cứ thử lên diễn đàn hỏi xem biết đâu có ai đã từng làm để hướng dẫn
 
Upvote 0
Có đến 3 cách làm:
1. cách "làm nhanh". Tự fill với các số lớn càng nhiều càng tốt, ròi mới bù bằng các số nhỏ. Và điều chỉnh khi cần. Cách này hoàn toàn không random.
2. cách chậm hơn. Có random. Cách này lại chia ra 2 chách phụ:
2.1. Cách "hơi random": chia ra hai phần, phần fill bằng số lớn và phần fill bằng số nhỏ. Tỷ lệ chia cũng random, nhưng oahir đâp ứng là phần nhỏ phải fill đủ với số nhỏ.
2.2. Cách gần như "hoàn toàn random". Chạy từ đầu cho đến cuối. Nếun fill không đủ thì lại bổ sung phần dư lần nữa. Cho đến lúc ra kết quả.

Vì phải fill cho đủ nên không cách nào 100% random. Nếu tình cờ đủ thì chỉ là tình cờ đủ. Nguyên tắc của fill kanpsack là phải điều chỉnh.
 
Upvote 0
10 là quá đạt rồi.
Theo trung bình, một bàn tiệc có từ 6 đến 8 món khác nhau. 10 là phải kể thêm thức uống. Nhiều hơn nữa là tại các món ngọt, nhiều ngừoi gọi kem, bánh, ... tùm lum.

Báo cáo ma thì cũng nên gần thực tế 1 chút. :p
 
Upvote 0
Cột C có 115 dòng, trong đó có 10 món <>0, còn lại = 0 là có đạt hay không?
(Tất nhiên là C<= B )
Đạt bạn ạ, nó random miễn là kết quả Sum(E1:E117) gần bằng với yêu cầu đặt ra bạn ạ
Bài đã được tự động gộp:

Có đến 3 cách làm:
1. cách "làm nhanh". Tự fill với các số lớn càng nhiều càng tốt, ròi mới bù bằng các số nhỏ. Và điều chỉnh khi cần. Cách này hoàn toàn không random.
2. cách chậm hơn. Có random. Cách này lại chia ra 2 chách phụ:
2.1. Cách "hơi random": chia ra hai phần, phần fill bằng số lớn và phần fill bằng số nhỏ. Tỷ lệ chia cũng random, nhưng oahir đâp ứng là phần nhỏ phải fill đủ với số nhỏ.
2.2. Cách gần như "hoàn toàn random". Chạy từ đầu cho đến cuối. Nếun fill không đủ thì lại bổ sung phần dư lần nữa. Cho đến lúc ra kết quả.

Vì phải fill cho đủ nên không cách nào 100% random. Nếu tình cờ đủ thì chỉ là tình cờ đủ. Nguyên tắc của fill kanpsack là phải điều chỉnh.
cám ơn bạn đã thông tin lại nhé. để mình xem VBA không biết viết như nào cho nó nhanh vì mình mới biết VBA có mấy ngày à
 
Upvote 0
@hoangtuchanlon
Hic, đại tiệc đi bạn.
Mở file đính kèm, chạy solver
Bài đã được tự động gộp:

@hoangtuchanlon
Có thể lựa chọn trong muc To: Max hoặc Min hoặc value of rồi nhập số vào rồi chạy. Kết quả thu được có thể sẽ khác nhau, số món cũng khác nhau
 

File đính kèm

  • Copy of GPEX hỗ trợ.xlsb
    19.4 KB · Đọc: 16
Lần chỉnh sửa cuối:
Upvote 0
Ngoài lề chút:
Báo cáo kiểu này thì không phải là báo cáo cho chủ rồi. Nó chỉ cần so với số liệu mua vào là ra ngay.
Sở Thuế cũng có thể tìm ra bằng cách so sánh. Nhưng chưa chắc có thằng nào ở sở thuế đã biết cách làm, hoặc siêng đủ để làm. Cũng có khi sếp sở thuế đã đi "đếm món ăn" (dưới gầm bàn/ under the table) với chủ rồi nên bỏ qua.
 
Upvote 0
Ngoài lề chút:
Báo cáo kiểu này thì không phải là báo cáo cho chủ rồi. Nó chỉ cần so với số liệu mua vào là ra ngay.
Sở Thuế cũng có thể tìm ra bằng cách so sánh. Nhưng chưa chắc có thằng nào ở sở thuế đã biết cách làm, hoặc siêng đủ để làm. Cũng có khi sếp sở thuế đã đi "đếm món ăn" (dưới gầm bàn/ under the table) với chủ rồi nên bỏ qua.
Mình phải làm lại sổ sách cho 1 công ty bạn à vì bạn kết toán trước không bàn giao lại. Đầu vào đầu ra đều kê khai đúng chỉ là không có bảng kê bill nên mới phải làm như vậy
Bài đã được tự động gộp:

@hoangtuchanlon
Hic, đại tiệc đi bạn.
Mở file đính kèm, chạy solver
Bài đã được tự động gộp:

@hoangtuchanlon
Có thể lựa chọn trong muc To: Max hoặc Min hoặc value of rồi nhập số vào rồi chạy. Kết quả thu được có thể sẽ khác nhau, số món cũng khác nhau
Cám ơn bạn nhiều nhé, để mình mở file xem nhé. Tiện thể mình có 1 file VBA ở trên mạng của 1 bạn giải bài toán "Sumsubset", mình không hiểu gì hết. Không biết có áp dụng được vào tình huống này của mình không nhỉ. Mong bạn xem giùm nhé
 

File đính kèm

  • subset_sum_case1.xls
    55 KB · Đọc: 8
Upvote 0
Cái này hình như là quy hoạch động đúng không bác @VetMini . Dùng đệ quy không biết có bị tràn stack không
 
Upvote 0
Mình phải làm lại sổ sách cho 1 công ty bạn à vì bạn kết toán trước không bàn giao lại. Đầu vào đầu ra đều kê khai đúng chỉ là không có bảng kê bill nên mới phải làm như vậy
Bài đã được tự động gộp:


Cám ơn bạn nhiều nhé, để mình mở file xem nhé. Tiện thể mình có 1 file VBA ở trên mạng của 1 bạn giải bài toán "Sumsubset", mình không hiểu gì hết. Không biết có áp dụng được vào tình huống này của mình không nhỉ. Mong bạn xem giùm nhé
code trong file là của tác giả trong đường dẫn bên dưới. Bạn liên lạc thử xem
.
---
Dạng bài của bạn chắc có nhiều cách giải quyết.
Nếu dùng VBA thì có lẽ phải code theo cách khác
 
Upvote 0
code trong file là của tác giả trong đường dẫn bên dưới. Bạn liên lạc thử xem
.
---
Dạng bài của bạn chắc có nhiều cách giải quyết.
Nếu dùng VBA thì có lẽ phải code theo cách khác
Cám ơn bạn rất nhiều nhé! Mình sẽ liên lạc ngay!
 
Upvote 0
Cái này hình như là quy hoạch động đúng không bác @VetMini . Dùng đệ quy không biết có bị tràn stack không
Cỡ dữ liệu này thì có thể, còn tuỳ theo tham bạn đưa vào là byVal hay byRef. Và còn tuỳ theo số mảng bạn tạo bên trong code. Mỗi lần gọi stack phải chép lại tất cả các biến bạn tạo ra trong hàm. Vài cái mảng lớn là tràn stack dễ dàng.
 
Upvote 0
Cỡ dữ liệu này thì có thể, còn tuỳ theo tham bạn đưa vào là byVal hay byRef. Và còn tuỳ theo số mảng bạn tạo bên trong code. Mỗi lần gọi stack phải chép lại tất cả các biến bạn tạo ra trong hàm. Vài cái mảng lớn là tràn stack dễ dàng.
Mảng thì luôn là byref mà bác, gọi bằng byval thì vba cũng không copy cả mảng vào stack đâu.
 
Upvote 0
Web KT

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

Back
Top Bottom