Skip to content

Icegrave0391/SAT-DPLL

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 

Repository files navigation

CourseDesign

Copyright © 2019 icegrave0391. All rights reserved.
四种功能实现模块 :

  • CNF范式求解模块

DPLL

  • 数独游戏生成模块

LasVegas + 挖洞

  • 文件操作模块

extern int totalLiteralCount, totalClauseCount读取信息

  • 数独转化SAT问题

minimal encoing + extended encoding

DataStructure

这里Clause以及Formula 均使用单链表实现,如想参考其他版本,移步其他branch
branch DPLLOptimize : Clause使用数组,Formula使用链表
branch DPLLOptimize3 : Clause使用数组,Formula使用链表, 同时加入Literal Stack以及指向Clauseliteral pointer array

API Clause

enum LiteralContainStatus{
    LiteralContainStatusNotContain = 0,
    LiteralContainStatusContain,
    LiteralContainStatusContainInverse
//    LiteralContainStatusContainBoth
};

typedef enum LiteralContainStatus LiteralContainStatus;

#pragma mark - Clause struct
struct Clause{
    int literal ;
    struct Clause * next ;
}  ;
typedef struct Clause Clause;
typedef Clause * clause ;

//clause operate functions

//clause createClause(int literalNum, ClauseStatus clsStatus, int * literals) ;
int initClause(clause * cls) ;
clause createClause(int literalNum, int * literals) ;
clause deepCpyClause(clause aclause) ;
//int destoryClause(clause cls) ;
int isUnitClause (Clause cls) ;
int isEmptyClause(Clause cls) ;
LiteralContainStatus literalStatusWithClause(Clause Cls, int literal) ;
void deleteLiteral(clause * cls, int literal) ;
int findRandomLiteral(clause cls) ;
int findFirstLiteral(clause cls) ;
void addLiteral(clause * cls, int literal) ;

API Formula

enum DeleteClauseStatus{
    DeleteClauseStatusNotFound = 0,
    DeleteClauseStatusSuccessful
};
typedef enum DeleteClauseStatus DeleteClauseStatus;
#pragma mark - structure
struct FormulaNode{
    clause clause ;
    struct FormulaNode * next ;
};
typedef struct FormulaNode * formulaList;

// Formula functions
int init(formulaList * ls) ;
int isFormulaEmpty(formulaList Ls) ;
int clauseNum(formulaList Ls) ;

int emptyClauseInFormula(formulaList Ls) ;
#pragma mark - clause operations
void addClause(formulaList * ls, clause cls) ;
void addUnitClause(formulaList * ls, clause cls) ;

DeleteClauseStatus deleteClause(formulaList * ls, clause cls) ;
clause findUnitClause(formulaList Ls) ;
clause findFirstStillClase(formulaList Ls) ;
#pragma mark - formula cpy
formulaList deepCpyFormulaList(formulaList Ls) ;

DPLL

最终版本:深复制 + 递归回溯(使用深复制),如想参考其他版本,移步其他branch
DPLLOptimize3 : 递归回溯 + pop stack undo复原状态

  • 文字最终解 : extern int * allLiteralArr

CNFFileManager

formulaList loadCNFFileFormula(char * filePath) ;

解析CNF文件,并返回其存储公式

int exportDPLLResultFile(char * filePath, int * literalsArr, int DPLLResult, double timeinterval) ;

将公式最终解导出.res文件
DPLLResult对应返回值有无解, timeinterval对应clock

SudokuTransfer

API

//this method create beginning board to both constraints .sud file and .cnf file    
//数独转化SAT(生成.sud数独约束文件 以及.cnf 求解文件)
int transferConstraintToFile(int sudoku[9][9]) ;    

//should only be sudoku constraint literal (111 - 999 without number 0)    

int mapSudokuToLiteral(int sudoku) ;    
int mapLiteralToSudoku(int literal) ;    

// this method should only be used in .res file    
void transferSudokuAnswer(char * filePath) ;

#pragma mark - create sudoku & beginning board

//数独求解器
int DFSSovleSudoku(int sudokuBoard[9][9], int r[9][10], int c[9][10], int b[9][10]) ;
// n means write n random nums 填数(11+)的拉斯维加斯算法
int lasVegasCreateSudoku(int n) ;

//挖洞
void generateSudokuByDigHoles(int remains) ;
//判断是否唯一解
int uniqueSolution(int row, int line) ;

数独生成器(初盘) : extern int sudokuBoard[row][col]
数独答案终盘 : extern int sudokuSolution[row][col]

About

2019CourseDesign

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy