项目描述
该项目计算一匹马应该吃多少食物,这是基于大量的变量。用户输入有关每匹马的信息和首选饲料。每种饲料都含有多种维生素和营养素。
一匹马使用多种饲料。
我们有什么
我们有特定马需要的每种营养素的最小值和最大值。
我们有一种或多种不同类型饲料的含量,每种饲料可能含有大约 20-30 种不同的营养素和维生素。我们也有这个价格,想用这个来省钱。
(当时只计算一匹马)
示例
我们使用 A、B 和 C 来表示营养素。
马需要:(A,B,C) MIN(30,7,9) MAX(35,9,17)
Feed 1 包含:(A,B,C) VALUES(16,2,3)
Feed 2 包含:(A,B,C) VALUES(0,4,9)
可行的解决方案是 2*Feed1 和 1*Feed2。
问题
我希望系统根据每种营养素的最小值/最大值计算出完美的平衡,同时仍然保持尽可能低的价格。
工作解决方案
如果我首先计算每个 feed 的最大可能数量,就可以随机分配直到看起来有效为止。然后,如果金额不完美,用户将能够更改金额。
<?php
function randomizerLoop(){
foreach($feeds as $feed){
$max['A'] = floor($horse_max['A']/$feed['A']);
$max['B'] = floor($horse_max['B']/$feed['B']);
$max['C'] = floor($horse_max['C']/$feed['C']);
$maxRand = MIN($max['A'], $max['B'], $max['C']);
$amounts[$feed['id']] = rand(0, $maxRand);
}
return $amounts;
}
?>
此代码将不断尝试直到获得工作平衡,而不是在第一次尝试时使用一些很酷的计算来找到平衡。
我只需要知道如何在没有 rand()
的情况下解决它。
更多信息
每个用户都可以添加无限数量的马匹,但一次只能计算一匹马(目前)。
还可以添加无限数量的提要(由用户定义),每个提要可以有 20-30 个变量。根据解决方案,这可能需要限制每次自动计算的提要。
如果我们使用 20 个不同的提要,每个提要有 20-30 个变量,并且当我们用 int 而不是 bool 值定义数量时,将会有很多组合。
最佳答案
这是一个 linear programming问题。
MIN MAX
A 30 35
B 7 9
C 9 17
A B C
Feed1 16 2 3
Feed2 0 4 9
让食物包含 x 个 feed1 和 y 个 feed2。根据您的问题:
30<16*x+0*y<35
=> 30<16x<35
使用ceil()
将 30 除以 16,将得到 u x(即 2)。之后你有 3<4y<5,同样使用 ceil()
你会得到 y=1。
现在考虑你的项目,
对于大量的提要,计算这么多的方程式将很困难。
我们应该使用矩阵来简化。上面给出的等式的矩阵将是:-
A * B = C
|16 0| | x | | 30 |
|2 4| | y | = | 7 |
|3 9| | 9 |
现在使用 Lapack::pseudoInverse()计算矩阵 A 的逆矩阵并将其与 C 相乘。 然后简单地将矩阵 B 中 x 和 y 的值等同于答案并使用 ceil()。
关于PHP - 困难的数学计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32337798/