Function u(s As Single, th1, th2, cp As Single, yp1 As Single, yp2 As Single) As Single
Dim lx As Single
Dim cx As Single
Dim px As Single
l1 = yp1 / th1(s)
l2 = yp2 / th2(s)
cx = cp
px = 0
If cx < 0.01 Then px = 1
If l1 > 0.99 Then px = 1
If l2 > 0.99 Then px = 1
If px = 1 Then cx = 0.5
If px = 1 Then l1 = 0.5
If px = 1 Then l2 = 0.5
ux = Log(cx) + Log(1 - l1) + Log(1 - l2)
If px = 1 Then ux = -999
u = ux
End Function
Function tls(th1, th2, y1, y2) As Single
Dim n As Single
Dim m1 As Single
Dim m2 As Single
Dim tl As Single
Dim tk As Single
Dim tr As Single
Dim c(0 To 10, 0 To 10) As Single
Dim maxw As Single
Dim maxtl As Single
Dim w1 As Single
maxw = -999
For m = 1 To 5
For n = 1 To 5
tk = 0.1 * m
tl = 0.1 * n
tr = trs(tk, tl, th1, th2, y1, y2)
For m1 = 0 To 10
For m2 = 0 To 10
c(m1, m2) = (1 - tk) * y1(m1) + (1 - tl) * y2(m2) + tr
Next
Next
w1 = wel(th1, th2, c, y1, y2)
If w1 > maxw Then maxtl = tl
If w1 > maxw Then maxw = w1
Debug.Print tk, tl, w1
Next
Next
tls = maxtl
End Function
Function tks(th1, th2, y1, y2) As Single
Dim n As Single
Dim m1 As Single
Dim m2 As Single
Dim tl As Single
Dim tk As Single
Dim tr As Single
Dim c(0 To 10, 0 To 10) As Single
Dim maxw As Single
Dim maxtk As Single
Dim w1 As Single
maxw = -999
For m = 1 To 5
For n = 1 To 5
tk = 0.1 * m
tl = 0.1 * n
tr = trs(tk, tl, th1, th2, y1, y2)
For m1 = 0 To 10
For m2 = 0 To 10
c(m1, m2) = (1 - tk) * y1(m1) + (1 - tl) * y2(m2) + tr
Next
Next
w1 = wel(th1, th2, c, y1, y2)
If w1 > maxw Then maxtk = tk
If w1 > maxw Then maxw = w1
Next
Next
tks = maxtk
End Function
Function trs(tk As Single, tl As Single, th1, th2, y1, y2) As Single
Dim m As Single
Dim tr1 As Single
Dim tr2 As Single
Dim tr3 As Single
Dim b1 As Single
Dim b2 As Single
Dim b3 As Single
Dim c(0 To 10, 0 To 10) As Single
Dim t As Single
tr1 = 0.01
For m1 = 0 To 10
For m2 = 0 To 10
c(m1, m2) = (1 - tk) * y1(m1) + (1 - tl) * y2(m2) + tr1
Next
Next
b1 = bud(th1, th2, c, y1, y2)
tr2 = 0.5
For m1 = 0 To 10
For m2 = 0 To 10
c(m1, m2) = (1 - tk) * y1(m1) + (1 - tl) * y2(m2) + tr2
Next
Next
b2 = bud(th1, th2, c, y1, y2)
t = 0
Do Until t > 100
tr3 = (tr1 + tr2) / 2
For m1 = 0 To 10
For m2 = 0 To 10
c(m1, m2) = (1 - tk) * y1(m1) + (1 - tl) * y2(m2) + tr3
Next
Next
b3 = bud(th1, th2, c, y1, y2)
If b3 > 0 Then b1 = b3
If b3 > 0 Then tr1 = tr3
If b3 < 0 Then b2 = b3
If b3 < 0 Then tr2 = tr3
If b3 ^ 2 < 10 ^ (-5) Then t = 1000
t = t + 1
Loop
trs = tr1
End Function
Function bud(th1, th2, c, y1, y2) As Single
Dim b1 As Single
Dim s As Single
Dim m1 As Single
Dim m2 As Single
b1 = 0
For s = 1 To 100
m1 = mprefer(s, th1, th2, c, y1, y2)
m2 = fprefer(s, th1, th2, c, y1, y2)
b1 = b1 + y1(m1) + y2(m2) - c(m1, m2)
Next
bud = b1
End Function
Function wel(th1, th2, c, y1, y2) As Single
Dim w1 As Single
Dim s As Single
Dim m As Single
Dim c1 As Single
Dim my As Single
Dim fy As Single
w1 = 0
For s = 1 To 100
m1 = mprefer(s, th1, th2, c, y1, y2)
m2 = fprefer(s, th1, th2, c, y1, y2)
c1 = c(m1, m2)
my = y1(m1)
fy = y2(m2)
w1 = w1 + u(s, th1, th2, c1, my, fy)
Next
wel = w1
End Function
Function fprefer(s As Single, th1, th2, c, y1, y2) As Single
Dim m As Single
Dim maxu As Single
Dim maxm As Single
Dim u1 As Single
Dim c1 As Single
Dim my As Single
Dim fy As Single
maxu = -999
For m1 = 0 To 10
For m2 = 0 To 10
c1 = c(m1, m2)
my = y1(m1)
fy = y2(m2)
u1 = u(s, th1, th2, c1, my, fy)
If u1 > maxu Then maxm = m2
If u1 > maxu Then maxu = u1
Next
Next
fprefer = maxm
End Function
Function mprefer(s As Single, th1, th2, c, y1, y2) As Single
Dim m As Single
Dim maxu As Single
Dim maxm As Single
Dim u1 As Single
Dim c1 As Single
Dim my As Single
Dim fy As Single
maxu = -999
For m1 = 0 To 10
For m2 = 0 To 10
c1 = c(m1, m2)
my = y1(m1)
fy = y2(m2)
u1 = u(s, th1, th2, c1, my, fy)
If u1 > maxu Then maxm = m1
If u1 > maxu Then maxu = u1
Next
Next
mprefer = maxm
End Function
Private Sub Command1_Click()
Dim s As Single
Dim m As Single
Dim th1(1 To 100) As Single
Dim th2(1 To 100) As Single
Dim y1(0 To 10) As Single
Dim y2(0 To 10) As Single
Dim c(0 To 10, 0 To 10) As Single
Dim tl As Single
Dim tk As Single
Dim tr As Single
Dim s1 As Single
s1 = 1
s2 = 1
For s = 1 To 100
th1(s) = 0.2 * s1
th2(s) = 0.1 * s2
s1 = s1 + 1
If s1 = 11 Then s2 = s2 + 1
If s1 = 11 Then s1 = 1
Next
For m = 0 To 10
y1(m) = 0.1 * m
Next
For m = 0 To 10
y2(m) = 0.05 * m
Next
tl = tls(th1, th2, y1, y2)
tk = tks(th1, th2, y1, y2)
tr = trs(tk, tl, th1, th2, y1, y2)
Debug.Print tk, tl, tr
For m1 = 0 To 10
For m2 = 0 To 10
c(m1, m2) = (1 - tk) * y1(m1) + (1 - tl) * y2(m2) + tr
Next
Next
For s = 1 To 100
Debug.Print s, mprefer(s, th1, th2, c, y1, y2)
Next
Open "c:/lupin.txt" For Output As #1
For m1 = 0 To 10
For m2 = 0 To 10
Write #1, m1, m2, c(m1, m2)
Next
Next
Close #1
End Sub
最終更新:2009年10月18日 08:58