我必须实现两个算法来解决fractional knapsack,但到目前为止我刚刚找到并实现了贪婪的方法。
我已经搜索了很多其他算法(作为动态编程我已经读过,它也可以解决分数背包,但我找不到任何伪代码)。我发现的所有内容都是0/1背包。
有没有人有链接或任何可以解决分数背包的算法?
答案 0 :(得分:1)
@ yola21回答 java code :
自己定义未定义的函数,它们是关于接受用户的输入。
//define your variables here
System.out.println("Enter number of items:");
size = acceptNumberOfItems()
System.out.println("Enter size of your knapsack:");
size = acceptKnapsackSize()
System.out.println("Enter weight of each item:");
acceptWeightArray(weight)
System.out.println("Enter value of each item:");
acceptWeightArray(value)
double[][] valuePerWeight = new double[size][2];
double maxValue = 0;
for(int i=0; i<size; ++i){
valuePerWeight[i][0] = value[i]/weight[i];
valuePerWeight[i][1] = weight[i];
}
java.util.Arrays.sort(valuePerWeight, new java.util.Comparator<double[]>() {
public int compare(double[] a, double[] b) {
return Double.compare(a[0], b[0]);
}
});
int i = size-1;
while(knapsackSize > 0 && size >0){
//while not full
if(valuePerWeight[i][1] > knapsackSize){
maxValue += knapsackSize * valuePerWeight[i][0];
knapsackSize = 0;
}
else{
maxValue += valuePerWeight[i][1] * valuePerWeight[i][0];
knapsackSize -= valuePerWeight[i][1];
}
--i;
}
System.out.println("Max Value:" + maxValue);
}
答案 1 :(得分:0)
我不知道你的意思是两种算法,但这里是分数背包问题的解决方案。
与0/1背包问题btw相比,非常容易。准备第三个数组,每个重量数组的值,将每个项目的权重除以其对应的值
根据每个重量的值按降序对项目进行排序
将项目清单中的项目带入您的麻袋直至装满
N.B 如果您的麻袋无法完全接受,请务必取最后一项的分数。
例如,如果你的口袋里有80公斤,下一个项目的重量是23:答案 2 :(得分:0)
您可以使用genetic algorithm。
如果有n
个材料,您的染色体将会有n - 1
从0到1加倍。i
- 双倍指定我们采用的材料i
。对于材料n
,我们取余数,即1 - (n - 1
双倍之和)。
例如对于n = 4
材料,染色体可以是[0.1, 0.2, 0.3]
。我们采用0.1
第一个材料,0.2
第二个材料,0.3
第三个材料和0.4
第四个材料。
据我所知,它不一定非常有效,它只是用于比较不同的算法。因此,你可以从随机染色体开始,改变它们,丢弃最弱(最小整体值),改变它们,丢弃最弱,等等。您还可以考虑添加交叉。