# 分支定界法

 j1 j2 j3 j4 j5 A 13 11 10 4 7 B 13 10 10 8 5 C 5 9 7 7 4 D 15 12 10 11 5 E 10 11 8 8 4

program PlanJob;

const MAX_SIZE = 20;

type
TIntArray = array[1..MAX_SIZE] of Integer;
PNode = ^Node;
Node = record
Job2Man: TIntArray;     // Job2Man[n] = m, job-n assign to person-m
Man2Job: TIntArray;    // Man2Job[n] = m, person-n assign to job-m
UpperVal: Integer; // upper value
JobsDep: Integer;   // jobs decided, as search depth
Next: PNode;
end;

var
CurNode: PNode;      // Current node
NewNode: PNode;      // New branch node
DelNode: PNode;      // for delete
GoalNode: PNode;     // the goal
GoalMaxVal: Integer; // goal max value
CurMan, CurJob: Integer;     // Current Man and Job of current Node

Size: Integer;       // Person number, also task number
Values: array[1..MAX_SIZE, 1..MAX_SIZE] of Integer;

function CalUpperValue(ANode: PNode): Integer;
var
Res: Integer;
Man, Job: Integer;
JobMaxVal: Integer;
begin
Res := 0;
with ANode^ do
begin
for Job := 1 to Size do
begin
if Job <= JobsDep then
begin
Man := Job2Man[Job];
Res := Res + Values[Man, Job];
Continue;
end;

// else find the max value for Job
JobMaxVal := 0;
for Man := 1 to Size do
begin
if (JobMaxVal < Values[Man,Job]) and (Man2Job[Man] = 0) then
JobMaxVal := Values[Man,Job];
end;
Res := Res + JobMaxVal;
end;    // for Job
end;    // with ANode^
CalUpperValue := Res;
end;

function InitNode(): PNode;
var
Man, Job: Integer;
FInput: Text;
Res: PNode;
begin
Assign(FInput, 'input.txt');
Reset(FInput);
for Man := 1 to Size do
begin
for Job := 1 to Size do
end;

New(Res);
with Res^ do
begin
for Man := 1 to Size do
begin
Man2Job[Man] := 0;
Job2Man[Man] := 0;
end;
JobsDep := 0;
UpperVal := CalUpperValue(Res);
Next := nil;
end;
InitNode := Res;
end;

procedure Insert(ANode: PNode; From: PNode);
var
PrevNode, NextNode: PNode;
begin
NextNode := From;
repeat
PrevNode := NextNode;
NextNode := PrevNode^.Next;
until (NextNode = nil) or (ANode^.UpperVal >= NextNode^.UpperVal);
PrevNode^.Next := ANode;
ANode^.Next := NextNode;
end;

procedure PrintNode(ANode: PNode);
var
Man, Job: Integer;
AllJobAssigned: Boolean;
begin
AllJobAssigned := true;
for Job := 1 to Size do
begin
Man := ANode^.Job2Man[Job];
if 0 <> Man then
Writeln('Job ', Job, ' assign to man ',
Man, ', value ', Values[Man, Job])
else
AllJobAssigned := false;
end;
Writeln;
if AllJobAssigned then
Writeln('Value = ', ANode^.UpperVal)
else
Writeln('UpperVal = ', ANode^.UpperVal);
end;

begin
CurNode := InitNode();
GoalMaxVal := 0;

repeat
CurJob := CurNode^.JobsDep + 1;
for CurMan := 1 to Size do
begin
if CurNode^.Man2Job[CurMan] <> 0 then
Continue;

// New search branch
New(NewNode);
NewNode^ := CurNode^;
NewNode^.JobsDep := CurJob;
NewNode^.Man2Job[CurMan] := CurJob;
NewNode^.Job2Man[CurJob] := CurMan;
NewNode^.UpperVal := CalUpperValue(NewNode);

if NewNode^.UpperVal < GoalMaxVal then
Dispose(NewNode)        // discard this branch if smaller than limit
else
Insert(NewNode, CurNode);

if CurJob < Size then Continue;   // for CurMan

// all job assigned, update goal
if NewNode^.UpperVal > GoalMaxVal then
begin
GoalNode := NewNode;
GoalMaxVal := GoalNode^.UpperVal
end;  // if
end;    // for CurMan

DelNode := CurNode;
CurNode := CurNode^.Next;
Dispose(DelNode);
until (CurNode^.UpperVal <= GoalMaxVal)
or (CurNode = nil);    // end of repeat

PrintNode(GoalNode);
end.

input.txt:

5
13     11     10     4     7
13     10     10     8     5
5     9     7     7     4
15     12     10     11     5
10     11     8     8     4

output:

Job 1 assign to man 4, value 15
Job 2 assign to man 5, value 11
Job 3 assign to man 2, value 10
Job 4 assign to man 3, value 7
Job 5 assign to man 1, value 7

Value = 50

input.txt:
10
13     11     10     4     7    13     11     10     4     7
13     10     10     8     5       13     10     10     8     5
5     9     7     7     4       5     9     7     7     4
15     12     10     11     5       15     12     10     11     5
10     11     8     8     4       10     11     8     8     4
13     11     10     4     7    13     11     10     4     7
13     10     10     8     5       13     10     10     8     5
5     9     7     7     4       5     9     7     7     4
15     12     10     11     5       15     12     10     11     5
10     11     8     8     4       10     11     8     8     4

output :
Job 1 assign to man 9, value 15
Job 2 assign to man 5, value 11
Job 3 assign to man 2, value 10
Job 4 assign to man 8, value 7
Job 5 assign to man 6, value 7
Job 6 assign to man 4, value 15
Job 7 assign to man 10, value 11
Job 8 assign to man 7, value 10
Job 9 assign to man 3, value 7
Job 10 assign to man 1, value 7

Value = 100
• 本文已收录于以下专栏：

## 分支定界算法求解带有约束条件的最短路径问题

• u013527937
• 2016年12月21日 17:04
• 2000

## 五大常用算法之分支定界法

• feiyangtianyao
• 2014年06月29日 16:51
• 9948

## 分支定界算法（Branch and Bound）

• cocopang324
• 2013年12月18日 23:57
• 3993

## 分支定界算法源程序

• 2012年08月29日 15:33
• 3KB
• 下载

## 搜索与回溯 5.6

• SSL_ZZY
• 2016年11月24日 16:06
• 318

## 分支定界法

• jq0123
• 2006年05月30日 11:11
• 8668

## 假设系统按单值方式运行且采用最短作业优先算法，有J1,J2,J3,J4共4个作业同时到达，则以下哪几种情况下的平均周转时间为10分钟?

• chengonghao
• 2016年08月09日 10:35
• 1226

## 回溯法和分支定界法

• Mind_V
• 2017年06月26日 16:22
• 684

## 分支定界法——旅行商(TSP)问题

• Mind_V
• 2017年07月01日 12:56
• 856

## Mate－基于标签的框架

Mate 将会成为Flex领域的另一个热点。它使用设置（configuration）来调用Service，处理结果，同样也使用设置文件来更新绑定对象（Bindable object）。从某个角度来说：...
• babylon_0049
• 2011年06月18日 16:20
• 461

举报原因： 您举报文章：分支定界法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)