汇编语言蛮力

时间:2012-11-17 22:00:31

标签: assembly brute-force motorola 68000

因此,我正致力于汇编语言程序,以确定封闭圆柱形罐的最佳尺寸,例如用于罐头食品的那些。有三个输入变量,我已经用汇编语言代码创建了微积分部分:

最终材料的成本,以美元/ cm2为单位。

侧面材料的成本,以美元/ cm2为单位。

以毫升为单位的罐体积。

鉴于这三个输入变量,我已经确定了罐的尺寸(高度和直径),从而使罐的成本最小化。我再次提出了解决这个程序的微积分部分,但对使用dowhile循环的蛮力是什么感到好奇。如何创建一个与微积分答案产生几乎相同输出的蛮力,例如:

Enter the cost of end material per square cm: 
.001
Enter the cost of the side material per square cm: 
.003
Enter the desired volume in milliliters: 
100

Calculus Answer:

Can cost:  0.24
Diameter:  7.25
Height:    2.41  

Brute Force Answer:

Can cost:  0.24
Diameter:  7.25
Height:    2.41

我提出的微积分部分导致微积分答案输出是:

********** CONSTANTS **********
TWO:           EQU    $40000000        
PI:            EQU    $40490FDA
ONE_THIRD:     EQU    $3EAAAAAb
START_R:       EQU    $3C23D70A
*******************************

start:  initIO                  * Initialize (required for I/O)
        initF
        setEVT
        lineout  p1
        floatin  buffer
        cvtaf    buffer,D5   * END cost
        lineout  p2
        floatin  buffer
        cvtaf    buffer,D6   * SIDE cost
        lineout  p3
        floatin  buffer
        cvtaf    buffer,D7   * VOLUME

**********************************************************************
** Calculus Answer
** Formula for the radius of the optimum can:
** radius = (((volume*side_cost)/(2*PI*end_cost))^(1/3)      

** numerator, volume*side_cost:
        move.l      D7,D1       * VOLUME
        fmul        D6,D1       * VOLUME*SIDE_COST 

** denominator, 2*PI*end_cost        
        move.l      D5,D2       * END_COST
        fmul        #TWO,D2     * END_COST * 2.0
        fmul        #PI,D2      * END_COST * 2.0 * PI

** now take result to 1/3 power
        fdiv        D2,D1        * numerator/denominator
        move.l      #ONE_THIRD,D0              
        fpow        D1,D0       *(numerator/denominator) ^ (1/3)

** Calulus answer done, now calculate diameter, height, cost
        move.l      D0,D1       * D1 has radius
        fmul        #TWO,D0     * D0 has diameter        
        cvtfa       diameter,#2

** calculate height = (volume / PI*r^2)
        move.l      D1,D2       * radius
        fmul        D2,D2       * radius^2
        fmul        #PI,D2      * radius^2*PI
        move.l      D7,D3       * copy of volume
        fdiv        D2,D3       * vol / PI*radius^2  HEIGHT --> D3
        move.l      D3,D0      
        cvtfa       height,#2

** calculate cost = SIDE_COST*SIDE_SURFACE + 2*END_COST*END_SURFACE
        *** side cost:
        move.l      #PI,D2
        fmul        #TWO,D2     * 2*PI
        fmul        D1,D2       * 2*PI*radius
        fmul        D3,D2       * 2*PI*radius*height  = side surface area
        fmul        D6,D2       * side surface area * SIDE_COST

        *** end cost:
        move.l      #PI,D0
        fmul        #TWO,D0     * 2*PI
        fmul        D1,D0       * 2*PI*radius
        fmul        D1,D0       * 2*PI*radius*radius
        fmul        D5,D0       * 2*PI*radius*radius*END_COST
        fadd        D2,D0
        cvtfa       cost,#2

** DONE, print the  calculus answer

        lineout     ans1
        lineout     ans2
        lineout     ans3

如果想要使用' do'为这个程序创建一个蛮力,那该怎么可能?或者'而'循环如下。有人可以帮助我。

radius = 0.01
lastCost = Calculate

do:
    radius = radius+0.01
    newCost = Calculate
    if(newCost  lastCost)
        goto print
    lastCost = newCost
    goto loop
print lastcost

只是好奇蛮力方法可能是什么样的,我很确定它基本上是相同的代码,但只是添加了几行代码。我只是想知道在哪里添加这些代码行。

2 个答案:

答案 0 :(得分:0)

如果我理解你正确你只需要计算所有高度和宽度的组合并采取最低的成本。这里的问题是找到一个包含最佳答案的间隔,但也是一个对你来说可行的步长当前的问题(否则你将有太多的可能性) 您还需要设置高度*宽度为2 * pi =固定体积的侧面条件,因为如果体积较小(可能会出现某些组合),那么成本也会更小

答案 1 :(得分:0)

想象一下你有一个范围(最初为0到最大)并在此范围内选择相等距离的N个点(包括最小值和最大值)。在这N个点中找到具有最佳价格的点,并且其左/右点上的点变为新范围(或者如果它是旧的最小值或最大值则为点本身)。当然,当你达到所需的精确度时,你就会停下来。无论如何。

对于你的情况" N = 4"应该够了;并且您可以记住上一次迭代中的值(例如,使用" N = 4"您只需计算每次迭代2个点,因为您已经知道最小值和最大值的值)。对于N = 4,每次迭代的范围将减少25%,并且在17次迭代之后,范围将小于原始范围的1%(并且您将仅计算36个价格)。