编辑通过添加单位(ml)来澄清应用,并解释以1/26为单位测量湿试剂的难度。单词'解决方案'是模棱两可的,因为它既用于化学解决方案,也用于解决问题。
根据爱德华的回复
添加了结果现实世界的应用是,我正在努力确定最接近的方便"当混合试剂A和B以产生最接近特定A:B比的溶液(在湿化学意义上)时使用的体积。让我们来定义"方便"可被5整除。
示例
假设:
1. X = A/(A+B) * C
2. Y = B/(A+B) * C
3. X + Y = C
4. A, B, C always positive integer
// e.g. a 500ml solution (wet chemistry sense) C with a 1:25 ratio of A and B
A = 1
B = 25
C = 500
这使得使用X
和Y
的体积来创建具有适当A:B比率的解决方案(湿化学意义)。
X = 500/26 = ~19.23ml
Y = 12500/26 = ~480.77ml
C = 13000/26 = 500ml
这些是确切的体积,总体积为500ml,但尝试以1 / 26ml为单位测量试剂体积是一项挑战。
如何找到方便的价值观" (X可整除的整数)X,Y和C最接近X,Y和C的精确值,它们是1/26的倍数?在这种情况下,我发现最接近"方便" X,Y,C的值:
X = 20ml
Y = 500ml
C = 520ml
在这种情况下,(520ml)的C超过500ml所需的体积,但物理测量20mL和500mL的体积比在1/26测量试剂体积更实际。额外的20mL被丢弃,使用漂亮的价值的成本。
基于爱德华的答案
A=1 B=25 C=500
X=20 Y=500 C2=520
A=1 B=20 C=500
X=25 Y=500 C2=525
A=1 B=100 C=500
X=5 Y=500 C2=505
A=1 B=75 C=500
X=10 Y=750 C2=760
A=1 B=50 C=900
X=20 Y=1000 C2=1020
答案 0 :(得分:1)
解决此问题的一种方法是调整C
,使其吸收因子A+B
。然后A
与B
的比例将是准确的,X
,Y
和C
都将是整数。设D = 5*(A+B)
,C2 = ceiling(C/((double)D)) * D
(向上舍入以获得足够的C
),X = C2/(A+B)*A
,Y = C2/(A+B)*B
。如果您想要最接近的C
值,请改用C2 = round(C/((double)D))*D
。
如果您正在混合化学品,您可能想要整理而不是圆形到最接近,这样您就可以留下足够的废物,这比没有足够的更好。
答案 1 :(得分:1)
您可以将此作为具有L1(绝对值)目标函数的优化问题。 (这是使用大炮拍蚊子,但我这样做是因为我想弄清楚L1优化。)我使用了GLPK包中的程序glpsol(开源)。这是我的计划:
param A, integer, >= 0;
param B, integer, >= 0;
param C, integer, >= 0;
var x, integer, >= 0;
var y, integer, >= 0;
var e1x, >= 0;
var e1y, >= 0;
minimize e1 : e1x + e1y;
subject to
c1 : (5*x - (C*A)/(A + B)) <= e1x;
c2 : ((C*A)/(A + B) - 5*x) <= e1x;
c3 : (5*y - (C*B)/(A + B)) <= e1y;
c4 : ((C*B)/(A + B) - 5*y) <= e1y;
solve;
printf "x=%g, y=%g, error=%g\n", x, y, e1;
data;
param A := 1;
param B := 25;
param C := 500;
这是输出:
$ glpsol --model find_nice_integers.mod
[... snip ...]
x=4, y=96, error=1.53846
以下是关于how to handle absolute values in optimization problems的一些说明。
答案 2 :(得分:1)
因此,您将获得一个整数C
以及两个其他整数p:q
和A
之间的比率B
(即A/B = p/q
)。
我会将您对方便的定义解释为要求X
和Y
都是5
的倍数
X = A / (A+B) * C'
Y = B / (A+B) * C'
C' is close to C
用A/B
替换p/q
X = p / (p+q) * C'
Y = q / (p+q) * C'
现在,为了X
和Y
为整数,p * C'
和q * C'
必须都是(p+q)
的倍数。由于我们可以假设p:q
是不可挽回的(即p
和q
没有共同的倍数),这意味着C'
必须可以被p+q
整除。此外,C'/(p+q)
必须是5
的倍数。因此,C'
必须是5*(p+q)
的倍数。
最接近5*(p+q)
的{{1}}倍数为:
C
现在我们可以计算:
C' := round(C/(5*(p+q)))*5*(p+q)
并且它们确实是X := p/(p+q)*C'
Y := q/(p+q)*C'
的倍数,因为5
是。
让我们看看这与你的例子有什么关系:
输入:
C'/(p+q)
然后
p = 1
q = 25
C = 500
因此
C' := round(500/5(1+25))*5*(1+25) = round(100/26)*5*26 = 4*5*26 = 520
瞧!
答案 3 :(得分:0)
让我们首先计算最佳(浮动)A和B.
可以观察到最优整数解是{floor(A),ceiling(B)}或{ceiling(A),floor(B)}。所以我们只是尝试两种方法,并选择答案,错误较少。