2

そこで私は、食品の缶詰に使用されるような、閉じた円筒形の缶の最適な寸法を決定するためのアセンブリ言語プログラムに取り組んでいます。3つの入力変数があり、アセンブリ言語コードで微積分部分をすでに作成しています。

最終材料のコスト(ドル/ cm2)。

サイドマテリアルのコスト(ドル/ cm2)。

缶の容量(ミリリットル)。

これらの3つの入力変数を前提として、缶のコストが最小になるように缶の寸法(高さと直径)を決定しました。繰り返しますが、私はこのプログラムを解くための微積分の部分を思いつきましたが、doまたはwhileループを使用するとブルートフォースがどのように見えるかについて興味があります。微積分の答えとほぼ同じ出力を生成するブルートフォースを作成するには、どのようにすればよいでしょうか。たとえば、次のようになります。

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」または「while」ループを使用して、このプログラムのブルートフォースを作成したい場合はどうでしょうか。誰かが私を助けることができますか?

radius = 0.01
lastCost = Calculate

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

これに対してブルートフォースメソッドがどのように見えるかについて興味があります。基本的に同じコードですが、数行のコードを追加するだけです。これらのコード行をどこに追加できるか知りたいだけです。

4

2 に答える 2

0

範囲(最初は0から最大)があり、この範囲内の等距離(最小と最大を含む)でNポイントを選択するとします。これらのNポイントのうち、最も価格の高いポイントを見つけ、その左右のポイントが新しい範囲になります(または、古い最小値または最大値の場合はポイント自体)。もちろん、それが何であれ、必要な精度に達したときに停止します。

あなたの場合、「N=4」で十分です。また、前の反復の値を覚えておくことができます(たとえば、「N = 4」の場合、最小値と最大値がすでにわかっているので、反復ごとに2ポイントしか計算しません)。N = 4の場合、範囲は反復ごとに25%減少し、17回の反復後、範囲は元の範囲の1%未満になります(36の価格しか計算していません)。

于 2012-11-17T23:59:07.957 に答える
0

私があなたを正しく理解していれば、高さと幅のすべての組み合わせを計算し、最低のコストをかけるだけです。ここでの問題は、最良の答えを含む間隔を見つけることですが、現在の問題に適したステップサイズも見つけることです(そうしないと、可能性が多すぎます)また、高さ*幅²* pi =固定ボリュームでサイドコンディションを設定する必要があります。これは、ボリュームが小さい場合(一部の組み合わせで発生する可能性があります)、コストも小さくなるためです。

于 2012-11-17T22:22:49.347 に答える