运筹学指派问题的匈牙利法Word文档下载推荐.docx
- 文档编号:13476965
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:18
- 大小:85.07KB
运筹学指派问题的匈牙利法Word文档下载推荐.docx
《运筹学指派问题的匈牙利法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《运筹学指派问题的匈牙利法Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
2.算法流程或步骤:
1.将原始效益矩阵C的每行、每列各元素都依次减去该行、该列的最小元素,使每行、每列都至少出现一个0元素,以构成等价的效益矩阵C’。
2.圈0元素。
在C’中未被直线通过的含0元素最少的行(或列)中圈出一个0元素,通过这个0元素作一条竖(或横)线。
重复此步,若这样能圈出不同行不同列的n个0元素,转第四步,否则转第三步。
3.调整效益矩阵。
在C’中未被直线穿过的数集D中,找出最小的数d,D中所有数都减去d,C’中两条直线相交处的数都加的d。
去掉直线,组成新的等价效益矩阵仍叫C’,返回第二步。
4.令被圈0元素对应位置的=1,其余=0,这就是一种最优分配。
最低总耗费是C中使=1的各位置上各元素的和。
算法流程图:
Y
N
3.算法源程序:
#include<
iostream.h>
typedefstructmatrix
{
floatcost[101][101];
intzeroelem[101][101];
floatcostforout[101][101];
intmatrixsize;
intpersonnumber;
intjobnumber;
}matrix;
matrixsb;
intresult[501][2];
voidtwozero(matrix&
sb);
voidjudge(matrix&
sb,intresult[501][2]);
voidrefresh(matrix&
voidcirclezero(matrix&
matrixinput();
voidoutput(intresult[501][2],matrixsb);
voidzeroout(matrix&
matrixinput()
matrixsb;
intm;
intpnumber,jnumber;
inti,j;
floatk;
charw;
cout<
<
"
指派问题的匈牙利解法:
endl;
求最大值,请输入1;
求最小值,请输入0:
cin>
>
m;
while(m!
=1&
&
m!
=0)
{
cout<
请输入1或0:
cin>
}
请输入人数(人数介于1和100之间):
pnumber;
while(pnumber<
1||pnumber>
100)
{
请输入合法数据:
请输入工作数(介于1和100之间):
jnumber;
while(jnumber<
1||jnumber>
请输入"
pnumber<
行"
jnumber<
列的矩阵,同一行内以空格间隔,不同行间以回车分隔,以$结束输入:
\n"
;
for(i=1;
i<
=pnumber;
i++)
for(j=1;
j<
=jnumber;
j++)
{
cin>
sb.cost[i][j];
sb.costforout[i][j]=sb.cost[i][j];
}
w;
if(jnumber>
pnumber)
for(i=pnumber+1;
for(j=1;
{
sb.cost[i][j]=0;
sb.costforout[i][j]=0;
}
else
if(pnumber>
jnumber)
for(i=1;
for(j=jnumber+1;
{
sb.cost[i][j]=0;
sb.costforout[i][j]=0;
}
sb.matrixsize=pnumber;
if(pnumber<
sb.matrixsize=jnumber;
sb.personnumber=pnumber;
sb.jobnumber=jnumber;
if(m==1)
k=0;
for(i=1;
=sb.matrixsize;
if(sb.cost[i][j]>
k)
k=sb.cost[i][j];
sb.cost[i][j]=k-sb.cost[i][j];
returnsb;
}
sb)
intp;
for(i=0;
sb.cost[i][0]=0;
for(j=1;
sb.cost[0][j]=0;
if(sb.cost[i][j]==0)
sb.cost[i][0]++;
sb.cost[0][j]++;
sb.cost[0][0]++;
for(j=0;
sb.zeroelem[i][j]=0;
k=sb.cost[0][0]+1;
while(sb.cost[0][0]<
k=sb.cost[0][0];
if(sb.cost[i][0]==1)
for(j=1;
if(sb.cost[i][j]==0&
sb.zeroelem[i][j]==0)
break;
sb.zeroelem[i][j]=1;
sb.cost[i][0]--;
sb.cost[0][j]--;
sb.cost[0][0]--;
if(sb.cost[0][j]>
0)
for(p=1;
p<
p++)
if(sb.cost[p][j]==0&
sb.zeroelem[p][j]==0)
{
sb.zeroelem[p][j]=2;
sb.cost[p][0]--;
sb.cost[0][j]--;
sb.cost[0][0]--;
}
if(sb.cost[0][j]==1)
for(i=1;
if(sb.cost[i][0]>
if(sb.cost[i][p]==0&
sb.zeroelem[i][p]==0)
sb.zeroelem[i][p]=2;
sb.cost[i][0]--;
sb.cost[0][p]--;
if(sb.cost[0][0]>
twozero(sb);
judge(sb,result);
intp,q;
intm,n;
matrixst;
if(sb.cost[i][0]>
break;
if(i<
=sb.matrixsize)
st=sb;
if(sb.cost[i][j]==0&
for(q=1;
q<
q++)
if(sb.cost[i][q]==0&
sb.zeroelem[i][q]==0)
{
sb.zeroelem[i][q]=2;
sb.cost[i][0]--;
sb.cost[0][q]--;
sb.cost[0][0]--;
}
for(p=1;
if(sb.cost[p][j]==0&
sb.zeroelem[p][j]=2;
sb.cost[p][0]--;
sb.cost[0][j]--;
k=sb.cost[0][0]+1;
while(sb.cost[0][0]<
k=sb.cost[0][0];
for(p=i+1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运筹学 指派 问题 匈牙利