- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
显然不能将其称为 Stack Overflow 上的问题,但我目前正在尝试了解如何在 Knapsack 问题中以项目组的形式集成约束。在这种情况下,我的数学技能被证明是相当有限的,但是我非常有动力让这项工作按预期进行,并弄清楚每个方面的作用(按照这个顺序,因为事情在工作时更有意义)。
话虽如此,我在 Rosetta Code 找到了一个绝对漂亮的实现并清理了一些变量名,以帮助自己从非常基本的角度更好地理解这一点。
不幸的是,我很难弄清楚如何应用此逻辑来包含项目组。我的目的是建立梦幻团队,为每个球员提供我自己的值(value)和权重(积分/薪水),但没有团体(在我的情况下是职位)我无法这样做。
有人能为此指出正确的方向吗?我正在审查其他语言的代码示例和整个问题的其他描述,但是我希望通过任何可能的方式实现这些组。
<?php
function knapSolveFast2($itemWeight, $itemValue, $i, $availWeight, &$memoItems, &$pickedItems)
{
global $numcalls;
$numcalls++;
// Return memo if we have one
if (isset($memoItems[$i][$availWeight]))
{
return array( $memoItems[$i][$availWeight], $memoItems['picked'][$i][$availWeight] );
}
else
{
// At end of decision branch
if ($i == 0)
{
if ($itemWeight[$i] <= $availWeight)
{ // Will this item fit?
$memoItems[$i][$availWeight] = $itemValue[$i]; // Memo this item
$memoItems['picked'][$i][$availWeight] = array($i); // and the picked item
return array($itemValue[$i],array($i)); // Return the value of this item and add it to the picked list
}
else
{
// Won't fit
$memoItems[$i][$availWeight] = 0; // Memo zero
$memoItems['picked'][$i][$availWeight] = array(); // and a blank array entry...
return array(0,array()); // Return nothing
}
}
// Not at end of decision branch..
// Get the result of the next branch (without this one)
list ($without_i,$without_PI) = knapSolveFast2($itemWeight, $itemValue, $i-1, $availWeight,$memoItems,$pickedItems);
if ($itemWeight[$i] > $availWeight)
{ // Does it return too many?
$memoItems[$i][$availWeight] = $without_i; // Memo without including this one
$memoItems['picked'][$i][$availWeight] = array(); // and a blank array entry...
return array($without_i,array()); // and return it
}
else
{
// Get the result of the next branch (WITH this one picked, so available weight is reduced)
list ($with_i,$with_PI) = knapSolveFast2($itemWeight, $itemValue, ($i-1), ($availWeight - $itemWeight[$i]),$memoItems,$pickedItems);
$with_i += $itemValue[$i]; // ..and add the value of this one..
// Get the greater of WITH or WITHOUT
if ($with_i > $without_i)
{
$res = $with_i;
$picked = $with_PI;
array_push($picked,$i);
}
else
{
$res = $without_i;
$picked = $without_PI;
}
$memoItems[$i][$availWeight] = $res; // Store it in the memo
$memoItems['picked'][$i][$availWeight] = $picked; // and store the picked item
return array ($res,$picked); // and then return it
}
}
}
$items = array("map","compass","water","sandwich","glucose","tin","banana","apple","cheese","beer","suntan cream","camera","t-shirt","trousers","umbrella","waterproof trousers","waterproof overclothes","note-case","sunglasses","towel","socks","book");
$weight = array(9,13,153,50,15,68,27,39,23,52,11,32,24,48,73,42,43,22,7,18,4,30);
$value = array(150,35,200,160,60,45,60,40,30,10,70,30,15,10,40,70,75,80,20,12,50,10);
## Initialize
$numcalls = 0;
$memoItems = array();
$selectedItems = array();
## Solve
list ($m4, $selectedItems) = knapSolveFast2($weight, $value, sizeof($value)-1, 400, $memoItems, $selectedItems);
# Display Result
echo "<b>Items:</b><br>" . join(", ", $items) . "<br>";
echo "<b>Max Value Found:</b><br>$m4 (in $numcalls calls)<br>";
echo "<b>Array Indices:</b><br>". join(",", $selectedItems) . "<br>";
echo "<b>Chosen Items:</b><br>";
echo "<table border cellspacing=0>";
echo "<tr><td>Item</td><td>Value</td><td>Weight</td></tr>";
$totalValue = 0;
$totalWeight = 0;
foreach($selectedItems as $key)
{
$totalValue += $value[$key];
$totalWeight += $weight[$key];
echo "<tr><td>" . $items[$key] . "</td><td>" . $value[$key] . "</td><td>".$weight[$key] . "</td></tr>";
}
echo "<tr><td align=right><b>Totals</b></td><td>$totalValue</td><td>$totalWeight</td></tr>";
echo "</table><hr>";
?>
最佳答案
那个背包程序是传统的,但我认为它掩盖了正在发生的事情。让我向您展示如何从蛮力解决方案中更直接地推导出 DP。
在 Python 中(抱歉;这是我选择的脚本语言),暴力解决方案可能如下所示。首先,有一个使用广度优先搜索生成所有子集的函数(这很重要)。
def all_subsets(S): # brute force
subsets_so_far = [()]
for x in S:
new_subsets = [subset + (x,) for subset in subsets_so_far]
subsets_so_far.extend(new_subsets)
return subsets_so_far
然后有一个函数返回 True
如果解决方案有效(在预算范围内并且具有适当的位置分割) - 称之为 is_valid_solution
- 以及一个函数,给定一个解决方案,返回玩家总值(value) (total_player_value
)。假设 players
是可用玩家列表,最优解是这样的。
max(filter(is_valid_solution, all_subsets(players)), key=total_player_value)
现在,对于 DP,我们向 all_subsets
添加函数 cull
。
def best_subsets(S): # DP
subsets_so_far = [()]
for x in S:
new_subsets = [subset + (x,) for subset in subsets_so_far]
subsets_so_far.extend(new_subsets)
subsets_so_far = cull(subsets_so_far) ### This is new.
return subsets_so_far
cull
所做的是丢弃在我们寻找最优解时显然不会遗漏的部分解。如果部分解决方案已经超出预算,或者如果它在一个位置上已经有太多玩家,那么它可以安全地被丢弃。让 is_valid_partial_solution
成为测试这些条件的函数(它可能看起来很像 is_valid_solution
)。到目前为止,我们有这个。
def cull(subsets): # INCOMPLETE!
return filter(is_valid_partial_solution, subsets)
另一个重要的测试是一些部分解决方案比其他解决方案更好。如果两个部分解决方案具有相同的位置分割(例如,两个前锋和一个中锋)并且成本相同,那么我们只需要保留更有值(value)的那个。让 cost_and_position_breakdown
采取解决方案并生成对指定属性进行编码的字符串。
def cull(subsets):
best_subset = {} # empty dictionary/map
for subset in filter(is_valid_partial_solution, subsets):
key = cost_and_position_breakdown(subset)
if (key not in best_subset or
total_value(subset) > total_value(best_subset[key])):
best_subset[key] = subset
return best_subset.values()
就是这样。这里有很多优化要做(例如,丢弃部分解决方案,因为有更便宜和更有值(value)的部分解决方案;修改数据结构,这样我们就不会总是从头开始计算值(value)和头寸分割,并减少存储成本),但可以逐步解决。
关于php - 带项目组的背包方程式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33497393/
我已经用 Scala 中的每一项编写了有界背包问题的答案,并尝试将其转换为 Haskell,结果如下: knapsack :: [ ( Int, Int ) ] -> [ ( Int, Int ) ]
我正在解决这个动态编程问题,并且我一直坚持用 Java 编写迭代解决方案 目标是找到花费 X 美分所需的最少卡路里数。如果我们不能恰好花费 X 美分,那么就没有解决方案。我们给定了 N 个元素,每个元
根据维基百科和我浏览过的其他资源,您需要矩阵m[n][W]; n - 元素数量和 W - 背包的总容量。这个矩阵变得非常大,有时大到无法在 C 程序中处理。我知道动态规划的基础是节省内存时间,但是,有
我发现此代码使用蛮力机制解决背包问题(这主要是为了学习,因此无需指出动态更有效)。我得到了可以工作的代码,并且了解了大部分代码。最多。这是问题: 我注意到这两个条件,我不知道它们如何工作以及为什么在代
我必须实现背包问题的以下变体。背包中的每件元素都有优先级和重量。现在我指定一个权重 X。我必须知道计算权重总和至少为 X 并且具有最低优先级的最小项目集。每个项目只能选择一次。示例: Knap
所以我想知道如何计算背包问题的所有解。也就是说,我有兴趣从一组最大大小为 K 的数字中找出可能的子集数。 例如,我们有一组大小为 {3, 2, 5, 6, 7} 的项目,最大大小为 K = 13。因此
我在执行任务时遇到了问题。我有一个数据库,其中包含所有具有“价格”值的项目。它们连接到不同的“轮次”,“轮次”有一个“总值(value)”,其中这些项目“价格”-值(value)全部放在一起定义了“总
我遇到的问题如下: 给定一个包含 N 个元素的队列,每个元素都有一个重量,以及一个包含 K 个容器的队列。我们需要按照元素来的顺序将元素分成容器。例如,第一个项目只能进入第一个容器,第二个可以进入第一
问题如下: You have n trip lengths in km which should be divided among m number of days such that the max
我昨晚在开发一个应用程序时遇到了一个特定的问题,我确信它可能有一个有效的算法来解决它。谁能推荐一下? 问题: TL;DR:也许图片会有所帮助:http://www.custom-foam-insert
如何获取下拉列表,其中占位符显示“选择类别”作为默认选择? 以下代码没有渲染占位符 $this->crud->addField([ // Select2 'label'
刚刚带背包的新品。我在官方网站上搜索并用谷歌搜索,但没有找到答案 在 laravel 7 中,使用 Backpack 4.1 我的数据模型是:客户有很多地址 关系在客户模型中配置: public fu
据我所知(如果我错了请纠正我),背包只处理 $fillable 字段。整个 laravel 的事情不就是 $fillable 和 $guarded 之间的分离吗? MWE: 在 User.php 中:
看到this之后讲座我创建了以下背包代码。在讲座中,教授说从最优值(19:00 分钟)确定集合很容易,但我找不到如何去做。我在代码中提供了一个将值相加为 21 的示例,我如何根据该值确定集合(在本例中
为什么贪心法适用于连续背包问题而不适用于 0-1 背包问题? 最佳答案 对于连续背包,在最佳解决方案中,您不能有 q > 0 的每单位成本为 c 的元素,同时留下 q' > 0 成本为 c' > c
我在理解动态规划时遇到了一些困难,尽管我已经通读了很多资源试图理解。 我理解使用斐波那契算法给出的动态规划示例。我明白如果你使用分而治之的方法,你最终会多次解决一些子问题,而动态编程通过解决这些重叠的
假设一个经典的 0-1 背包问题,但您可以上溢/下溢背包并受到一些惩罚。每单位溢出(重量超过最大容量)扣除X利润,每单位下溢(重量低于最大容量)扣除Y利润。 我想按利润与重量的比率对所有元素进行排序,
我正在编写具有多个约束的背包 0-1 的变体。除了重量限制外,我还有数量限制,但在这种情况下,我想解决背包问题,因为我的背包中需要恰好有 n 件元素,重量小于或等于 W。我我目前正在为基于 Roset
给定一个无限正整数数组或一个正整数流,找出总和为 20 的前五个数。 通过阅读问题陈述,它首先似乎是 0-1 Knapsack 问题,但我很困惑 0-1 Knapsack algo 可以在流上使用的整
我想解决一个3维背包问题。 我有许多不同宽度、高度、长度和值(value)的盒子。我有一个指定的空间,我想把盒子放在那个空间里,这样我就能获得最优的利润。我想使用暴力来做到这一点。 我正在用 Java
我是一名优秀的程序员,十分优秀!