質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2538閲覧

Python :長方形の円の詰め込み:正方形を埋め込むのではなく、円周の重なりを最小にして詰め込む

KAZENOMACHI

総合スコア12

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/25 23:52

編集2021/03/26 02:08

過去にご相談したものは、円が入る正方形を詰め込んでいることがわかって、円周が重ならないようにするようにすることを考え、プログラムしてみましたが、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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2021/03/26 01:37

コードが見にくいので、見やすくしてください。
KAZENOMACHI

2021/03/26 02:11

まだ使い方が悪く申し訳ございません。円周を囲む正方形が重ならないようになっていたのを円の中心点の距離がそれぞれの円の半径も大きく詰め込むことになるのかなと、、、、、。
guest

回答1

0

ベストアンサー

エラー内容を翻訳すると、「定数でない式は掛け算ができない」です。
(x[j] - x[i]) * (x[j] - x[i])の式を展開すると、変数同士の掛け算となり、非線形な制約条件となっています。

pulpライブラリは、デフォルトでは線形計画問題に対応したソルバーしか入っておらず、非線形計画問題には対応していません。

<補足>
・エラー内容は一部を切り取られているように見えるので、全て貼り付けてください。
・「中心間の距離が、半径の和より大きい」という制約条件自体は合っていると思います。すると、u、vの制約式は必要なくなりますね。

投稿2021/03/26 02:33

nanoseeing

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KAZENOMACHI

2021/03/26 04:34

非線形に対応したソルバーはあるのでしょうか?cvxpyも線形ですか?インストールのところでトラブっているのですが。
KAZENOMACHI

2021/03/26 04:45

File "C:\Users\xxxxx\Desktop\ダクト配列NEW円周.py", line 27, in <module> 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])} File "C:\Users\xxxxx\Anaconda3\lib\site-packages\pulp\pulp.py", line 826, in __mul__ raise TypeError("Non-constant expressions cannot be multiplied") TypeError: Non-constant expressions cannot be multiplied
nanoseeing

2021/03/26 05:54

・エラー内容の貼付ありがとうございます。質問をする際は、全文貼り付けるのがマナーだと思いますので。 ・cvxpy自体はソルバーではありません。 ・非線形計画問題を解きたいのでしたら、こちらの記事が参考になるかと思います。https://ajhjhaf.hatenablog.com/entry/2018/02/12/235015
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問