- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于这个问题,让我们假设以下项目:
MCKP 是一种 Knapsack Problem附加约束是“[T]他的项目被分割为k类......并且必须从每个类中取出一个项目”
我已经编写了使用递归调用和记忆化的动态编程来解决 0/1 KS 问题的代码。我的问题是是否可以将此约束添加到我当前的解决方案中?假设我的类(class)是水果、蔬菜、肉类(来自示例),我需要包括每种类型的 1 个。这些类也可以是类型 1、2、3。
此外,我认为这可以通过线性规划和求解器来解决,但如果可能的话,我想在这里了解答案。
<?php
$value = array(2, 2, 4, 5, 3);
$weight = array(3, 1, 3, 4, 2);
$maxWeight = 7;
$maxItems = 5;
$seen = array(array()); //2D array for memoization
$picked = array();
//Put a dummy zero at the front to make things easier later.
array_unshift($value, 0);
array_unshift($weight, 0);
//Call our Knapsack Solver and return the sum value of optimal set
$KSResult = KSTest($maxItems, $maxWeight, $value, $weight);
$maxValue = $KSResult; //copy the result so we can recreate the table
//Recreate the decision table from our memo array to determine what items were picked
//Here I am building the table backwards because I know the optimal value will be at the end
for($i=$maxItems; $i > 0; $i--) {
for($j=$maxWeight; $j > 0; $j--) {
if($seen[$i][$j] != $seen[$i-1][$j]
&& $maxValue == $seen[$i][$j]) {
array_push($picked, $i);
$maxValue -= $value[$i];
break;
}
}
}
//Print out picked items and max value
print("<pre>".print_r($picked,true)."</pre>");
echo $KSResult;
// Recursive formula to solve the KS Problem
// $n = number of items to check
// $c = total capacity of bag
function KSTest($n, $c, &$value, &$weight) {
global $seen;
if(isset($seen[$n][$c])) {
//We've seen this subproblem before
return $seen[$n][$c];
}
if($n === 0 || $c === 0){
//No more items to check or no more capacity
$result = 0;
}
elseif($weight[$n] > $c) {
//This item is too heavy, check next item without this one
$result = KSTest($n-1, $c, $value, $weight);
}
else {
//Take the higher result of keeping or not keeping the item
$tempVal1 = KSTest($n-1, $c, $value, $weight);
$tempVal2 = $value[$n] + KSTest($n-1, $c-$weight[$n], $value, $weight);
if($tempVal2 >= $tempVal1) {
$result = $tempVal2;
//some conditions could go here? otherwise use max()
}
else {
$result = $tempVal1;
}
}
//memo the results and return
$seen[$n][$c] = $result;
return $result;
}
?>
This looks to be the equation (如果您擅长阅读所有这些符号?):) 和 C++ 实现?但我真的看不出类约束在哪里发生?
最佳答案
C++ 实现看起来不错。
在您当前的 PHP 实现中,您的值和权重是一维数组,将变为二维。
例如,
values[i][j]
将是 j
的值(value)类里面的第一个项目 i
.同样在 weights[i][j]
的情况下.每堂课你将只拿一件元素i
并在最大化条件的同时继续前进。
c++ 实现也在备忘录中做了优化。它只保留 2 个大小为 max_weight
的数组条件,即当前和以前的状态。这是因为您一次只需要这 2 个状态来计算当前状态。
疑惑解答:
1)
My first thought was to add a class (k) array, sort the items via class (k), and when we choose to select an item that is the same as the next item, check if it's better to keep the current item or the item without the next item. Seemed promising, but fell apart after a couple of items being checked. Something like this: $tempVal3 = $value[$n] + KSTest($n-2, $c-$weight[$n]); max( $tempVal2, $tempVal3);
这是行不通的,因为 k+1 类中可能有一些项目,您在其中取了最佳值,并且为了遵守约束,您需要为 k 类取次优值。因此,当约束被击中时,排序和挑选最好的将不起作用。如果未达到约束条件,您始终可以选择具有最佳权重的最佳值。
2)
Another thought is that at the function call, I could call a loop for each class type and solve the KS with only 1 item at a time of that type + the rest of the values.
是的,您走在正确的轨道上。你会假设你已经解决了前 k 个类。现在,您将尝试根据权重约束使用 k+1 类的值进行扩展。
3)
... but I can't really see where the class constraint is happening?
for (int i = 1; i < weight.size(); ++i) {
fill(current.begin(), current.end(), -1);
for (int j = 0; j < weight[i].size(); ++j) {
for (int k = weight[i][j]; k <= max_weight; ++k) {
if (last[k - weight[i][j]] > 0)
current[k] = max(current[k],
last[k - weight[i][j]] + value[i][j]);
}
}
swap(current, last);
}
在上面的 C++ 代码片段中,第一个循环迭代类,第二个循环迭代类的值,第三个循环扩展当前状态 current
使用之前的状态 last
并且只有 1 件 j
与类 i
一次。由于您只使用以前的状态 last
和要扩展和最大化的当前类的 1 个项目,您遵循约束。
时间复杂度:
O( total_items x max_weight) 相当于 O( class x max_number_of_items_in_a_class x最大重量)
关于php - 用动态规划解决多项选择背包 (MCKP)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60832674/
我正在创建我的第一个 WAR 文件。我一直在试验 ant buildfile 语法,我的 buildfile 的第一部分从我的 Eclipse 项目中获取内容并将其放入 /dist 文件夹中,然后将其
我是一名学习 SQL 和 PHP 的学生,我接到了一项任务,要使用 PHP 和 mySQLi 创建学生反馈表,我真的一直在思考如何为项目设计数据库! 我正在创建一个系统,用户可以在其中登录网页,如果用
这个问题在这里已经有了答案: Is it possbile to test for expected errors when the testee exits with failure using
我目前正在设计和开发一个 Web 应用程序,该应用程序有可能快速增长。我将提供一些一般信息,然后继续我的问题。我会说我是一名中级网络程序员。 以下是一些规范:MySQL - 数据库后端PHP - 用于
我不知何故无法在我的日志解析器应用程序中实现报告功能。 这是我目前所做的: 我正在编写一个应用程序,它读取日志文件并在字符串中搜索可以在用户配置文件中定义的多个正则表达式。对于从配置中解析的每个所谓的
我有兴趣学习如何在多开发团队场景中设计/规划 Web 应用程序开发。 假设“项目经理/负责人”的角色: 成功的 Web 应用程序开发需要哪些“文档”? 需要什么 UML 图,需要什么程度? 在设计/计
table a (t_a): id name last first email state country 0 sklass klass steve
我们建立了一个广泛使用 JQuery UI 的 AJAX 网站。我们有 30 多个自制的 JQuery UI 小部件(动态加载)。我们到处都使用 JQuery native 小部件:对话框、 slid
我是一名优秀的程序员,十分优秀!