過去にご相談したものは、円が入る正方形を詰め込んでいることがわかって、円周が重ならないようにするようにすることを考え、プログラムしてみましたが、Python初心者、最適化初心者なので、
c = a * a + b * b
TypeError: Non-constant expressions cannot be multiplied
がでてきます。
python
1コード 2from pulp import * 3import matplotlib.pyplot as plt 4 5W = 20 6UB = 30 7a = [] 8b = [] 9c = [] 10sum_radius = [] 11 12n = 6 13r = [3, 2, 1, 3, 3, 2] 14 15H = LpVariable("H") 16x = [LpVariable(f'x{i}', lowBound=0) for i in range(n)] 17y = [LpVariable(f'y{i}', lowBound=0) for i in range(n)] 18u = [[LpVariable(f'u{i}_{j}', cat=LpBinary) for j in range(n)] for i in range(n)] 19v = [[LpVariable(f'v{i}_{j}', cat=LpBinary) for j in range(n)] for i in range(n)] 20 21m = LpProblem(sense=LpMinimize) 22m += H 23 24for i in range(n): 25 for j in range(n): 26 m += {{(x[j] - x[i]) * (x[j] - x[i])} + {(y[j] - y[i]) * (y[j] - y[i])}} >= {(r[i] + r[j]) * (r[i] + r[j])} 27 if i < j: 28 m += u[i][j] + u[j][i] + v[i][j] + v[j][i] >= 1 29 30for i in range(n): 31 m += x[i] <= W-r[i] 32 m += y[i] <= H-r[i] 33 m += r[i] <= x[i] 34 m += r[i] <= y[i] 35 36 37m.solve() 38 39### 描画 ### 40 41fig = plt.figure() 42ax = fig.add_subplot(111,aspect='equal') 43ax.set_xlim([0,W]) 44ax.set_ylim([0,UB]) 45 46for i in range(n): 47 print(f'(x, y) = ({x[i].value()}, {y[i].value()}) r = {r[i]}') 48 circ = plt.Circle((x[i].value() ,y[i].value()), r[i]) 49 ax.add_patch(circ) 50 51#グラフのタイトル 52plt.title("Sectional View") 53 54#x軸ラベル 55plt.xlabel("Hole diameter") 56 57#y軸ラベル 58plt.ylabel("depth") 59 60fig.savefig("test1.png") 61plt.show()
回答1件
あなたの回答
tips
プレビュー