結果
| 問題 |
No.1122 Plane Tickets
|
| コンテスト | |
| ユーザー |
koyumeishi
|
| 提出日時 | 2020-07-23 09:00:00 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,251 bytes |
| コンパイル時間 | 654 ms |
| コンパイル使用メモリ | 13,056 KB |
| 実行使用メモリ | 44,924 KB |
| 最終ジャッジ日時 | 2024-06-23 17:07:58 |
| 合計ジャッジ時間 | 32,735 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 2 |
| other | RE * 55 |
ソースコード
from __future__ import print_function
import numpy as np
from pprint import pprint
from ortools.linear_solver import pywraplp
def mip_ortools(a):
solver = pywraplp.Solver('mip_program',
pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)
infinity = solver.infinity()
x = [solver.IntVar(0.0, infinity, f'x_{i}') for i in range(5)]
for i in range(5):
solver.Add(sum(x[(i+j)%5] for j in range(3)) <= a[i])
solver.Maximize(sum(x))
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL:
print('OPTIMAL')
print('Solution:')
print('Objective value =', solver.Objective().Value())
for i in range(5):
print(f'x_{i} =', x[i].solution_value())
else:
print('The problem does not have an optimal solution.')
print(list(map(lambda w: w.solution_value(), x)))
return int(solver.Objective().Value())
import pulp
import sys
def mip_pulp(a):
problem = pulp.LpProblem("prob", pulp.LpMaximize)
x = [pulp.LpVariable(f'x_{i}', 0, sys.maxsize, pulp.LpInteger) for i in range(5)]
problem += (sum(x), "Objective")
for i in range(5):
problem += (sum(x[(i+j)%5] for j in range(3)) <= a[i], f'Constraint_{i}')
print(problem)
res = problem.solve()
print(f"Status = {pulp.LpStatus[res]}")
print(f"Objective = {pulp.value(problem.objective)}")
for i in range(5):
print(f'x_{i} = {pulp.value(x[i])}')
return pulp.value(problem.objective)
from scipy.optimize import linprog
def lp(a):
c = np.ones(5)
A = np.array([[1 if (j-i+5)%5 <= 2 else 0 for j in range(5)] for i in range(5)])
b = np.array(a)
pprint(c)
print(A)
pprint(b)
res = linprog(-c, A, b)
print(res)
return int(-res.fun + 0.001)
if __name__ == '__main__':
# input:
# 1048577 1048579 1048576 1048577 1048577
a = list(map(int, input().split()))
while True:
# a = np.random.randint(0, 4, 5) + 2**20
ans_mip_ortools = mip_ortools(a)
ans_mip_pulp = mip_pulp(a)
ans_lp = lp(a)
eps = 1e-1
if np.abs(ans_mip_ortools - ans_lp) > eps or np.abs(ans_mip_pulp - ans_lp) > eps:
print("MIP != LP")
pprint(ans_mip_ortools) # 1747627
pprint(ans_mip_pulp) # 1747628
pprint(ans_lp) # 1747628
pprint(a)
exit()
# else:
# print("OK")
break
koyumeishi