조합 최적화로 별 조사
이게 뭐야
풀어봐
냅삭 문제 로 생각할 수 있다. 파이썬으로 풀어 보자.
Python에 의한 수리 최적화에 대해서는 참고 링크를 참조하십시오.
python3import numpy as np
from pulp import *
np.random.seed(1)
星数 = 1000
調査時間 = np.random.randint(10,100,星数)
発見確率 = np.random.random(星数)/100000
m = LpProblem(sense=LpMaximize)
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(星数)]
m += lpDot(発見確率,x)
m += lpDot(調査時間,x) <= 10000
m.solve()
print(value(m.objective)) # 発見確率の総和
>>>
0.0022822674119170536
사실, 로켓은 최대 항속 가능 거리가 있습니다. 여기서는 단순히 거리가 아니라 최대 홉 수 +1을 mx로 한다.
mx를 바꿀 때 목적 함수가 어떻게 될지 살펴 보자. 가로축은 mx, 세로축은 목적 함수이다.
python3r = []
for mx in range(4,17):
m = LpProblem(sense=LpMaximize)
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(星数)]
m += lpDot(発見確率,x)
m += lpDot(調査時間,x) <= 10000
for i in range(星数-mx+1):
m += lpSum(x[i:i+mx]) >= 1 # mx以内に1か所以上調査する
m.solve()
r.append(value(m.objective))
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16);
확대해 본다.
python3plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16)
plt.xlim((9,16))
plt.ylim((0.00227,0.0023));
디폴트의 무료 솔버 CBC라면 오차 탓에 제약조건이 엄격한 편이 해가 좋아지거나 하고 있다.
상용 솔버는 더 정확하게 해결되었습니다.
참고 링크
- 최적화에서 Python - Qiita
이상
Reference
이 문제에 관하여(조합 최적화로 별 조사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SaitoTsutomu/items/3ec876dc1ced1885ff04
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import numpy as np
from pulp import *
np.random.seed(1)
星数 = 1000
調査時間 = np.random.randint(10,100,星数)
発見確率 = np.random.random(星数)/100000
m = LpProblem(sense=LpMaximize)
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(星数)]
m += lpDot(発見確率,x)
m += lpDot(調査時間,x) <= 10000
m.solve()
print(value(m.objective)) # 発見確率の総和
>>>
0.0022822674119170536
r = []
for mx in range(4,17):
m = LpProblem(sense=LpMaximize)
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(星数)]
m += lpDot(発見確率,x)
m += lpDot(調査時間,x) <= 10000
for i in range(星数-mx+1):
m += lpSum(x[i:i+mx]) >= 1 # mx以内に1か所以上調査する
m.solve()
r.append(value(m.objective))
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16);
plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16)
plt.xlim((9,16))
plt.ylim((0.00227,0.0023));
Reference
이 문제에 관하여(조합 최적화로 별 조사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SaitoTsutomu/items/3ec876dc1ced1885ff04텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)