Я программист и делаю искусственный интеллект для настольной игры Hex. Поскольку я не так хорошо знаком с электротехникой, мне нужен ваш опыт в этом вопросе.
Сейчас я работаю над функцией оценки правления. Я представил доску в виде графика, так как это то, что нужно компьютеру в качестве входных данных. Но в этом случае вы также можете видеть это как электрическую цепь. Схема обычно выглядит так, только потом 11х11 шестигранников:
Края/резисторы все либо 0,1, либо INF (бесконечность).
Моя цель - дать оценку доске. Я хочу подать электрическое напряжение на два граничных противоположных узла, а затем проверить общее сопротивление между ними.
Я сделал возможный сценарий на доске 2x2. Точки — это узлы, ребра — резисторы, числа — значения резисторов, а стрелки — мои предположения о потоке тока. Насколько я понимаю, я должен сделать что-то, называемое узловым анализом. Поэтому я сделал для каждого узла уравнение, в котором напряжение, входящее в узел, такое же, как и выходное. Итак, вот уравнения, которые я составил:
Итак, с помощью некоторых алгебраических манипуляций я поместил числа в матрицу, где напряжения, конечно же, являются переменными: (я также предположил, что деление на ноль — это то же самое, что и умножение на бесконечность, я не знаю, правильно ли это).
Если вы решите это, вы получите:
У меня сейчас два вопроса:
1. В чем моя ошибка? (потому что я не думаю, что напряжения могут быть NaN или отрицательными)
2. Если я правильно рассчитал эти напряжения, как мне рассчитать общее сопротивление?
Установить узел , начать. (Это удобно, и вы можете сделать это ровно один раз для любого узла, который вы хотите.) Также обратите внимание, что , поэтому, когда вы ищете ребра, вам нужно будет найти все ребра, исходящие из всех таких общих «супер» узлов. (Так не будет отображаться ниже.) Я также заметил, что в вашем меньшем примере значение ребра равно "2", хотя я думаю, что ранее вы говорили, что только 0, 1 или было возможно. Я буду жить с этим, хотя.
Таким образом, итог здесь таков: (1) узлы, соединенные 0, являются одним и тем же узлом, и вы должны найти все ребра, исходящие из одного и того же узла, при настройке уравнений; и (2) что ребра с можно игнорировать; и (3) дроби со специальным узлом, который вы обозначили как 0 в числителе, можно отбросить.
Обратите внимание, что фактически является изолированной вершиной. Таким образом, вы не сможете вычислить напряжение для него. Это должно быть хорошо. Кроме того, у вас есть листовая вершина (я не знаю, как вы справляетесь с построением графа). Напряжение там будет неизвестно, если ребро и будет равно напряжению в подключенном узле, в противном случае. Я бы, наверное, просто установил его равным в таких случаях и покончил с этим.
Наконец, я не буду другим с символ (вы можете принять его, если хотите.) Вместо этого я буду использовать граничное обозначение , например, для представления указанного краевого сопротивления. Если узел является общим, я буду использовать , например, чтобы указать этот суперузел. Ваш примерный набор уравнений:
Вышеупомянутое может быть преобразовано в:
Из вышесказанного симметрии также должны быть очевидны. (Посмотрите на константы и их положения.) Главная диагональ имеет уникальные значения, но остальные имеют значения, которые появляются дважды в легко заметных симметричных позициях.
Но вам не нужно первое уравнение, так как вы уже знаете значение . Таким образом, все сводится к двум нижним уравнениям, преобразованным в матричную форму:
Вышеупомянутое решает в вашем случае как и .
Решив для узловых напряжений, вы можете определить ток, просто изучив все ребра, выходящие из вашего узла 0 (если вы выберете его так, как я). Там есть только одно ребро, а именно , так что полное сопротивление здесь просто .
Это работает для .
Вы должны быть в состоянии обобщить вышеизложенное, так как оно почти уже близко к автоматическому.
Я думаю, что есть более систематический способ решения схем, например, вы можете формализовать способ написания списка цепей вашей схемы, а затем реализовать [например] алгоритм MNA для решения всей схемы за вас, а затем вы можете получить эквивалентное сопротивление цепи или любой другой интересующий параметр. Я нашел библиотеку python под названием ahkab , которая реализует модифицированный алгоритм узлового анализа. если вы хотите реализовать это, вы можете проверить это
Я написал небольшой скрипт, который считывает список соединений этих узлов шестигранной схемы и выполняет расчет эквивалентного сопротивления.
Формат нет-листа выглядит примерно так [вы можете сделать свой собственный формат]
v 1 6 10
1 1 3
0 1 2
1 2 3
1 2 4
2 3 4
1 4 6
end
первая строка указывает, что источник напряжения подключен к узлу 1
, а 6
все остальные строки указывают значение сопротивлений и место их подключения, <Resistor value> <Node1> <Node2>
а также end
завершают чтение списка цепей.
Скрипт на питоне 3
import ahkab
ckt=ahkab.Circuit("Math_Max circuit")
nodes=[]
gnd=0
rCount=0
def node_replace(a,b):
#A function for replacing 0 resistive path between nodes
for i in range(len(nodes)):
if(nodes[i][1]==a):
nodes[i][1]=b
if(nodes[i][2]==a):
nodes[i][2]=b
while(True):
nlst=input().split()
if(nlst[0]=='end'): break
if(nlst[0]=='v'):
gnd=int(nlst[2])
ckt.add_vsource(nlst[0],nlst[1],ckt.gnd,dc_value=int(nlst[3]))
else:
nodes.append([int(nlst[0]),nlst[1],nlst[2]])
for i in range(len(nodes)):
if(nodes[i][0]==0):
node_replace(nodes[i][2],nodes[i][1])
for i in range(len(nodes)):
if(nodes[i][0]!=0):
gndNode=nodes[i][2]
if(int(nodes[i][2])==gnd):
gndNode=ckt.gnd
ckt.add_resistor('r'+str(rCount),nodes[i][1],gndNode,value=nodes[i][0])
rCount=rCount+1
results=ahkab.run(ckt, ahkab.new_op())['op']
print("TOTAL CURRENT: ",results['I(V)'][0][0])
print("Equivalent resistance: ",10/abs(results['I(V)'][0][0]))
Это был результат
Код работает, оценивая общий ток с использованием алгоритма MNA, а затем делит его, source voltage / total current
чтобы получить эквивалентное сопротивление.
браханы