在重复迭代后找到变量的最小值

时间:2015-03-06 23:35:13

标签: python



import math

print ('''
                               .Fire 
                               |
                               |
watch tower .                  |
            |                  |C
            |                  |
           A|                  |
            |                  |
            |________B_________|
            ====================
                   canal

             ''')

A= (int(input('please give A a value ')))
B= (int(input('please give B a value ')))
C= (int(input('please give C a value ')))

def Hypotenus1_2():
    x=(int(0))
    y=math.sqrt((int(A)*int(A))+(int(x)*int(x)))+math.sqrt((int(A)-int(x))* (int(A)-int(x))+(int(C)*int(C)))
    while x<B:
        x=x+1
        y=math.sqrt((int(A)*int(A))+(int(x)*int(x)))+math.sqrt((int(A)-int(x))*(int(A)-int(x))+(int(C)*int(C)))
        dpY=(round((y),1))
        z=math.sqrt(((int(B)-(int(x)))*(int(B)-(int(x))))+(int(C)*int(C)))
        dpZ=(round((z),1))
        print (round((dpZ+dpY),1))

Hypotenus1_2()
&#13;
&#13;
&#13;

请注意我使用的是python 3.4.3。

好吧所以我试图找到从观察塔到运河到火的最小可能路线,并且这样做我必须找到斜边并将相应的斜边添加在一起。

然而,随着x的每个值改变,dpZ和dpY也会在每次迭代时加在一起,以便找到最小路径。我将hypotenuses的值加在一起,可以看到最低的路线,但不能只取最小值。

到目前为止,这些是我对代码的结果。

&#13;
&#13;
>>> 

                               .Fire 
                               |
                               |
watch tower .                  |
            |                  |C
            |                  |
           A|                  |
            |                  |
            |________B_________|
            ====================
                   canal

             
please give A a value 3
please give B a value 10
please give C a value 5
18.8
18.1
17.8
17.9
18.3
18.9
19.8
21.0
22.4
24.0
>>> 
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

听起来您希望在每次迭代时保存最佳解决方案。这些方面的东西:

import math

shortest = 0
best = 1000000
for i in range (0, B):
    hypAB = math.hypot(A, i)
    hypBC = math.hypot(i, C)
    shortest = min(hypAB + C, hypBC + A) 

    if shortest < best:
        best = shortest

print (best)

答案 1 :(得分:0)

这是一个分析解决方案:

x[0 .. B]点,总路径L(A**2 + x**2)**0.5 + ((B - x)**2 + C**2)**0.5

L

时出现

分钟dL/dx == 0

dL/dx =  0.5 * (A**2 + x**2)**-0.5 * 2*x
       + 0.5 * ((B - x)**2 + C**2)**-0.5 * 2 * (B - x) * -1

      = x / (A**2 + x**2)**0.5 - (B - x) / ((B - x)**2 + C**2)**0.5

如果dL/dx == 0

x / (A**2 + x**2)**0.5 == (B - x) / ((B - x)**2 + C**2)**0.5

# square both sides
x**2 / (A**2 + x**2) == (B - x)**2 / ((B - x)**2 + C**2)

# multiply both sides by (A**2 + x**2) * ((B - x)**2 + C**2)
x**2 * ((B - x)**2 + C**2) == (B - x)**2 * (A**2 + x**2)

# expand and collect terms
(C**2 - A**2) * x**2 + (2 * A**2 * B) * x + (- A**2 * B**2) == 0

是二次的;使用二次公式和减少,我们得到

x = A * B / (A + C)

L = ((A + C)**2 + B**2)**0.5