因此,我正致力于汇编语言程序,以确定封闭圆柱形罐的最佳尺寸,例如用于罐头食品的那些。有三个输入变量,我已经用汇编语言代码创建了微积分部分:
最终材料的成本,以美元/ cm2为单位。
侧面材料的成本,以美元/ cm2为单位。
以毫升为单位的罐体积。
鉴于这三个输入变量,我已经确定了罐的尺寸(高度和直径),从而使罐的成本最小化。我再次提出了解决这个程序的微积分部分,但对使用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'为这个程序创建一个蛮力,那该怎么可能?或者'而'循环如下。有人可以帮助我。
radius = 0.01
lastCost = Calculate
do:
radius = radius+0.01
newCost = Calculate
if(newCost lastCost)
goto print
lastCost = newCost
goto loop
print lastcost
只是好奇蛮力方法可能是什么样的,我很确定它基本上是相同的代码,但只是添加了几行代码。我只是想知道在哪里添加这些代码行。
答案 0 :(得分:0)
如果我理解你正确你只需要计算所有高度和宽度的组合并采取最低的成本。这里的问题是找到一个包含最佳答案的间隔,但也是一个对你来说可行的步长当前的问题(否则你将有太多的可能性) 您还需要设置高度*宽度为2 * pi =固定体积的侧面条件,因为如果体积较小(可能会出现某些组合),那么成本也会更小
答案 1 :(得分:0)
想象一下你有一个范围(最初为0到最大)并在此范围内选择相等距离的N个点(包括最小值和最大值)。在这N个点中找到具有最佳价格的点,并且其左/右点上的点变为新范围(或者如果它是旧的最小值或最大值则为点本身)。当然,当你达到所需的精确度时,你就会停下来。无论如何。
对于你的情况" N = 4"应该够了;并且您可以记住上一次迭代中的值(例如,使用" N = 4"您只需计算每次迭代2个点,因为您已经知道最小值和最大值的值)。对于N = 4,每次迭代的范围将减少25%,并且在17次迭代之后,范围将小于原始范围的1%(并且您将仅计算36个价格)。