[Help] Tìm 3 giá trị cố định sao cho kết quả TRUE là nhiều nhất (2 người xem)

Liên hệ QC

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

dohangminhtri

Thành viên mới
Tham gia
18/7/18
Bài viết
25
Được thích
3
Mình có thắc mắc như trong file dưới đây , cũng ko biết đặt câu hỏi tìm lệnh như thế nào cho phù hợp . Mong mọi người xem qua và giúp đỡ .Tks!
"Tìm 3 giá trị X,Y,Z sao cho kết quả "TRUE" nhiều nhất "
Edited : 20<X,Y,Z<200 ; X,Y,Z : số nguyên
 

File đính kèm

Lần chỉnh sửa cuối:
Mình có thắc mắc như trong file dưới đây , cũng ko biết đặt câu hỏi tìm lệnh như thế nào cho phù hợp . Mong mọi người xem qua và giúp đỡ .Tks!
"Tìm 3 giá trị X,Y,Z sao cho kết quả "TRUE" nhiều nhất "
Edited : 20<X,Y,Z<200
Gỏ tay loạn cào cào kết quả ra 5 là dừng, khỏi code két cho mệt
 
Có 3 số x, y, z mà, nhập thử lớn nhất, nhỏ nhất, xáo xào trở tới lui
chỉ có 3 biến số đó thôi , nhưng điều kiện là TRUE nhiều nhất , và ko chỉ có 8 ván . giả sử tổng hợp theo giải cờ vua hơn 500 ván , thì sao mà nhập tay nổi để true lớn nhất
 
chỉ có 3 biến số đó thôi , nhưng điều kiện là TRUE nhiều nhất , và ko chỉ có 8 ván . giả sử tổng hợp theo giải cờ vua hơn 500 ván , thì sao mà nhập tay nổi để true lớn nhất
Thử code
Mã:
Sub HeSo()
  Dim Arr(1 To 1, 1 To 3), Res(1 To 1, 1 To 3)
  Dim i, n, x, y, Z, tmp, tMax, Win
  Const iMin = 20
  Const iMax = 200
  i = Range("A65000").End(xlUp).Row
  If i < 3 Then MsgBox ("????"): Exit Sub
  Win = Application.CountIf(Range("B3:B" & i), "Win")
  tmp = Application.CountA(Range("B3:B" & i)) - Win
  If Win < tmp Then Win = tmp
  Application.ScreenUpdating = False
  For n = 2 To iMax - iMin
    t = Int((iMax - iMin) / n)
    For x = iMin To iMax Step t
      If iMax - x < t Then x = iMax
      Arr(1, 1) = x
      For y = iMin To iMax Step t
        If iMax - y < t Then y = iMax
        Arr(1, 2) = y
        For Z = iMin To iMax Step t
          If iMax - Z < t Then Z = iMax
          Arr(1, 3) = Z
          Range("Q3:S3") = Arr
          tmp = Range("T3").Value
          If tMax < tmp Then
            tMax = tmp
            Res(1, 1) = Arr(1, 1): Res(1, 2) = Arr(1, 2): Res(1, 3) = Arr(1, 3)
            If tMax = Win Then GoTo Thoat
          End If
        Next Z
      Next y
    Next x
  Next n
Thoat:
  Range("Q3:S3") = Res
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Thử code
Mã:
Sub HeSo()
  Dim Arr(1 To 1, 1 To 3), Res(1 To 1, 1 To 3)
  Dim i, n, x, y, Z, tmp, tMax, Win
  Const iMin = 20
  Const iMax = 200
  i = Range("A65000").End(xlUp).Row
  If i < 3 Then MsgBox ("????"): Exit Sub
  Win = Application.CountIf(Range("B3:B" & i), "Win")
  tmp = Application.CountA(Range("B3:B" & i)) - Win
  If Win < tmp Then Win = tmp
  Application.ScreenUpdating = False
  For n = 2 To iMax - iMin
    t = Int((iMax - iMin) / n)
    For x = iMin To iMax Step t
      If iMax - x < t Then x = iMax
      Arr(1, 1) = x
      For y = iMin To iMax Step t
        If iMax - y < t Then y = iMax
        Arr(1, 2) = y
        For Z = iMin To iMax Step t
          If iMax - Z < t Then Z = iMax
          Arr(1, 3) = Z
          Range("Q3:S3") = Arr
          tmp = Range("T3").Value
          If tMax < tmp Then
            tMax = tmp
            Res(1, 1) = Arr(1, 1): Res(1, 2) = Arr(1, 2): Res(1, 3) = Arr(1, 3)
            If tMax = Win Then GoTo Thoat
          End If
        Next Z
      Next y
    Next x
  Next n
