- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 PHP 将重量分配给卡车。
条件
我有这个
class VehicleCalculation
{
/**
* @var int $weight
*/
private $weight;
/**
* @var array $vehicleConfig
*/
private $vehicleConfig;
/**
* VehicleCalculation constructor.
*
* @param int $weight
* @param array $vehicleConfig
*/
public function __construct(int $weight, array $vehicleConfig)
{
$this->weight = $weight;
$this->vehicleConfig = $vehicleConfig;
}
/**
* Calculates number of vehicles by weight
*
* @return array
*/
public function calculate()
{
$numberOfTrucks = count($this->vehicleConfig);
// Create basement for trucks with empty array
$base = [];
for ($n = 0; $n < $numberOfTrucks; $n++) {
$base[$n] = 0;
}
$i = 0;
// Fill the trucks
while ($this->weight >= 0) {
// Iterate over weight and add it to containers, if exceeds fill the smallest one
if ($this->weight >= $this->vehicleConfig[$i]) {
$base[$i] += 1;
$this->weight = $this->weight - $this->vehicleConfig[$i];
} else {
$base[array_keys($base)[count($base) - 1]] += 1;
$this->weight = $this->weight - end($this->vehicleConfig);
}
$i++;
if ($i >= $numberOfTrucks - 1) {
$i = 0;
}
}
return $base;
}
}
用法
$weight = 5678;
$trucks = [1200, 600, 300];
$vehicleCalculation = new VehicleCalculation($weight, $trucks);
$result = $vehicleCalculation->calculate();
print_r($result);
最佳输出是数组[1200 => 4, 600 => 1, 300 => 1]
我的代码输出是 [1200 => 3, 600 => 3, 300 => 1] 它在重量方面是“正确的”但效率不高,因为“卡车越少越好” .
有什么办法可以让卡车的任意组合更好地分流吗?
卡车可以这样设置:
[1200, 600, 300](示例)
[2400,300]
[1600, 950, 150]
[2400]
最佳答案
工作 demo
逻辑已更新(已调试),我快速运行了一些测试,它似乎产生了符合所需结果的正确结果。
/**
* Find the lowest number of trucks to transport freight with a certain weight.
*
* The function returns the composition and number of each type of truck
* necessary to transport the total freight (weight). The algorithm
* starts from the biggest type truck and works its way down to the smallest,
* ensuring a minimum number of trucks is employed to carry the freight.
*
* @param int $weight : the weight to be transported by the trucks
* @param array $trucks : each element is a truck-type (weight capacity)
* @param int $sensitivity : higher values for 'fewer trucks',
* lower values for higher capacity efficiency.
* @return array : truck-count per type and remaining weight
*/
function optimize(int $weight = 0, array $trucks = [], $sensitivity = 10): array
{
$weightStore = $weight; // cache weight
// sort truck-type array (highest to lowest weight capacity).
rsort($trucks);
/* initialize truckCount at 0 for all types */
foreach ($trucks as $type) {
$truckCount[$type] = 0;
}
foreach ($trucks as $type) {
$capacity = $type; // truck capacity
$exact = ($weight / $type);
$round = (int) (floor($exact)); // whole trucks
if ($exact >= 1) {
$truckCount[$type] = $round; // whole trucks
// adjust weight
$weight = $weight - ($round * $type);
}
}
// do we still have remaining weight
if ($weight > 0) {
rsort($trucks);
foreach ($trucks as $type) {
$ratio[$type] = $weight / $type;
$max = max($ratio);
}
$type = array_search($max, $ratio);
$truckCount[$type]++;
$weight -= $type; // final weight adjustment
}
/*
* use the ratio of truck capacities to identify
* edge cases in results array:
* e.g.: algorithm selected two trucks of 300 cap
* where 1 of 600 cap would be more efficient.
*/
$ratioCap = [];
foreach ($trucks as $key => $type) {
if (isset($trucks[$key + 1])) {
$ratioCap[$trucks[$key + 1]] = ($trucks[$key] / $trucks[$key + 1]);
}
}
/* edge cases - force fewer trucks */
$sensitivity = ($sensitivity <= 0) ? 10 : $sensitivity; // set default if neg. or 0
foreach ($trucks as $cycle) {
foreach ($truckCount as $type => $number) {
foreach ($ratioCap as $key => $value) {
if ($type == $key && $number >= (floor($value) / $sensitivity) && $number != 1) {
$truckCount[$type] = 0; // group of smaller type trucks = 0
$truckCount[$type * $value] += 1; // the group of smaller trucks is moved into one larger truck
}
}
}
}
/* truck capacity vs. weight transported */
$capacityUse = 0;
foreach($truckCount as $type => $number) {
$capacityUse += $type * $number;
} $weight = $weightStore - $capacityUse;
return ['trucks' => $truckCount, 'remaining weight' => $weight];
}
注意:逻辑从最大的卡车类型开始,一直向下到更小的类型(如果可用)。卡车类型 $type
是卡车的容量(例如本例中的 1200、600 或 300)。数组 $trucks
中的每个元素代表具有一定容量(它可以承载的重量)的卡车类型。
我们首先计算所需的某种类型卡车的确切数量,$exact[$type]
,但由于我们无法计算出在高速公路上行驶的卡车的“分数”,因此我们将这个数字四舍五入向下到下一个最小整数 - 使用 floor()
。它将 $type
卡车的总数存储在 $truckCount[$type]
中。
返回的数组包含运输重量所需的每种类型卡车的数量 - key trucks
- 以及显示剩余重量 - key remaining weight
,在此示例中为 -22
(如果最后一辆卡车有一些备用容量,则为负数;如果最后一辆卡车恰好装满了剩余重量,则为 0)。
边缘情况:该算法的工作原理是装满“整辆”卡车,然后转移到下一辆较小型的卡车,直到总重量分配到卡车上。
那么如果我们的权重是1700
和三种卡车类型 [1200, 600, 300]
?逻辑选择 1 卡车 1200
容量,0 辆 600 辆
容量的卡车(因为我们只需要这辆卡车的部分容量),以及 2 辆 300 辆
容量的卡车。这个结果不符合“最小卡车数量”的条件。
因此我们需要调整结果,将 2 辆 300 辆卡车替换为 1 辆 600 辆卡车。
编辑: 引入了一个“敏感度”变量作为函数参数 - 它允许算法在“卡车较少”的情况下增加“权重”。你不需要触及这个变量,但如果你想玩它,为更少的卡车设置更高的值,或者为更高的“空间效率”结果设置更低的值。默认为 10。
“调整”是在函数的末尾进行的——一个有效的代码块,但我认为有必要在某个时候将其重构到主要逻辑中。
关于php - 如何更好地将包裹(重量)分装到不同的卡车上以实现最佳效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58645730/
我想了解如何正确地从 Parcel 中读取空值。让我们看看我的用例: public class MyModel implements Parcelable { private Long id;
好吧,我知道我必须使用 JDBC 等,但我不确定如何将 jar 实现到我的代码中,我有一个基本代码来打开文件等,但我如何才能真正将 sqlite jar 与我的 java 一起合并类文件可以在任何地方
我想知道是否可以打包(或序列化)ClassLoader 以通过 Message 将其发送到 Android 中的另一个进程。 ClassLoader没有实现 Parcelable/Serializab
在上传到我的域时尝试让我的 SVG 出现在浏览器中时,我 - 类似于我拥有 的其他项目包裹安装 - 创建了一个 静态文件夹 我会将 SVG 文件放入的位置。它现在出现在浏览器中,但是,正在播放的“绘图
我有这样的东西: 我希望以最简单的方式实现这样的事情:
当我们使用一个独立的函数语句作为 IIFE 时,我们需要用 () 包装它以使其工作 // IFFE (function a(){ console.log('Hello') }()); // I
我正在为 WCF 开发一个 Java 客户端,并且模板运行良好。我最初使用的是 eclipse 的 Web 服务客户端项目,但后来发现 android 平台不支持所需的库。当时我打算使用 ksoap,
我希望将整行变为可点击。现在行看起来像 Group Obj
我有以下标记(使用 Bootstrap 4): .resource{ border:1px solid red; } tes
#parent{ max-width:1100px; margin: auto; border: 1px solid red; padding: 40px; } #ch
我正在尝试用自定义指令包裹 Angular 带的弹出框。 弹出窗口应该能够使用由使用我的指令的人提供的自定义模板,并且该模板应该能够使用 Controller 的范围。 对于范围部分,我发现我可以将
我有一个 HTML 页面,其中一个 div 包含另一个包含数据库(聊天系统)中所有用户的 div,但是 ul li 标签没有占用父 div 的整个宽度。这是预期结果的图像:http://prntscr
我正在尝试通过套接字将包裹发送到 Android 应用程序。客户端在 libbinder(c++) 中,服务器是一个必须重建包裹的 android 应用程序。我一直在寻找解决方案有一段时间了,但我不知
当我部署一个网站(有多个入口点,许多 HTML 文件)并且主机使用构建命令时:parcel build index.html aboutme.html。部署的网站给我一个 404 错误。但是,如果我在
在 Quarkus 中,异常映射器返回的实体似乎被包装在另一个实体中。 提供一个 JAX-RS 异常映射器,例如: @Provider public class WebhookExceptionMap
如果我设置 textLayer.wrapped = YES , 如何调整大小 textLayer包含包装的文本?即,我如何获得 textLayer 的新高度? 基本上,我想要类似 -[UILabel
您好,如果类有 anchor ,我会尝试用 anchor 包裹图像。 jQuery: if ( $(".views-row:has(a)").length) { var noderef = $
所以,我以前多次使用 Parcel,我从来没有遇到过问题。 这一次它抛出了一些关于 SemVer 版本控制的愚蠢错误,我真的很想找到解决这个问题的解决方案。 我开始了新项目:安装了 npm w/npm
我将 Kotlin 与 Anko 一起使用,我想向另一个 Activity 发送玩家列表。 class Player(var name: String?) { var score: Int = 0 i
我正在尝试使用 Parcelable 通过 Activity 传递数据。这是我的代码: public class Player implements Parcelable { public stati
我是一名优秀的程序员,十分优秀!