sunasunaxの日記

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

カプレカ数を制約論理プログラム iZ-Cを使って解きます。

カプレカ数を制約論理プログラム iZ-Cを使って解きます。
---------------------------------------------------------------------------
./kapre
Tue Jul 28 05:29:33 2020
100000
10000
1000
100
10
1
QR:{1..9}, {0..9}, {0..9}, {0..9}, {0..9}, {0..9}, {1..9}, {0..9}, {0..9}, {0..9}, {0..9}, {0..9}, {0..8}, {0..9}, {0..9}, {0..9}, {0..9}, {0..9}

Solution 1
5, 4, 9, 9, 4, 5 : 9, 9, 5, 5, 4, 4 : 4, 4, 5, 5, 9, 9

Solution 2
6, 3, 1, 7, 6, 4 : 7, 6, 6, 4, 3, 1 : 1, 3, 4, 6, 6, 7

Nb Fails = 123347
Nb Choice Points = 164183
Heap Size = 1024
Elapsed Time = 0.57452 s
Tue Jul 28 05:29:33 2020
---------------------------------------------------------------------------
/**************************************************************************
* カプレカ数
* 0, 495, 6174, 549945, 631764, 63317664, 97508421, 554999445, 864197532, 6333176664
**************************************************************************/
#include <stdlib.h>
#include <time.h>
#include <limits.h>
#include <string.h>
#include "iz.h"

/**************************************************************************/
CSint **QR, **maxQR, **minQR;
int DIM;
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
void printSolution(CSint **allvars, int nbVars) {
static int NbSolutions = 0;

printf("\nSolution %d\n", ++NbSolutions);
printf(" ");
cs_printf("%A : ", &QR[0*DIM], DIM);
cs_printf("%A : ", &QR[1*DIM], DIM);
cs_printf("%A\n", &QR[2*DIM], DIM);
}
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
int main(int argc, char **argv) {
int i;
clock_t t0 = clock();
time_t nowtime;

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

/*
DIM = atoi(argv[1]);
STP = atoi(argv[2]);
*/
DIM = 8;
int order[8];

order[DIM - 1] = 1;
for(i = DIM - 2; i >= 0; i--){
order[i] = 10 * order[i + 1];
}
for(i = 0; i < DIM; i++){
printf("%4d\n", order[i]);
}

QR = (CSint **)malloc(3 * DIM * sizeof(CSint *));

for(i = 0; i < 3 * DIM; i++){
QR[i] = cs_createCSint(0, 9);
}
for(i = 0; i < DIM - 1; i++){
cs_Ge(QR[DIM + i], QR[DIM + i + 1]);
cs_Le(QR[2*DIM + i], QR[2*DIM + i + 1]);
}

for(i = 0; i < 10; i++){
CSint *num;
num = cs_OccurDomain(i, QR, DIM);
cs_Eq(cs_OccurDomain(i, &QR[DIM], DIM), num);
cs_Eq(cs_OccurDomain(i, &QR[2*DIM], DIM), num);
}
cs_NEQ(QR[0], 0);

CSint *numQR, *max_numQR, *min_numQR;

numQR = cs_ScalProd(QR, order, DIM);
max_numQR = cs_ScalProd(&QR[DIM], order, DIM);
min_numQR = cs_ScalProd(&QR[2*DIM], order, DIM);
cs_Eq(cs_Sub(max_numQR, min_numQR), numQR);

cs_printf("QR:%A\n", QR, 3*DIM);


// cs_findAll(&QR[0], DIM * STP, cs_findFreeVarNbConstraints, printSolution);
// cs_findAll(&QR[0], DIM * STP, cs_findFreeVarNbElementsMin, printSolution);
cs_findAll(&QR[0], 3*DIM, cs_findFreeVarNbElements, printSolution);
// cs_findAll(&QR[0], 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;
}