Thoat:
  Range("Q3:S3") = Res
  Application.ScreenUpdating = True
End Sub
Tks bạn nhiều , mình đang xem thử qua nhưng phải nói thật mình ko rành code này nên khá khó với mình .Khi mình tinh chỉnh thêm 1 vài ván vào thì ko thấy chạy theo code nữa . Có vẻ mình phải lọ mọ thêm vài phương án khác đơn giản hơn . 1 lần nữa , tks !
 
UP
Bài đã được tự động gộp:

Thử code
Mã:
Sub HeSo()
  Dim Arr(1 To 1, 1 To 3), Res(1 To 1, 1 To 3)
  Dim i, n, x, y, Z, tmp, tMax, Win
  Const iMin = 20
  Const iMax = 200
  i = Range("A65000").End(xlUp).Row
  If i < 3 Then MsgBox ("????"): Exit Sub
  Win = Application.CountIf(Range("B3:B" & i), "Win")
  tmp = Application.CountA(Range("B3:B" & i)) - Win
  If Win < tmp Then Win = tmp
  Application.ScreenUpdating = False
  For n = 2 To iMax - iMin
    t = Int((iMax - iMin) / n)
    For x = iMin To iMax Step t
      If iMax - x < t Then x = iMax
      Arr(1, 1) = x
      For y = iMin To iMax Step t
        If iMax - y < t Then y = iMax
        Arr(1, 2) = y
        For Z = iMin To iMax Step t
          If iMax - Z < t Then Z = iMax
          Arr(1, 3) = Z
          Range("Q3:S3") = Arr
          tmp = Range("T3").Value
          If tMax < tmp Then
            tMax = tmp
            Res(1, 1) = Arr(1, 1): Res(1, 2) = Arr(1, 2): Res(1, 3) = Arr(1, 3)
            If tMax = Win Then GoTo Thoat
          End If
        Next Z
      Next y
    Next x
  Next n
Thoat:
  Range("Q3:S3") = Res
  Application.ScreenUpdating = True
End Sub
bạn ơi , mình vừa thử thì chạy lâu quá , mình debug thử thì nó ra thế này nghĩa là sao bạn
 

File đính kèm

  • 123.JPG
    123.JPG
    84 KB · Đọc: 7
Lần chỉnh sửa cuối:
@dohangminhtri
Với excel 2016, nếu dùng solver bạn làm như sau :
Mã:
Set Objective : $T$3
To : Chọn Max
By Changing variable cells : $Q$3:$S$3
Subject to the constraints :
    $Q$3:$S$3 <= 200
    $Q$3:$S$3 >= 20
    $Q$3:$S$3 = integer
Select a solving method : Evolutionary
Options : Chọn trang Evolutionary :
    Mutation rate : 0.01
    Population size : 10000
    Maximum time… : 10
    Các mục khác giữ nguyên
    Nhấn ok
Nhấn solver
Các thông số trên là lấy cho file mẫu của bài 1, có thể phải thay đổi cho phù hợp file thực tế của bạn.
Nếu chưa cài đặt solver bạn cài đặt như sau :
Mã:
Nhấn alt + T + O
Chọn Add-ins
Manage chọn Go…
Tích chọn Solver, ok, ok

Nếu cần nhiều kết quả thì sẽ dùng vba
 
@dohangminhtri
Với excel 2016, nếu dùng solver bạn làm như sau :
Mã:
Set Objective : $T$3
To : Chọn Max
By Changing variable cells : $Q$3:$S$3
Subject to the constraints :
    $Q$3:$S$3 <= 200
    $Q$3:$S$3 >= 20
    $Q$3:$S$3 = integer
Select a solving method : Evolutionary
Options : Chọn trang Evolutionary :
    Mutation rate : 0.01
    Population size : 10000
    Maximum time… : 10
    Các mục khác giữ nguyên
    Nhấn ok
Nhấn solver
Các thông số trên là lấy cho file mẫu của bài 1, có thể phải thay đổi cho phù hợp file thực tế của bạn.
Nếu chưa cài đặt solver bạn cài đặt như sau :
Mã:
Nhấn alt + T + O
Chọn Add-ins
Manage chọn Go…
Tích chọn Solver, ok, ok

Nếu cần nhiều kết quả thì sẽ dùng vba
Cảm ơn bạn nhiều , đang test thử với bài 1 trên thì thấy có vẻ ổn , nhưng test file khác vs nhiều dữ liệu thì thấy đứng máy :V . Cảm ơn bạn đã dành thời gian !
 
Web KT

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

Back
Top Bottom