分支限界法之01背包问题
来源:优易学  2011-12-10 17:17:31   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  void main()

  {

  init(7.0);

  sortpw();

  double max = bbKnapsack();

  cout<<endl<<endl<<"最大价值为:"<<max<<endl;

  }

  void init(double cc)

  {

  c = cc;

  cw = 0.0; cp = 0.0; bestp = 0.0;

  }

  void sortpw()

  {

  double pw[ARRAY_LENGTH];

  for (int i = 0; i < ARRAY_LENGTH; i++)

  {

  pw[i] = p[i] / w[i];

  }

  for (i = 0; i < ARRAY_LENGTH; i++)

  {

  double max = 0.0;

  for (int j = 0; j < ARRAY_LENGTH; j++)

  {

  if (max < pw[j])

  {

  max = pw[j];

  sort[i] = j;

  }

  }

  pw[sort[i]] = 0.0;

  }

  }

  double bound(int i)

  {

  double cleft = c - cw;

  double b = cp;

  while (i < ARRAY_LENGTH && w[sort[i]] <= cleft)

  {

  cleft -= w[sort[i]];

  b += p[sort[i]];

  i++;

  }

  if (i < ARRAY_LENGTH)

  {

  b += p[sort[i]] / w[sort[i]] * cleft;

  }

  return b;

  }

  double bbKnapsack()

  {

  int i = 0; //从0层开始

  double bestp = 0.0;

  double up = bound(0);

  while(i != ARRAY_LENGTH)

  {

  double wt = cw + w[sort[i]];

  if (wt <= c) //左儿子节点为可行节点

  {

  if (bestp < (cp+p[sort[i]]))

  {

  bestp = cp + p[sort[i]];

  }

  TreeNode *node = new TreeNode();

  initNode(*node, up, (cp+p[sort[i]]), (cw+w[sort[i]]), i+1); queue.addTail(*node);

  }

  up = bound(i+1);

  if (bestp <= up) //右儿子节点

  {

  TreeNode *node = new TreeNode();

  initNode(*node, up, cp, cw, i+1); queue.addTail(*node);

  }

  TreeNode tnode = queue.removeMax();

  cout<<tnode.weight<<"-"<<tnode.profit<<"  ";  //输出当前节点的价值(价值递增)

  cw = tnode.weight; cp = tnode.profit; up = tnode.upperProfit; i = tnode.level;

  }

  return bestp;

  }

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训