【问题标题】:C code for Branch and Bound Issue分支定界问题的 C 代码
【发布时间】:2013-04-05 23:05:53
【问题描述】:

所以我认为我在正确的轨道上使用分支定界方法来解决我的启发式 旅行问题的解决方案,然而,我的“最小”函数出现分段错误,但我仍然很难理解算法。任何解决此问题的帮助将不胜感激。基本上该功能的要求(因为我的主要功能看起来很有趣)是程序应该占用多达 150 个城市,如果它在 60 秒内读取,我会得到奖励积分(这意味着我不会失败)输入文件会看起来喜欢(例如): 1 2 1 2 300 其中“c”表示“创建城市”,“a”表示“添加边界”。这就是为什么我的程序是这样设置的。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cost=0;
int main(){
int numcity ,a[151][151],visited[151],worthless,city1,city2,distance;
char citystring[2];
  a[1][1]=0;
  while(scanf("%s",citystring) != EOF){
  if(strcmp(citystring, "c") == 0){
    scanf("%d", &worthless);
    numcity++;
    }
  else if(strcmp(citystring, "a") == 0){
    scanf("%d %d %d",&city1,&city2,&distance);
    a[city1][city2] = distance;
    a[city2][city1] = distance;
    }
  }
  mincost(1,numcity,a,visited);
  printf("The minimum cost tour is %d",cost);

  return 0;
}

int mincost(int city,int n,int a[151][151],int visited[151]){
int i,ncity;
  visited[city]=1;
  printf("%d->",city);
  ncity=least(city,n,a,visited);
  if(ncity==999999){
    ncity=1;
    printf("%d",ncity);
    cost+=a[city][ncity];
  }
  mincost(ncity,n,a,visited);
}

int least(int c,int n,int a[151][151],int visited[10]){
int i,nc=999999,min=999999,kmin;
  for(i=1;i<=n;i++){
    if((a[c][i]!=0)&&(visited[i]==0)){
      if(a[c][i]<min){
        min=a[i][1]+a[c][i];
        kmin=a[c][i];
        nc=i;
      }
    }
  }
  if(min!=999999)
    cost+=kmin;
    return nc;
}

【问题讨论】:

  • 你的代码肯定有几个问题。第一个 mincost 递归,没有任何办法退出(这就是你现在崩溃的原因)。其次,正如 Jim 所提到的,您的 for 循环 in least() 从 1 开始。可能还有其他循环,但只需一次处理一个,并根据需要添加尽可能多的 printf 跟踪。你会明白的。

标签: c branch-and-bound


【解决方案1】:

C 数组是 0 索引的,但是您的索引是从 1..n 而不是 0..(n-1) ...这就是为什么您将它们声明为 151 而不是 150?

但是你的崩溃可能是由于 mincost 无条件地调用自己。您说您认为自己走在正确的轨道上,但是在围绕算法思考时遇到了麻烦……我认为这些陈述是不一致的。在尝试编写代码之前,您应该确保您了解该算法。

【讨论】:

    【解决方案2】:

    您的程序核心转储到 mincost() 的最后一行,这是对 mincost() 的递归调用。

    崩溃的原因是你正在吹(溢出)堆栈。

    你有一个无限循环的递归等价物。

    mincost 什么时候返回?

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2016-08-25
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多