[ Trợ giúp ] Tối ưu số lần thao tác công việc

Liên hệ QC

cuongbui

Thành viên mới
Tham gia
22/11/07
Bài viết
31
Được thích
13
Sau một thời gian lục tìm trên diễn đàn các ví dụ về tối ưu nhưng chưa tìm ra được cách giải quyết vấn đề này.
Mong các anh chị em trên diễn đàn GPE giúp em có một định hướng hoặc hướng dẫn để giải bài toán dưới đây.


View attachment 269608
 

File đính kèm

  • Toi uu so lan thuc hien.xlsx
    14.7 KB · Đọc: 22
  • 1637820767975.png
    1637820767975.png
    138.8 KB · Đọc: 196
Lần chỉnh sửa cuối:
Sau một thời gian lục tìm trên diễn đàn các ví dụ về tối ưu nhưng chưa tìm ra được cách giải quyết vấn đề này.
Mong các anh chị em trên diễn đàn GPE giúp em có một định hướng hoặc hướng dẫn để giải bài toán dưới đây.

View attachment 269610
View attachment 269608
"Số lớp định trước" & "Số lớp thực tế" có liên hệ gì với nhau hay không?
 
Upvote 0
Sau một thời gian lục tìm trên diễn đàn các ví dụ về tối ưu nhưng chưa tìm ra được cách giải quyết vấn đề này.
Mong các anh chị em trên diễn đàn GPE giúp em có một định hướng hoặc hướng dẫn để giải bài toán dưới đây.

View attachment 269610
View attachment 269608
Dùng công cụ Solve của Excel, kết quả có thể chưa tối ưu
Muốn tối ưu nhờ người khác viết code VBA vét cạn các tổ hợp thao tác
 

File đính kèm

  • Toi uu so lan thuc hien.xlsx
    15 KB · Đọc: 15
Upvote 0
"Số lớp định trước" & "Số lớp thực tế" có liên hệ gì với nhau hay không?
Không ảnh hưởng gì anh ạ. Số định trước là số đặt ra cho làm việc bình thường để hoàn thành công việc. Em muốn nhập tăng số lớp đó lên để hoàn thành sớm hơn ạ
Bài đã được tự động gộp:

Dùng công cụ Solve của Excel, kết quả có thể chưa tối ưu
Muốn tối ưu nhờ người khác viết code VBA vét cạn các tổ hợp thao tác
Như thế này là xong rồi anh. A có thể nói cụ thể hơn, hướng dẫn em dùng solve được không
Bài đã được tự động gộp:

Dùng công cụ Solve của Excel, kết quả có thể chưa tối ưu
Muốn tối ưu nhờ người khác viết code VBA vét cạn các tổ hợp thao tác
1637888503419.png
Cám ơn anh , em đã hiểu rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có chắc đây là kết quả mà bạn muốn không? Giả sử có phương án chỉ cần 4 lần thao tác nhưng số còn phải làm bằng 1 thì có gọi là "ưu" hơn không?
 
Upvote 0
Hi mọi người, tôi có 1 bảng dữ liệu, cột cuối lấy giá trị khi cột phía trước khi cột phía trước khác không, hiện tôi đang dùng hàm if nhưng vì bảng dữ liệu rất lớn nên dùng hàm if thấy không thuận tiện và làm file nặng lên. Vậy nếu tôi không muốn sử dụng hàm if thì dùng hàm gì. Rất mong mọi người giúp đỡ. Thank for help
 

File đính kèm

  • Lay GT khac khong.xls
    39 KB · Đọc: 6
Upvote 0
Bạn có chắc đây là kết quả mà bạn muốn không? Giả sử có phương án chỉ cần 4 lần thao tác nhưng số còn phải làm bằng 1 thì có gọi là "ưu" hơn không?
Như này thì càng tối ưu hơn. Em chấp nhận số còn phải làm của mỗi loại có thể <= 5 . A có cách giải khác ạ ?
Bài đã được tự động gộp:

