94b2b13d
Pedro Roque
PHACT source
|
1
2
3
4
|
/*
* market_split.c
*
* Created on: 17/04/2017
|
4d26a735
Pedro Roque
Increased recogni...
|
5
|
* Author: pedro
|
94b2b13d
Pedro Roque
PHACT source
|
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/linear.h"
|
94b2b13d
Pedro Roque
PHACT source
|
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 ,
|
94b2b13d
Pedro Roque
PHACT source
|
32
33
|
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 };
|
4d26a735
Pedro Roque
Increased recogni...
|
34
35
36
37
|
// s4-10 7s
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 ,
|
94b2b13d
Pedro Roque
PHACT source
|
38
39
|
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 };
|
4d26a735
Pedro Roque
Increased recogni...
|
40
41
42
43
44
45
|
// s5-01
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 ,
|
94b2b13d
Pedro Roque
PHACT source
|
46
47
|
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 };
|
4d26a735
Pedro Roque
Increased recogni...
|
48
49
50
51
52
53
|
// s5-02
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 ,
|
94b2b13d
Pedro Roque
PHACT source
|
54
55
|
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 };
|
4d26a735
Pedro Roque
Increased recogni...
|
56
57
58
59
60
61
|
// s5-03
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 ,
|
94b2b13d
Pedro Roque
PHACT source
|
62
63
|
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 };
|
4d26a735
Pedro Roque
Increased recogni...
|
64
65
66
67
68
69
|
// s5-04
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 ,
|
94b2b13d
Pedro Roque
PHACT source
|
70
71
|
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 };
|
4d26a735
Pedro Roque
Increased recogni...
|
72
73
74
75
76
77
|
// s5-05
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 ,
|
94b2b13d
Pedro Roque
PHACT source
|
78
79
80
81
|
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 };
/*
|
4d26a735
Pedro Roque
Increased recogni...
|
82
|
* Solve one of the above Market Split problems
|
94b2b13d
Pedro Roque
PHACT source
|
83
84
85
|
*/
void run_market_split(char* csp_inst_name) {
int n;
|
4d26a735
Pedro Roque
Increased recogni...
|
86
87
|
int k;
unsigned long result;
|
94b2b13d
Pedro Roque
PHACT source
|
88
89
|
int* prods;
unsigned int* divs;
|
4d26a735
Pedro Roque
Increased recogni...
|
90
|
int i;
|
94b2b13d
Pedro Roque
PHACT source
|
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
|
if (!strcmp(csp_inst_name, "s4-07")) {
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
|
}
|
94b2b13d
Pedro Roque
PHACT source
|
124
125
126
127
128
129
|
divs = malloc((unsigned long)k * sizeof(unsigned int));
for (i = 0; i < k; i++) {
divs[i] = v_new_range(0, 1, true);
}
|
4d26a735
Pedro Roque
Increased recogni...
|
130
131
|
for (i = 0; i < n; i++) {
|
94b2b13d
Pedro Roque
PHACT source
|
132
133
134
135
136
137
138
139
140
141
142
143
144
|
c_linear(&prods[(unsigned int)i * ((unsigned int)k + 1)], divs, (unsigned int)k, prods[(unsigned int)i * ((unsigned int)k + 1) + (unsigned int)k]);
}
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) {
|
4d26a735
Pedro Roque
Increased recogni...
|
145
|
printf("Solution:\n");
|
94b2b13d
Pedro Roque
PHACT source
|
146
147
148
149
150
151
152
|
vs_print_single_val(divs, (unsigned int)k, 0);
printf("\n");
} else {
printf("%lu solution(s) found\n", result);
}
free(divs);
|