そこで私は、食品の缶詰に使用されるような、閉じた円筒形の缶の最適な寸法を決定するためのアセンブリ言語プログラムに取り組んでいます。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
これに対してブルートフォースメソッドがどのように見えるかについて興味があります。基本的に同じコードですが、数行のコードを追加するだけです。これらのコード行をどこに追加できるか知りたいだけです。