sunasunaxの日記

制約論理プログラム iZ-C の紹介

足してN、掛けて最大値の正の整数の組み合わせを制約論理プログラム iZ-Cを使って解きます。

足してN、掛けて最大値の正の整数の組み合わせを制約論理プログラム iZ-Cを使って解きます。
---------------------------------------------------------------------------
./int_part 15
Tue Aug 4 12:08:12 2020
QR:{0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}, {0..15}

NUM 15, Solution 1
15: 1 :1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

NUM 15, Solution 2
14: 2 :2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

NUM 15, Solution 3
13: 4 :2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

NUM 15, Solution 4
12: 8 :2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1

NUM 15, Solution 5
11: 16 :2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1

NUM 15, Solution 6
10: 32 :2, 2, 2, 2, 2, 1, 1, 1, 1, 1

NUM 15, Solution 7
9: 64 :2, 2, 2, 2, 2, 2, 1, 1, 1

NUM 15, Solution 8
8: 128 :2, 2, 2, 2, 2, 2, 2, 1

NUM 15, Solution 9
7: 192 :3, 2, 2, 2, 2, 2, 2

NUM 15, Solution 10
6: 216 :3, 3, 3, 2, 2, 2

NUM 15, Solution 11
5: 243 :3, 3, 3, 3, 3

Nb Fails = 514
Nb Choice Points = 760
Heap Size = 1024
Elapsed Time = 4.81154 s
Tue Aug 4 12:08:17 2020
---------------------------------------------------------------------------
/**************************************************************************
* 整数の分割
**************************************************************************/
#include <stdlib.h>
#include <time.h>
#include <limits.h>
#include <string.h>
#include "iz.h"

//int NUM = 10;
CSint **QR;
CSint *SUM_MUL;
/**************************************************************************/
/**************************************************************************/
CSint *sum_mul_max(CSint **QR, int size){
int i;

CSint **mul_arry = (CSint **)malloc(size * sizeof(CSint *));
mul_arry[0] = QR[0];
for(i = 1; i < size; i++){
mul_arry[i] = cs_Mul(mul_arry[i - 1], QR[i]);
}
return cs_Max(mul_arry, size);
}
/**************************************************************************/
void cost_printSolution(CSint **allvars, int nbVars, CSint *cost) {
static int NbSolutions = 0;
int nn;

printf("\nNUM %4d, Solution %d\n", nbVars - 1, ++NbSolutions);
nn = cs_getMin(cs_Index(QR, nbVars, 0));
printf("%4d", nn);
cs_printf(":\t%D", cs_Mul(CSINT(-1), cost));
cs_printf("\t:%A\n", &QR[0], nn);
}
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
int main(int argc, char **argv) {
int i;
CSint *cost;
clock_t t0 = clock();
time_t nowtime;
int NUM = atoi(argv[1]);
// int num_p = NUM + 1;
int num_p = NUM + 1;

cs_init();
time(&nowtime); printf("%s", ctime(&nowtime));

QR = cs_createCSintArray(num_p, 0, NUM);

for(i = 0; i < num_p - 1; i++){
cs_Ge(QR[i], QR[i + 1]);
}
cs_EQ(cs_Sigma(QR, num_p), NUM);
cs_GE(cs_OccurDomain(0, QR, num_p), 1);

cs_printf("QR:%A\n", QR, num_p);

cost = cs_Sub(CSINT(0), sum_mul_max(QR, num_p));

cs_minimize(&QR[0], num_p, cs_findFreeVar, cost, cost_printSolution);
//// cs_findAll(&QR[0], NUM, cs_findFreeVarNbConstraints, printSolution);
// cs_findAll(&QR[0], DIM*DIM * STP, cs_findFreeVarNbElementsMin, printSolution);
//cs_findAll(&QR[0], DIM*DIM * STP, cs_findFreeVarNbElements, printSolution);
//cs_findAll(&QR[0], DIM*DIM * STP, cs_findFreeVar, printSolution);


cs_printStats();
printf("Elapsed Time = %g s\n", (double) (clock() - t0) / CLOCKS_PER_SEC);
time(&nowtime); printf("%s", ctime(&nowtime));
cs_end();
return EXIT_SUCCESS;
}