前提・実現したいこと
python初心者です。次のような行列をpulpで実現したいです。
・6×6の行列
・制約条件 各行、各列に1は1つ。他は0
例
100
001
010
・目的関数
1行目a列目にある1と2行目b列目にある1でa>bの関係があれば1ポイント
3行目c列目にある1と4行目d列目にある1と1行目a列目にある1でc>d>aの関係があれば1ポイント
(上2つと同じようなポイント加算の条件が他にもいくつかありますが、今回他の条件は省略しています)
そして、ポイントが最も大きくなる行列をpulpを用いて求める。
このような問題です。色々試行錯誤したのですが、目的関数の部分でどうしてもエラーがでてしまって前に進めず本当に困っています。お詳しい方、何故エラーがでるのか及びどのようなコードを書けばエラーがでず正しくコンパイルできるのかを教えて下さると助かります。
発生している問題・エラーメッセージ
TypeError Traceback (most recent call last) <ipython-input-312-418c9dba27c8> in <module> 22 cc=[] 23 for k1 in ss: ---> 24 a0=pulp.lpSum(ss[0][0:k1]) 25 a1=pulp.lpSum(ss[1][0:k1]) 26 1-(a1-a0)>=cc[0] TypeError: slice indices must be integers or None or have an __index__ method
該当のソースコード
python
1import pulp 2 3ps = [1,2,3,4,5,6] 4ws = [1,2,3,4,5,6] 5prob = pulp.LpProblem('best matrix', sense = pulp.LpMaximize) 6 7ss = [] 8for p in ps: 9 ss1 = [pulp.LpVariable('{}{}'.format(p, x), cat='Binary') for x in range(len(ws))] 10 ss.append(ss1) 11 12for x in range(len(ws)): #各列の和は1 13 xs = [ss[i][x] for i in range(len(ps))] 14 prob += pulp.lpSum(xs) == 1 15 16for y in range(len(ps)): #各行の和は1 17 ys = [ss[y][i] for i in range(len(ws))] 18 prob += pulp.lpSum(ys) == 1 19 20 21#目的関数 22cc=[] 23for k1 in ss: 24 a0=pulp.lpSum(ss[0][0:k1]) 25 a1=pulp.lpSum(ss[1][0:k1]) 26 1-(a1-a0)>=cc[0] 27 28for k2 in ss: 29 a2=pulp.lpSum(ss[2][0:k2]) 30 a3=pulp.lpSum(ss[3][0:k2]) 31 1-(a3-a2)>=cc[1] 32for k3 in ss: 33 a4=pulp.lpSum(ss[3][0:k3]) 34 a5=pulp.lpSum(ss[0][0:k3]) 35 1-(a5-a4)>=cc[1] 36 37prob += pulp.lpSum(cc) 38print(cc) 39 40print(prob) #設定した数理モデルの表示 41status = prob.solve() #問題を解く 42print("Status", pulp.LpStatus[status]) 43print(ws) 44for ss1 in ss: 45 print([v.value() for v in ss1])
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/01 17:21 編集
2021/05/02 04:23
2021/05/02 08:19