Как лучше всего реализовать связанные переменные? - PullRequest
0 голосов
/ 03 июня 2018

Я реализую программу решателя геометрии, которая попытается найти для всех других измерений на рисунке данные, которые приведены (см. Ссылку на изображение)

На таком рисунке длины или измеренияиз форм неявно связаны.Например, если кто-то знает длину прямоугольника A, он знает длину прямоугольника B, потому что описание фигуры говорит, что прямоугольник A и B идентичны.И если кто-то знает диаметр полукруга C, он также знает ширину прямоугольника A и B. Наконец, диаметр полукруга C связан с его площадью: Area = pi * (D / 2) ^ 2

Следовательно, я хотел бы реализовать алгоритм таким образом, чтобы в момент изменения одной из связанных переменных (например, площадь, длина, диаметр, радиус) оставшиеся связанные переменные также менялись соответствующим образом.

Какой, по вашему мнению, лучший способ реализовать это?Могу ли я использовать, например, рекурсию для обновления через все связанные переменные или, например, свойства getter и setter?

Я использую python в качестве предпочитаемого языка.Спасибо.

A figure where the measurements are linked

1 Ответ

0 голосов
/ 20 июня 2018

Вы можете сформулировать это как проблему удовлетворения ограничения

CA = 20
CA = Cr^2 * Pi/2
Ba = Aa
Bb = Ab
Aa = 3
Ab = 2 * Cr

и решить ее с помощью Z3 , которая имеет интерфейс Python (см., Например, это intro ):

from z3 import *

CA, Cr, Ba, Bb, Aa, Ab = [Real(v) for v in ["CA", "Cr", "Ba", "Bb", "Aa", "Ab"]]
E1 = CA == 20
E2 = CA == Cr*Cr * 3.14159/2
E3 = Ba == Aa
E4 = Bb == Ab
E5 = Aa == 3
E6 = Ab == 2 * Cr
C1 = Cr > 0

s = Solver()
s.add(E1, E2, E3, E4, E5, E6, C1)
if str(s.check()) == 'sat':
  print(s.model())
else:
  print("not solvable")

вывод:

[Cr = 3.5682497392?,
 Aa = 3,
 Bb = 7.1364994785?,
 Ab = 7.1364994785?,
 Ba = 3,
 CA = 20]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...