Hi mọi người, tôi có 1 bảng dữ liệu, cột cuối lấy giá trị khi cột phía trước khi cột phía trước khác không, hiện tôi đang dùng hàm if nhưng vì bảng dữ liệu rất lớn nên dùng hàm if thấy không thuận tiện và làm file nặng lên. Vậy nếu tôi không muốn sử dụng hàm if thì dùng hàm gì. Rất mong mọi người giúp đỡ. Thank for help
Nếu dữ liệu của bạn chỉ xuất hiện 1 lần trong 1 cột thì tại ô G4 = =CONCAT(B4:F4)
Ô màu vàng đầu tiên ấy
 
Lần chỉnh sửa cuối:
Upvote 0
Như này thì càng tối ưu hơn. Em chấp nhận số còn phải làm của mỗi loại có thể <= 5 . A có cách giải khác ạ ?
Tôi chỉ muốn lưu ý bạn về cách đặt vấn đề thôi. Có con số 5 này thì mọi thứ mới rõ ràng. Còn yêu cầu giải quyết được bằng solve thì cứ dùng solve thôi.
 
Upvote 0
Dùng công cụ Solve của Excel, kết quả có thể chưa tối ưu
Muốn tối ưu nhờ người khác viết code VBA vét cạn các tổ hợp thao tác
Sao em dùng Slove nhưng không thể tối ưu bằng của anh. Số lần thao tác vẫn nhiều hơn của anh @HieuCD
 

File đính kèm

  • Toi uu so lan thuc hien.xlsx
    19.7 KB · Đọc: 4
Upvote 0
Upvote 0
Thuật toán:
  1. Chọn kích cỡ xuất hiện trong ít lần thao tác nhất (kích cỡ F).
  2. Kiểm tra các trường hợp kết hợp Số lớp thực tế của các lần thao tác có xuất hiện kích cỡ được chọn (kích cỡ F xuất hiện ở lần 2, 4, 8) để tổng sản phầm làm được thỏa điều kiện (Ví dụ: 200, 29, 1).
  3. Đối với từng trường hợp ở (2): Loại bỏ các lần thao tác có xuất hiện kích cỡ vừa chọn và tiếp tục xét kích cỡ có số lần thao tác còn lại ít nhất (kích cỡ B).
  4. Kiểm tra các trường hợp kết hợp Số lớp thực tế của các lần thao tác có xuất hiện kích cỡ được chọn (kích cỡ B còn xuất hiện ở lần 1, 3, 5, 6, 7) để tổng sản phầm làm được thỏa điều kiện (Ví dụ: 200, 200, 3, 0, 1).
  5. Đối với từng trường hợp ở (4): Loại bỏ các lần thao tác có xuất hiện kích cỡ vừa chọn và tiếp tục xét kích cỡ có số lần thao tác còn lại ít nhất.
  6. Kiểm tra các trường hợp kết hợp Số lớp thực tế của các lần thao tác có xuất hiện kích cỡ được chọn để tổng sản phầm làm được thỏa điều kiện.
  7. Thực hiện lần lượt cho đến khi xét hết các kích cỡ.
  8. Khi xét đến kích cỡ cuối cùng, so sánh phương án hiện tại với phương án tối ưu tại thời điểm hiện tại, nếu phương án hiện tại tốt hơn phương án tối ưu đến thời điểm hiện tại thì lưu phương án hiện tại thành phương án tối ưu tại thời điểm hiện tại.
  9. Trong quá trình xét các trường hợp ở các bước 2, 4, 6, ..., nếu số lần thao tác của trường hợp đang xét lớn hơn số lần thao tác của phương án tối ưu hoặc tổng số sản phẩm đã làm nhiều hơn tổng số sản phẩm phải làm vượt quá giới hạn cho phép ở bất kỳ kích cỡ nào thì bỏ qua để cải thiện tốc độ.
 
