C++背包实现
C++ knapsack implementation
我的背包算法有问题。老实说,我不知道哪里出了问题。当我使用一次程序时,一切都出错了,但是当我要循环使用我的程序(用于测试)时,我遇到了很多问题。
例如:
Weight/Val 在文件中:100
最大背包容量:1000
第一次迭代:
最大利润:2597
得到的权重:994/1000
很好,但现在是另一个迭代。
第二次迭代:
最大利润:2538
最终重量:1004/1000 <- 这是我的问题,它超过了我的最大上限。
第3、4个还行,然后第5个就错了(1355/1000),依此类推
我的功能哪里可能有问题:
void intoKnapsack(int k, float actual_profit, float actual_weight)
{
if (actual_weight + weight[k] <= cap)
{
tmp[k] = 1;
if (k <= number_items)
intoKnapsack(k + 1, actual_profit + value[k], actual_weight + weight[k]);
if (((actual_profit + value[k]) > final_profit) && (k == number_items))
{
final_profit = actual_profit + value[k];
final_weight = actual_weight + weight[k];
for (j = 0; j <= k; j++)
knap[j] = tmp[j];
}
}
else if ((bound(actual_profit, actual_weight, k) >= final_profit))
{
tmp[k] = 0;
if (k <= number_items)
intoKnapsack(k + 1, actual_profit, actual_weight);
if ((actual_profit > final_profit) && (k == number_items))
{
final_profit = actual_profit;
final_weight = actual_weight;
for (j = 0; j <= k; j++)
knap[j] = tmp[j];
}
}
}
有人可以解决我的问题吗?
好的,所以当我只准备一次相同的 N(如上面示例中的 100)时,它工作正常,但是当我循环执行时:
srand((unsigned int) time(NULL));
algorytm a;
fstream wynik;
wynik.open("result.txt",ios::out | ios::app);
for(int i=0; i<how_test; i++){ //how many tests
write(how_n); //how many n in my file, and create file
a.read() //read from file (n, and weight / val)
time_start();
a.sort(); //I sort it
a.intoKnapsack(0, 0.0, 0.0); //my function above, so I give here a 3x to do it properly over and over in loop
get_time(); //stop time
measurement+=get_time();
result<<get_time()<<" s."<<endl; //just for
}
所以当我自己写时,例如写(50),然后在同一个程序中写(51)等等,它工作得很好,但是当我写(50),然后另一个写(50),然后我算法错了
也许当我进行排序时,在另一个循环中清除背包之前它不起作用,但另一方面我首先需要进行排序。
有我的排序函数
void algorytm::sort() {
int a;
int b;
float c;
for (i = 0; i < number_items; i++)
factor[i] = (float) val[i] / (float) weight[i]; //to sort from best to worst
for (i = 0; i < number_items - 1; i++) {
for (j = i + 1; j < number_items; j++) {
if (factor[i] < factor[j]) {
c = factor[i]; //
factor[i] = factor[j];
factor[j] = c;
a = val[i]; //
val[i] = val[j];
val[j] = a;
b = weight[i]; //
weight[i] = weight[j];
weight[j] = b;
}
}
}
}
我的背包算法有问题。老实说,我不知道哪里出了问题。当我使用一次程序时,一切都出错了,但是当我要循环使用我的程序(用于测试)时,我遇到了很多问题。
例如:
Weight/Val 在文件中:100
最大背包容量:1000
第一次迭代:
最大利润:2597
得到的权重:994/1000
很好,但现在是另一个迭代。
第二次迭代:
最大利润:2538
最终重量:1004/1000 <- 这是我的问题,它超过了我的最大上限。
第3、4个还行,然后第5个就错了(1355/1000),依此类推
我的功能哪里可能有问题:
void intoKnapsack(int k, float actual_profit, float actual_weight)
{
if (actual_weight + weight[k] <= cap)
{
tmp[k] = 1;
if (k <= number_items)
intoKnapsack(k + 1, actual_profit + value[k], actual_weight + weight[k]);
if (((actual_profit + value[k]) > final_profit) && (k == number_items))
{
final_profit = actual_profit + value[k];
final_weight = actual_weight + weight[k];
for (j = 0; j <= k; j++)
knap[j] = tmp[j];
}
}
else if ((bound(actual_profit, actual_weight, k) >= final_profit))
{
tmp[k] = 0;
if (k <= number_items)
intoKnapsack(k + 1, actual_profit, actual_weight);
if ((actual_profit > final_profit) && (k == number_items))
{
final_profit = actual_profit;
final_weight = actual_weight;
for (j = 0; j <= k; j++)
knap[j] = tmp[j];
}
}
}
有人可以解决我的问题吗?
好的,所以当我只准备一次相同的 N(如上面示例中的 100)时,它工作正常,但是当我循环执行时:
srand((unsigned int) time(NULL));
algorytm a;
fstream wynik;
wynik.open("result.txt",ios::out | ios::app);
for(int i=0; i<how_test; i++){ //how many tests
write(how_n); //how many n in my file, and create file
a.read() //read from file (n, and weight / val)
time_start();
a.sort(); //I sort it
a.intoKnapsack(0, 0.0, 0.0); //my function above, so I give here a 3x to do it properly over and over in loop
get_time(); //stop time
measurement+=get_time();
result<<get_time()<<" s."<<endl; //just for
}
所以当我自己写时,例如写(50),然后在同一个程序中写(51)等等,它工作得很好,但是当我写(50),然后另一个写(50),然后我算法错了
也许当我进行排序时,在另一个循环中清除背包之前它不起作用,但另一方面我首先需要进行排序。
有我的排序函数
void algorytm::sort() {
int a;
int b;
float c;
for (i = 0; i < number_items; i++)
factor[i] = (float) val[i] / (float) weight[i]; //to sort from best to worst
for (i = 0; i < number_items - 1; i++) {
for (j = i + 1; j < number_items; j++) {
if (factor[i] < factor[j]) {
c = factor[i]; //
factor[i] = factor[j];
factor[j] = c;
a = val[i]; //
val[i] = val[j];
val[j] = a;
b = weight[i]; //
weight[i] = weight[j];
weight[j] = b;
}
}
}
}