파이썬으로 홀수 풀기

입문


hello😇첫 번째 이벤트 달력이지만 평소와 같이 쓰세요.이번에는 python으로 독수를 풀고 싶습니다.
※ 코드는 여기에 열거되어 있으므로 주요 코드만 설명합니다.

독창적인 규칙

  • 비어 있는 송어 중에는 반드시 1부터 9까지의 숫자가 있다.
  • 세로 9칸에는 각각 1개에서 9개의 숫자가 있다.(중복 없음)
  • 가로 9칸에는 각각 1개에서 9개의 숫자가 있다.(중복 없음)
  • 굵은 선에 둘러싸인 3×3의 각 블록에는 1부터 9까지의 숫자가 있다.(중복 없음)
  • (예)

    실시


    이번 사용 최적화 문제에서 자주 사용하는 mypulp 모듈.데이터는 Excel에 저장됩니다openpyxl.필요한 모듈은requirements입니다.txt에 저장하려면 명령줄에서 다음 코드를 실행하십시오.
    pip install -r requirements.txt
    

    데이터 생성


    우선 개별 데이터를 저장할 목록을 준비하세요.
    
    N = [i for i in range(1,10)]    #行番号,列番号,数
    C = [(3*i+2, 3*j+2) for i in range(3) for j in range(3)]   #ブロックの中心位置の集合
    D = [(i-1, j-1) for i in range(3) for j in range(3)]       #周囲8マス+そのマスの相対的な位置の集合
    
    
    그런 다음 Excel에서 프롬프트 수를 읽습니다.
    
    n = {}
    for i in N:
        for j in N:
            n[i, j] = sheet.cell(row=i+1, column=j+3).value
    

    제약조건


    제약 조건은 주로 네 가지가 있다.
    ① 어떤 숫자가 있는지 (제시된 숫자 포함)
    for i in N:
        for j in N:
            if type(n[i, j]) is int and 1 <= n[i, j] <= 9:
                model.addConstr(x[i,j,n[i, j]]==1)#ヒントの数字
            else:
                model.addConstr(quicksum(x[i,j,k] for k in N)==1)#それ以外
    
    ② 줄에 숫자가 하나씩 있다
    for i in N:
        for k in N:
            model.addConstr(quicksum(x[i,j,k] for j in N)==1)
    
    ③ 열에 숫자가 하나씩 있다
    for j in N:
        for k in N:
            model.addConstr(quicksum(x[i,j,k] for i in N)==1)
    
    ④ 블록에 숫자가 하나씩 있다
    for (ci, cj) in C:
        for k in N:
            model.addConstr(quicksum(x[ci+di, cj+dj, k] for (di, dj) in D)==1)
    

    대상 변수


    보통 최적화 문제에 있어서 어떤 수치를 가장 크고 가장 적게 하지만 이번에는 특별한 것이 없다.

    실행


    이번에는 스도쿠_ans.xlsx라는 다른 파일을 쓰려고 합니다.
    model.optimize()
    # 出力
    if model.Status == GRB.Status.OPTIMAL:
        print('解が見つかりました。')
        for i in N:
            for j in N:
                for k in N:
                    if x[i, j, k].X > 0.01:
                        font = copy(sheet.cell(row=i+1, column=j+13).font)
                        if type(n[i, j]) is int:
                            font.color = styles.colors.Color(rgb='ffff0000')     #ヒントの数
                        else:
                            font.color = styles.colors.Color(rgb='ff000000')   #求めた数
                        sheet.cell(row=i+1, column=j+13).font = font
                        sheet.cell(row=i+1, column=j+13).value = k                    
        book.save('sudoku_ans.xlsx')
    else:
        print('解が見つかりませんでした。')
    
    
    마지막, 스도쿠_ans.xlsx를 확인하세요. 충분한 수량이 있으면 성공합니다.

    총결산


    이번에는 수독을 풀었지만 수학 퀴즈 게임이 모두 풀릴 수 있어서 많이 해보고 싶어요.그럼😇

    좋은 웹페이지 즐겨찾기