OR ツールを使用して、0-1 ナップザック問題のバリエーションに取り組んでいます。私は 1 つのタイプのバリエーションを解決することができましたが、この試みでは、特に目的関数に問題があります。これが私が使用しているコードです。基本的に、目的関数のアイテムに関連付けられた各変数を合計したいのですが、アイテムが選択された場合、x[i,j] バイナリ変数は 1 に設定されます。
import math
import pandas as pd
import ortools
from ortools.linear_solver import pywraplp
solver = solver = pywraplp.Solver.CreateSolver('SCIP')
#All of the variables in the dataframe are integer variables
df = pd.read_csv('data.csv')
#Create a data dictionary to store all of the data items in
data = {}
data['ID'] = df.ID
data['time'] = df.Time
data['days'] = df.Days
data['canc'] = df.Canc
data['hdu'] = df.HDU
data['priority'] = df['Priority']
data['items'] = list(range(len(df.ID)))
data['num_items'] = len(df.ID)
num_knapsacks = 2
data['capacities'] = [480,240]
data['knapsacks'] = list(range(num_knapsacks))
x = {}
for i in data['items']:
for j in data['knapsacks']:
x[(i,j)] = solver.IntVar(0,1,'x_%i_%i' % (i, j))
#Constraint to limit item to a single knapsack
for i in data['items']:
solver.Add(sum(x[i,j] for j in data['knapsacks'])<=1)
#Knapsack Capacity Constraint
for j in data['knapsacks']:
solver.Add(sum(x[(i,j)]*data['time'][i]
for i in data['items']) <= data['capacities'][j])
# HDU Constraint
for j in data['knapsacks']:
solver.Add(sum(x[(i,j)]*data['hdu'][i]
for i in data['items']) <= 1)
#objective function
objective = solver.Objective()
for i in data['items']:
for j in data['knapsacks']:
objective.SetCoefficient(x[(i,j)], data['days'][i]+data['time'][i]+data['priority'][i]+data['canc'][i])
objective.SetMaximization()
私が得ているエラーは具体的には目的関数にありますが、その理由はわかりません(単一の目的係数を使用して別のバージョンが機能しています)。エラーは次のとおりです。
return _pywraplp.Objective_SetCoefficient(self, var, coeff)
TypeError: in method 'Objective_SetCoefficient', argument 3 of type 'double'