Upvote 0
Thuật toán:
  1. Chọn kích cỡ xuất hiện trong ít lần thao tác nhất (kích cỡ F).
  2. Kiểm tra các trường hợp kết hợp Số lớp thực tế của các lần thao tác có xuất hiện kích cỡ được chọn (kích cỡ F xuất hiện ở lần 2, 4, 8) để tổng sản phầm làm được thỏa điều kiện (Ví dụ: 200, 29, 1).
  3. Đối với từng trường hợp ở (2): Loại bỏ các lần thao tác có xuất hiện kích cỡ vừa chọn và tiếp tục xét kích cỡ có số lần thao tác còn lại ít nhất (kích cỡ B).
  4. Kiểm tra các trường hợp kết hợp Số lớp thực tế của các lần thao tác có xuất hiện kích cỡ được chọn (kích cỡ B còn xuất hiện ở lần 1, 3, 5, 6, 7) để tổng sản phầm làm được thỏa điều kiện (Ví dụ: 200, 200, 3, 0, 1).
  5. Đối với từng trường hợp ở (4): Loại bỏ các lần thao tác có xuất hiện kích cỡ vừa chọn và tiếp tục xét kích cỡ có số lần thao tác còn lại ít nhất.
  6. Kiểm tra các trường hợp kết hợp Số lớp thực tế của các lần thao tác có xuất hiện kích cỡ được chọn để tổng sản phầm làm được thỏa điều kiện.
  7. Thực hiện lần lượt cho đến khi xét hết các kích cỡ.
  8. Khi xét đến kích cỡ cuối cùng, so sánh phương án hiện tại với phương án tối ưu tại thời điểm hiện tại, nếu phương án hiện tại tốt hơn phương án tối ưu đến thời điểm hiện tại thì lưu phương án hiện tại thành phương án tối ưu tại thời điểm hiện tại.
  9. Trong quá trình xét các trường hợp ở các bước 2, 4, 6, ..., nếu số lần thao tác của trường hợp đang xét lớn hơn số lần thao tác của phương án tối ưu hoặc tổng số sản phẩm đã làm nhiều hơn tổng số sản phẩm phải làm vượt quá giới hạn cho phép ở bất kỳ kích cỡ nào thì bỏ qua để cải thiện tốc độ.
Cám ơn anh rất nhiệt tình. Em sẽ suy nghĩ theo hướng này
 
Upvote 0
Upvote 0
Không biết bạn triển khai đến đâu rồi. Nếu đã hoàn thành thì nên gửi code lên để những người gặp vấn đề tương tự có code để tham khảo.
Em vẫn dùng Slove thôi, chứ trình code chưa đủ ạ, cũng ngồi viết thử mà không làm nổi. Hiện tại với slove thì đang ổn
 
Upvote 0
Em vẫn dùng Slove thôi, chứ trình code chưa đủ ạ, cũng ngồi viết thử mà không làm nổi. Hiện tại với slove thì đang ổn
Cấu trúc lại bảng dữ liệu sheet2, dùng solver vét cạn các khả năng thỏa nghiệm hệ phương trình bậc 1, kết quả vẫn 8 bước
Mã:
Option Explicit
Sub Main()
  Dim sArr(), aDK(), arr, rngTT As Range, rng As Range, tmp$
  Dim K&, sRow&, sR&, j&, i&, r&, iR&, t#
  Const xMax& = 200
t = Timer
  Application.ScreenUpdating = False
  ThisWorkbook.Worksheets("Sheet2").Activate
  aDK = Range("D2:I2").Value
  sArr = Range("D10:I19").Value
  sRow = UBound(sArr)
  Call SoBuocMin(sArr, aDK, K, sRow, xMax)
  Range("C10").Resize(sRow).ClearContents
  Set rngTT = Range("C10").Resize(sRow)
  For j = K To sRow
    arr = Tohop_N_Chap_K(sRow, j)
    sR = UBound(arr)
    Set rng = Range("L10").Resize(j)
    For i = 1 To sR
      rng = 0: iR = 0
      tmp = arr(i, 1)
      rngTT.ClearContents
      For r = 1 To sRow
        If Mid(tmp, r, 1) = "1" Then
          iR = iR + 1
          rngTT(r, 1).Formula = "=" & rng(iR, 1).Address
        End If
      Next r
      If i = 1 Then Call SolverVBA(rng.Address) Else SolverSolve True
      If Range("L4").Value = 0 Then MsgBox Timer - t & "  Giay": Exit Sub
    Next i
  Next j
  Application.ScreenUpdating = True
