声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1953|回复: 1

[C/C++] 求运筹学0-1整数规划问题程序

[复制链接]
发表于 2007-5-8 10:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
求运筹学0-1整数规划问题程序
谢谢! fanweny1@163.com
回复
分享到:

使用道具 举报

发表于 2007-5-10 01:58 | 显示全部楼层
用元素分配法求解0-1整数规划问题,VC程序

  1. // ElementAlloc.cpp: implementation of the CElementAlloc class.
  2. //
  3. //////////////////////////////////////////////////////////////////////

  4. #include "stdafx.h"
  5. #include "..\..\INCLUDE\ElementAlloc.h"
  6. #include "..\..\INCLUDE\TianjiDataType.h"

  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif

  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////

  15. CElementAlloc::CElementAlloc()
  16. {

  17. }

  18. CElementAlloc::~CElementAlloc()
  19. {

  20. }

  21. /****************************求检验数函数,未加入对异常值的处理**************************************/
  22. void CElementAlloc::ReckonVerify(int nWorkNum, int nWorkerNum, double* ptValue, int* ptVerify)
  23. {
  24.     int i = 0, j = 0, k = 0, l = 0;
  25.     for(i = 0; i < nWorkerNum; i++)
  26.     {
  27.         for(j = 0; j < nWorkNum; j++)
  28.         {
  29.             int ndx = 0;
  30.             for(l = (-1) * i; l < nWorkerNum - i; l++)
  31.             {
  32.                 if(l)
  33.                 {
  34.                     for(k = (-1) * j; k < nWorkNum - j; k++)
  35.                     {
  36.                         /*************求每个元素的检验数************/
  37.                         if(k && (ptValue[i * nWorkNum + j] + ptValue[(i + l) * nWorkNum + j + k]
  38.                             - ptValue[i * nWorkNum + j + k] - ptValue[(i + l) * nWorkNum + j] < 0))
  39.                             ndx++;
  40.                     }
  41.                 }
  42.             }
  43.             ptVerify[i * nWorkNum + j] = ndx;
  44.         }
  45.     }
  46. }

  47. /************************************根据检验数求指派问题的解********************************************************/
  48. void CElementAlloc::ElementAlloc(int nWorkNum, int nWorkerNum,double* ptValue, struct ALLOCPROJECT* ptAllocProject)
  49. {
  50.     int i = 0, j = 0, nProjectNum = 0, nTemp = 0;
  51.     double ftTemp = 1000.0;
  52.     int* ptVerify = new int[nWorkNum * nWorkerNum];

  53.     ReckonVerify(nWorkNum, nWorkerNum, ptValue, ptVerify);

  54.     nProjectNum = nWorkNum;
  55.     if(nWorkNum > nWorkerNum)nProjectNum = nWorkerNum;
  56.     for(int k = 0; k < nProjectNum; k++)
  57.     {
  58.         nTemp = 0;
  59.         ftTemp = 1000.0;
  60.         for(i = 0; i < nWorkerNum; i++)
  61.         {
  62.             for(j = 0; j < nWorkNum; j++)
  63.             {
  64.                 if(nTemp <= ptVerify[i * nWorkNum + j])nTemp = ptVerify[i * nWorkNum + j]; //找出值最大的检验数
  65.             }
  66.         }
  67.         for(i = 0; i < nWorkerNum; i++)
  68.         {
  69.             for(j = 0; j < nWorkNum; j++)
  70.             {
  71.                 if(nTemp == ptVerify[i * nWorkNum + j])
  72.                 {
  73.                     //若有多个同时为最大的检验数,则选择消费值最小的
  74.                     if(ftTemp > ptValue[i * nWorkNum + j])
  75.                     {
  76.                         ptAllocProject[k].nWorkNO = j;
  77.                         ptAllocProject[k].nWorkerNO = i;
  78.                         ftTemp = ptValue[i * nWorkNum + j];
  79.                     }
  80.                 }
  81.             }
  82.         }
  83.         /***********************将找出的检验数对应的行和列划去************************/
  84.         for(i = 0; i < nWorkerNum; i++)
  85.             ptVerify[i * nWorkNum + ptAllocProject[k].nWorkNO] = -1;
  86.         for(j = 0; j < nWorkNum; j++)
  87.             ptVerify[ptAllocProject[k].nWorkerNO * nWorkNum + j] = -1;
  88.     }
  89.     delete []ptVerify;

  90. }
复制代码
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 20:52 , Processed in 0.052872 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表