PHP - 困难的数学计算

标签 php math

项目描述

该项目计算一匹马应该吃多少食物,这是基于大量的变量。用户输入有关每匹马的信息和首选饲料。每种饲料都含有多种维生素和营养素。

一匹马使用多种饲料。

我们有什么

我们有特定马需要的每种营养素的最小值和最大值。

我们有一种或多种不同类型饲料的含量,每种饲料可能含有大约 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/

相关文章:

java - 有什么方法可以像在 PHP 中一样声明 'Hybrid' java 的 HashMap

javascript - JavaScript 的最大整数值是多少,一个数字在不损失精度的情况下可以达到多少?

c# - 在圆上转录多边形

java - 数字滤波器,Java 数学,

python - 加倍二进制数

php - 不要在 php 中显示 mysql 表中的空结果

php - 在接下来的第 4 列中查找 CI 数据库错误

php - 通过 PHP 访问连接到 MySQL 数据库被拒绝

php - 从上一页获取数组值并显示在表格中

java - 这一行交换了两个变量,但它是如何进行的呢?