0c8ce2b0
Pedro Roque
missing files
|
1
2
3
4
|
/*
* market_split.c
*
* Created on: 17/04/2017
|
4d26a735
Pedro Roque
Increased recogni...
|
5
|
* Author: Pedro
|
0c8ce2b0
Pedro Roque
missing files
|
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
*
* https://github.com/MiniZinc/minizinc-benchmarks/tree/master/market_split
*
* Market Split problem:
* A large company has two divisions D1 and D2. The company supplies retailers with several products.
* The goal is to allocate each retailer to either division D1 or D2 so that D1 controls A% of the
* company’s market for each product and D2 the remaining (100-A)%.
*/
#include "market_split.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../config.h"
|
4d26a735
Pedro Roque
Increased recogni...
|
23
|
#include "../constraints/int_lin_eq.h"
|
0c8ce2b0
Pedro Roque
missing files
|
24
25
26
27
|
#include "../split.h"
#include "../variables.h"
// s4-07 11s
|
4d26a735
Pedro Roque
Increased recogni...
|
28
29
30
31
|
int prods_s4_07[124] = { 43, 19, 59, 97, 14, 19, 44, 90, 57, 74, 83, 66, 95, 24, 91, 49, 59, 89, 54, 90, 71, 69, 49, 19, 72, 97, 9, 19, 75, 79, 887, 63, 19, 99,
74, 68, 13, 45, 65, 55, 3, 39, 38, 21, 87, 63, 12, 36, 74, 54, 42, 64, 77, 12, 66, 96, 36, 63, 5, 55, 39, 741, 85, 70, 10, 84, 96, 78, 49, 42, 43, 56,
97, 35, 94, 18, 22, 9, 83, 10, 35, 89, 53, 52, 66, 17, 18, 63, 53, 33, 20, 60, 770, 24, 57, 83, 34, 41, 79, 65, 42, 73, 60, 98, 70, 47, 45, 41, 21, 54,
24, 32, 90, 13, 37, 42, 79, 54, 12, 94, 59, 45, 67, 791 };
|
0c8ce2b0
Pedro Roque
missing files
|
32
33
|
// s4-10 7s
|
4d26a735
Pedro Roque
Increased recogni...
|
34
35
36
37
|
int prods_s4_10[124] = { 85, 34, 12, 48, 19, 5, 72, 46, 11, 82, 83, 28, 18, 42, 13, 97, 27, 41, 66, 81, 4, 14, 11, 83, 21, 47, 82, 8, 83, 31, 647, 15, 68, 17,
79, 16, 36, 85, 40, 82, 96, 74, 66, 76, 44, 60, 89, 93, 39, 82, 59, 72, 38, 25, 84, 21, 46, 31, 3, 6, 14, 778, 86, 22, 82, 3, 1, 50, 39, 38, 42, 74, 34,
68, 92, 62, 12, 52, 3, 58, 43, 38, 17, 15, 76, 95, 99, 50, 41, 83, 53, 48, 738, 49, 92, 22, 84, 95, 23, 86, 87, 62, 29, 61, 48, 49, 53, 63, 14, 57, 66,
72, 52, 4, 41, 67, 33, 88, 19, 83, 82, 2, 88, 835 };
|
0c8ce2b0
Pedro Roque
missing files
|
38
39
|
// s5-01
|
4d26a735
Pedro Roque
Increased recogni...
|
40
41
42
43
44
45
|
int prods_s5_01[205] = { 84, 56, 81, 19, 36, 26, 40, 62, 84, 69, 42, 86, 10, 88, 66, 43, 98, 1, 34, 33, 75, 40, 80, 66, 32, 0, 36, 18, 11, 69, 70, 47, 77, 51,
66, 66, 77, 58, 80, 14, 1045, 79, 23, 52, 90, 63, 18, 33, 61, 71, 67, 46, 98, 59, 78, 16, 91, 30, 53, 9, 93, 74, 79, 41, 52, 82, 59, 18, 12, 70, 50, 26,
49, 73, 78, 39, 88, 48, 25, 1, 72, 1083, 44, 99, 70, 4, 78, 87, 95, 8, 92, 5, 2, 66, 36, 95, 70, 71, 6, 40, 83, 76, 91, 61, 26, 16, 91, 17, 5, 91, 94,
6, 63, 39, 6, 86, 43, 84, 25, 90, 44, 17, 1061, 95, 98, 83, 84, 45, 6, 55, 52, 46, 38, 80, 37, 51, 58, 54, 42, 76, 59, 33, 70, 17, 97, 61, 23, 35, 56,
59, 60, 47, 4, 77, 94, 54, 12, 78, 0, 18, 33, 4, 17, 1004, 23, 84, 54, 74, 95, 60, 68, 71, 71, 2, 93, 89, 51, 7, 64, 38, 63, 76, 98, 10, 32, 27, 5, 86,
39, 35, 86, 10, 69, 42, 27, 44, 27, 33, 71, 74, 94, 39, 97, 17, 1072 };
|
0c8ce2b0
Pedro Roque
missing files
|
46
47
|
// s5-02
|
4d26a735
Pedro Roque
Increased recogni...
|
48
49
50
51
52
53
|
int prods_s5_02[205] = { 90, 48, 36, 47, 54, 19, 38, 78, 32, 25, 59, 63, 23, 20, 63, 89, 53, 0, 38, 31, 30, 46, 65, 4, 61, 6, 34, 93, 20, 81, 18, 10, 30, 6, 10,
84, 77, 48, 14, 9, 826, 25, 74, 24, 49, 46, 88, 90, 0, 40, 80, 83, 70, 27, 49, 26, 40, 55, 13, 34, 76, 94, 4, 38, 76, 10, 0, 61, 39, 1, 27, 49, 26, 1,
25, 27, 0, 65, 18, 52, 5, 803, 98, 35, 27, 77, 84, 54, 18, 92, 67, 4, 20, 13, 60, 58, 90, 22, 11, 3, 61, 12, 30, 10, 38, 84, 88, 18, 84, 53, 36, 36, 59,
86, 71, 86, 16, 8, 40, 86, 0, 59, 947, 90, 20, 73, 2, 30, 15, 24, 41, 18, 85, 5, 48, 48, 96, 32, 36, 14, 68, 89, 2, 56, 48, 88, 28, 87, 56, 88, 27, 42,
40, 39, 84, 60, 64, 86, 42, 79, 10, 36, 97, 996, 96, 41, 45, 44, 89, 30, 80, 3, 50, 21, 5, 7, 70, 46, 87, 9, 2, 75, 88, 45, 15, 27, 29, 27, 91, 68, 69,
70, 78, 57, 19, 26, 99, 17, 22, 88, 47, 54, 44, 97, 988 };
|
0c8ce2b0
Pedro Roque
missing files
|
54
55
|
// s5-03
|
4d26a735
Pedro Roque
Increased recogni...
|
56
57
58
59
60
61
|
int prods_s5_03[205] = { 59, 76, 99, 90, 14, 94, 72, 85, 16, 45, 4, 22, 79, 24, 85, 34, 34, 29, 85, 81, 3, 24, 85, 72, 93, 91, 14, 16, 61, 73, 87, 21, 1, 86,
63, 67, 33, 35, 4, 49, 1052, 33, 8, 71, 64, 33, 57, 50, 67, 38, 35, 1, 93, 59, 38, 66, 5, 29, 32, 73, 91, 57, 61, 64, 58, 99, 79, 25, 32, 67, 29, 34, 0,
38, 57, 16, 23, 66, 67, 90, 5, 955, 2, 91, 98, 14, 81, 16, 71, 11, 0, 44, 54, 57, 57, 18, 15, 57, 49, 92, 41, 16, 22, 27, 16, 12, 85, 33, 35, 51, 52,
77, 8, 54, 21, 59, 20, 2, 27, 91, 13, 28, 808, 36, 19, 85, 93, 37, 53, 2, 39, 45, 96, 55, 19, 23, 24, 31, 8, 9, 18, 12, 61, 96, 20, 15, 17, 31, 36, 19,
59, 27, 85, 87, 15, 4, 24, 61, 94, 77, 63, 33, 75, 851, 59, 88, 94, 35, 12, 26, 95, 21, 44, 7, 82, 92, 80, 50, 9, 63, 38, 81, 22, 65, 66, 61, 33, 70,
86, 94, 16, 15, 9, 49, 90, 69, 90, 85, 56, 54, 63, 51, 28, 59, 1103 };
|
0c8ce2b0
Pedro Roque
missing files
|
62
63
|
// s5-04
|
4d26a735
Pedro Roque
Increased recogni...
|
64
65
66
67
68
69
|
int prods_s5_04[205] = { 70, 50, 88, 54, 8, 35, 3, 95, 44, 26, 87, 12, 69, 26, 70, 42, 55, 5, 80, 96, 0, 15, 90, 25, 39, 19, 84, 42, 47, 24, 98, 17, 75, 38, 23,
35, 25, 26, 30, 69, 918, 4, 70, 82, 25, 96, 4, 19, 3, 62, 99, 99, 14, 66, 89, 39, 57, 8, 24, 51, 7, 0, 49, 24, 75, 88, 99, 62, 13, 25, 93, 83, 81, 63,
17, 6, 11, 21, 77, 15, 83, 951, 76, 14, 97, 94, 56, 37, 52, 64, 13, 3, 72, 13, 53, 48, 41, 93, 48, 3, 58, 25, 48, 41, 59, 11, 58, 17, 75, 32, 95, 42,
15, 71, 56, 65, 18, 64, 54, 70, 29, 67, 973, 73, 53, 80, 78, 53, 73, 23, 53, 77, 82, 79, 25, 75, 38, 89, 86, 7, 16, 18, 2, 58, 85, 26, 66, 2, 44, 31,
56, 14, 12, 75, 39, 17, 56, 70, 22, 81, 93, 76, 10, 1006, 27, 7, 36, 3, 45, 77, 89, 52, 45, 59, 7, 55, 44, 33, 21, 99, 77, 4, 55, 91, 16, 31, 82, 85,
39, 4, 8, 20, 98, 84, 31, 77, 91, 19, 80, 88, 48, 21, 92, 45, 992 };
|
0c8ce2b0
Pedro Roque
missing files
|
70
71
|
// s5-05
|
4d26a735
Pedro Roque
Increased recogni...
|
72
73
74
75
76
77
|
int prods_s5_05[205] = { 53, 69, 50, 99, 91, 48, 93, 7, 65, 4, 41, 39, 51, 94, 50, 40, 74, 89, 58, 95, 46, 16, 8, 79, 83, 13, 74, 50, 7, 64, 1, 12, 85, 51, 11,
29, 99, 57, 36, 16, 1023, 61, 30, 7, 64, 24, 57, 56, 50, 46, 14, 45, 45, 83, 6, 24, 18, 71, 50, 20, 30, 67, 21, 42, 52, 72, 6, 33, 23, 63, 70, 39, 76,
0, 46, 40, 76, 56, 97, 26, 54, 880, 63, 24, 99, 98, 30, 75, 16, 53, 78, 89, 83, 45, 10, 25, 49, 35, 31, 35, 58, 46, 5, 50, 22, 57, 48, 15, 33, 4, 12,
11, 11, 75, 87, 62, 74, 69, 90, 42, 22, 68, 949, 31, 5, 65, 94, 31, 66, 29, 14, 1, 87, 13, 6, 89, 35, 15, 38, 50, 48, 94, 14, 12, 5, 42, 99, 68, 16, 69,
58, 10, 91, 78, 94, 49, 43, 88, 80, 9, 17, 46, 11, 905, 56, 59, 69, 46, 47, 85, 36, 49, 85, 30, 64, 49, 88, 58, 49, 8, 74, 70, 18, 36, 13, 96, 30, 62,
91, 18, 94, 52, 87, 41, 15, 96, 52, 37, 94, 51, 22, 30, 1, 59, 1058 };
|
0c8ce2b0
Pedro Roque
missing files
|
78
79
80
81
|
/*
* Solve one of the above Market Split problems
*/
|
4d26a735
Pedro Roque
Increased recogni...
|
82
|
void run_market_split(char *csp_inst_name) {
|
0c8ce2b0
Pedro Roque
missing files
|
83
84
85
|
int n;
int k;
unsigned long result;
|
4d26a735
Pedro Roque
Increased recogni...
|
86
87
|
int *prods;
unsigned int *divs;
|
0c8ce2b0
Pedro Roque
missing files
|
88
89
|
int i;
|
4d26a735
Pedro Roque
Increased recogni...
|
90
|
if (!strcmp(csp_inst_name, "s4-07")) {
|
0c8ce2b0
Pedro Roque
missing files
|
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
k = 30;
n = 4;
prods = prods_s4_07;
} else if (!strcmp(csp_inst_name, "s4-10")) {
k = 30;
n = 4;
prods = prods_s4_10;
} else if (!strcmp(csp_inst_name, "s5-01")) {
k = 40;
n = 5;
prods = prods_s5_01;
} else if (!strcmp(csp_inst_name, "s5-02")) {
k = 40;
n = 5;
prods = prods_s5_02;
} else if (!strcmp(csp_inst_name, "s5-03")) {
k = 40;
n = 5;
prods = prods_s5_03;
} else if (!strcmp(csp_inst_name, "s5-04")) {
k = 40;
n = 5;
prods = prods_s5_04;
} else if (!strcmp(csp_inst_name, "s5-05")) {
k = 40;
n = 5;
prods = prods_s5_05;
} else {
printf("\n%s Market Split problem is not available. Please select an instance from \"csps/market_split.c\" file.\n", csp_inst_name);
return;
}
|
4d26a735
Pedro Roque
Increased recogni...
|
123
|
divs = malloc((unsigned long) k * sizeof(unsigned int));
|
0c8ce2b0
Pedro Roque
missing files
|
124
125
126
127
128
129
|
for (i = 0; i < k; i++) {
divs[i] = v_new_range(0, 1, true);
}
for (i = 0; i < n; i++) {
|
4d26a735
Pedro Roque
Increased recogni...
|
130
131
|
c_int_lin_eq(&prods[(unsigned int) i * ((unsigned int) k + 1)], divs, (unsigned int) k,
prods[(unsigned int) i * ((unsigned int) k + 1) + (unsigned int) k]);
|
0c8ce2b0
Pedro Roque
missing files
|
132
133
134
135
136
137
138
139
140
141
142
143
144
|
}
if (FINDING_ONE_SOLUTION) {
printf("\nFinding one solution for %s Market Split problem with %d retailers and %d products per retailer.\n", csp_inst_name, n, k);
} else {
printf("\nCounting all the solutions for %s Market Split problem with %d retailers and %d products per retailer.\n", csp_inst_name, n, k);
}
// Solve the CSP
result = solve_CSP();
if (FINDING_ONE_SOLUTION && result == 1) {
printf("Solution:\n");
|
4d26a735
Pedro Roque
Increased recogni...
|
145
|
vs_print_single_val(divs, (unsigned int) k, 0);
|
0c8ce2b0
Pedro Roque
missing files
|
146
147
148
149
150
151
152
|
printf("\n");
} else {
printf("%lu solution(s) found\n", result);
}
free(divs);
}
|