End Sub

Private Function Tohop_N_Chap_K(ByVal N As Integer, ByVal K As Integer) As Variant
  'Tao to hop N chap K, bieu dien bang chuoi các ký tu "0" va "1"
  'Thu tu gia tri "1" là thu tu du lieu nguon lay du lieu
  Dim arr() As String, tmp$, j&, p&, s&
  ReDim arr(1 To Application.Combin(N, K), 1 To 1)
  tmp = String(K, "1") & String(N - K, "0")
  p = 1: arr(p, 1) = tmp
  If K = N Then Tohop_N_Chap_K = arr: Exit Function
  Do
    j = InStrRev(tmp, "1")
    Mid(tmp, j, 1) = "0"
    Mid(tmp, j + 1, s + 1) = String(s + 1, "1")
    s = 0: p = p + 1:   arr(p, 1) = tmp
    If InStr(j + 1, tmp, "0") = 0 Then
      s = N - j
      Mid(tmp, j + 1, s) = String(s, "0")
    End If
  Loop Until s = K
  Tohop_N_Chap_K = arr
End Function

Private Sub SoBuocMin(sArr, aDK, K, sRow, xMax)
  Dim arr(), i&, j&, tmp#
  For j = 1 To 6
    tmp = 0
    Range("C10:C19").Offset(, j).Sort Range("C10").Offset(, j), 1, Header:=xlNo
    arr = Range("C10:C19").Offset(, j).Value
    For i = 1 To sRow
      tmp = tmp + arr(i, 1) * xMax
      If tmp >= aDK(1, j) Then Exit For
    Next i
    If K < i Then K = i
  Next j
  If K > sRow Then K = sRow
  Range("D10:I19").Value = sArr
End Sub

Private Sub SolverVBA(ByVal ChangeCells$)
  SolverReset
  SolverOk SetCell:="$L$4", MaxMinVal:=2, ValueOf:=0, ByChange:=ChangeCells, _
    Engine:=2, EngineDesc:="Simplex LP"
  SolverAdd CellRef:="$D$4:$I$4", Relation:=2, FormulaText:="0"
  SolverAdd CellRef:=ChangeCells, Relation:=3, FormulaText:="0"
  SolverAdd CellRef:=ChangeCells, Relation:=1, FormulaText:="200"
  SolverAdd CellRef:=ChangeCells, Relation:=4, FormulaText:="integer"
  SolverSolve True
End Sub
Nếu code bị lổi, trong màn hình VBA chọn menu Tool chọn reference, tìm và tích chọn slolve
1638771724545.png
 

File đính kèm

  • Toi uu so lan thuc hien.xlsm
    32.6 KB · Đọc: 15
Upvote 0
@ thớt:
Kết quả có giảm được nữa hay không thì chưa thử.
Với điều kiện K4 : P4 <= 5, chạy solver kết quả là 6 lớp
 

File đính kèm

  • Toiuu solan thuchien_solver_1.xlsx
    17.2 KB · Đọc: 14
Upvote 0
Cấu trúc lại bảng dữ liệu sheet2, dùng solver vét cạn các khả năng thỏa nghiệm hệ phương trình bậc 1, kết quả vẫn 8 bước
Mã:
Option Explicit
Sub Main()
  Dim sArr(), aDK(), arr, rngTT As Range, rng As Range, tmp$
  Dim K&, sRow&, sR&, j&, i&, r&, iR&, t#
  Const xMax& = 200
