import
java.util.*;
class
GFG {
static
void
swap(List<Integer> assignment,
int
left,
int
right)
{
int
temp = assignment.get(left);
assignment.set(left, assignment.get(right));
assignment.set(right, temp);
}
static
void
reverse(List<Integer> assignment,
int
left,
int
right)
{
while
(left < right) {
swap(assignment, left, right);
left++;
right--;
}
}
static
boolean
next_permutation(List<Integer> assignment)
{
int
size = assignment.size();
if
(size <=
1
)
return
false
;
int
last = size -
2
;
while
(last >=
0
) {
if
(assignment.get(last) < assignment.get(last +
1
)) {
break
;
}
last--;
}
if
(last <
0
)
return
false
;
int
nextGreater = size -
1
;
for
(
int
i = size -
1
; i > last; i--) {
if
(assignment.get(i) > assignment.get(last)) {
nextGreater = i;
break
;
}
}
swap(assignment, nextGreater, last);
reverse(assignment, last +
1
, size -
1
);
return
true
;
}
static
int
calculateTotalCost(List<List<Integer> > facilities,
List<List<Integer> > locations,
List<Integer> assignment)
{
int
totalCost =
0
;
int
n = facilities.size();
for
(
int
i =
0
; i < n; i++) {
for
(
int
j =
0
; j < n; j++) {
int
facility1 = assignment.get(i);
int
facility2 = assignment.get(j);
int
location1 = i;
int
location2 = j;
totalCost += facilities.get(facility1).get(facility2)
*locations.get(location1).get(location2);
}
}
return
totalCost;
}
public
static
void
main(String[] args)
{
List<List<Integer> > facilities
= Arrays.asList(Arrays.asList(
0
,
2
,
3
,
1
),
Arrays.asList(
2
,
0
,
1
,
4
),
Arrays.asList(
3
,
1
,
0
,
2
),
Arrays.asList(
1
,
4
,
2
,
0
));
List<List<Integer> > locations
= Arrays.asList(Arrays.asList(
0
,
1
,
2
,
3
),
Arrays.asList(
1
,
0
,
4
,
2
),
Arrays.asList(
2
,
4
,
0
,
1
),
Arrays.asList(
3
,
2
,
1
,
0
));
int
n = facilities.size();
List<Integer> assignment =
new
ArrayList<>();
for
(
int
i =
0
; i < n; i++) {
assignment.add(i);
}
int
minCost = calculateTotalCost(facilities, locations, assignment);
List<Integer> minAssignment = assignment;
while
(next_permutation(assignment)) {
int
cost = calculateTotalCost(facilities, locations, assignment);
if
(cost < minCost) {
minCost = cost;
minAssignment = assignment;
}
}
System.out.print(
"Optimal Assignment: "
);
for
(
int
i =
0
; i < n; i++) {
System.out.print(
"F"
+ (minAssignment.get(i) +
1
) +
"->L"
+ (i +
1
) +
" "
);
}
System.out.print(
"\nTotal Cost: "
+ minCost);
}
}