파이썬으로 홀수 풀기
입문
hello😇첫 번째 이벤트 달력이지만 평소와 같이 쓰세요.이번에는 python으로 독수를 풀고 싶습니다.
※ 코드는 여기에 열거되어 있으므로 주요 코드만 설명합니다.
독창적인 규칙
실시
이번 사용 최적화 문제에서 자주 사용하는 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를 확인하세요. 충분한 수량이 있으면 성공합니다.
총결산
이번에는 수독을 풀었지만 수학 퀴즈 게임이 모두 풀릴 수 있어서 많이 해보고 싶어요.그럼😇
Reference
이 문제에 관하여(파이썬으로 홀수 풀기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/koneko59/items/fa8cb11e3b9b6450fe01
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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マス+そのマスの相対的な位置の集合
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)
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('解が見つかりませんでした。')
Reference
이 문제에 관하여(파이썬으로 홀수 풀기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koneko59/items/fa8cb11e3b9b6450fe01텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)