t = Timer
  Application.ScreenUpdating = False
  ThisWorkbook.Worksheets("Sheet2").Activate
  aDK = Range("D2:I2").Value
  sArr = Range("D10:I19").Value
  sRow = UBound(sArr)
  Call SoBuocMin(sArr, aDK, K, sRow, xMax)
  Range("C10").Resize(sRow).ClearContents
  Set rngTT = Range("C10").Resize(sRow)
  For j = K To sRow
    arr = Tohop_N_Chap_K(sRow, j)
    sR = UBound(arr)
    Set rng = Range("L10").Resize(j)
    For i = 1 To sR
      rng = 0: iR = 0
      tmp = arr(i, 1)
      rngTT.ClearContents
      For r = 1 To sRow
        If Mid(tmp, r, 1) = "1" Then
          iR = iR + 1
          rngTT(r, 1).Formula = "=" & rng(iR, 1).Address
        End If
      Next r
      If i = 1 Then Call SolverVBA(rng.Address) Else SolverSolve True
      If Range("L4").Value = 0 Then MsgBox Timer - t & "  Giay": Exit Sub
    Next i
  Next j
  Application.ScreenUpdating = True
End Sub

Private Function Tohop_N_Chap_K(ByVal N As Integer, ByVal K As Integer) As Variant
  'Tao to hop N chap K, bieu dien bang chuoi các ký tu "0" va "1"
  'Thu tu gia tri "1" là thu tu du lieu nguon lay du lieu
  Dim arr() As String, tmp$, j&, p&, s&
  ReDim arr(1 To Application.Combin(N, K), 1 To 1)
  tmp = String(K, "1") & String(N - K, "0")
  p = 1: arr(p, 1) = tmp
  If K = N Then Tohop_N_Chap_K = arr: Exit Function
  Do
    j = InStrRev(tmp, "1")
    Mid(tmp, j, 1) = "0"
    Mid(tmp, j + 1, s + 1) = String(s + 1, "1")
    s = 0: p = p + 1:   arr(p, 1) = tmp
    If InStr(j + 1, tmp, "0") = 0 Then
      s = N - j
      Mid(tmp, j + 1, s) = String(s, "0")
    End If
  Loop Until s = K
  Tohop_N_Chap_K = arr
End Function

Private Sub SoBuocMin(sArr, aDK, K, sRow, xMax)
  Dim arr(), i&, j&, tmp#
  For j = 1 To 6
    tmp = 0
    Range("C10:C19").Offset(, j).Sort Range("C10").Offset(, j), 1, Header:=xlNo
    arr = Range("C10:C19").Offset(, j).Value
    For i = 1 To sRow
      tmp = tmp + arr(i, 1) * xMax
      If tmp >= aDK(1, j) Then Exit For
    Next i
    If K < i Then K = i
  Next j
  If K > sRow Then K = sRow
  Range("D10:I19").Value = sArr
End Sub

Private Sub SolverVBA(ByVal ChangeCells$)
  SolverReset
  SolverOk SetCell:="$L$4", MaxMinVal:=2, ValueOf:=0, ByChange:=ChangeCells, _
    Engine:=2, EngineDesc:="Simplex LP"
  SolverAdd CellRef:="$D$4:$I$4", Relation:=2, FormulaText:="0"
  SolverAdd CellRef:=ChangeCells, Relation:=3, FormulaText:="0"
  SolverAdd CellRef:=ChangeCells, Relation:=1, FormulaText:="200"
  SolverAdd CellRef:=ChangeCells, Relation:=4, FormulaText:="integer"
  SolverSolve True
End Sub
Nếu code bị lổi, trong màn hình VBA chọn menu Tool chọn reference, tìm và tích chọn slolve
View attachment 270003
Cám anh đã bỏ thời gian công sức viết code. Chúc a luôn vui vẻ
 
Upvote 0
Web KT

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

Back
Top Bottom