LINUX.ORG.RU

Создание алгоритма методом «научного тыка»?


0

4

Задача из геометрической оптики (акустики). Есть треугольная лучевая трубка, образованная тремя лучами. Лучи движутся в среде с переменным показателем преломления, показатель меняется непрерывно. Местами лучевую трубку «выворачивает» (лучи перекрещиваются), нужно посчитать сколько раз ее «вывернуло».

Лучи считаются численно, методом Рунге-Кутты. Есть координаты лучей в начале шага и в конце шага, есть нормали лучей (единичные вектора, описывающие куда с-но лучи направлены). Казалось бы чего проще - считаем смешанные произведения чего нить с чем нить (вариантов много), если знак сменился значит трубку «вывернуло». Поскольку из общих соображений выражения должны быть симметричны (лучи равноправны), то следим за суммой знаков смешанных произведений (или за произведением знаков).

Но «дьявол кроется в деталях». Каждый из вариантов более-менее пристоен, но иногда дает ложные срабатывания, а иногда наоборот не срабатывает. Т.е. я могу посмотреть глазами на трубку и понять сколько раз ее вывернуло, но не могу научить машину определять это безошибочно. Число ошибок невелико, но они в итоге неприемлемо портят результат. Число трубок в боевой версии кода будет огромно, т.е. какой то ручной контроль будет исключен.

Всякие комбинации различных смешанных произведений пока ничего разумного не дали. Возникающие ошибки можно как то классифицировать, но это крайне муторное дело, и типов ошибок похоже довольно таки много, т.е. построить устойчивый алгоритм «из первых принципов» пока не удалось. Вопрос- как это можно сделать еще?

Т.е. вот у меня в файлах лежат насчитанные трубки - в сколько то там колонок время, координаты лучей и знаки всяких смешанных произведений. Как на основе этого собрать устойчивый алгоритм дающий правильное число вывертов?

★★★★★

Ответ на: комментарий от psv1967

вот так превращаем в цепочки (я правда почему то только первые 3000 трубок в листинге посчитал :))


### кластерное разбиение пространства первых двух компонент для обобщения траектории трубок
data12plot<-unique(result$x[,1:2])
plot(data12plot)
res12kmean<-kmeans(result$x[,1:2], 32, nstart=50)
points(res12kmean$centers, col="blue")

data.tube.label <- sapply(1:length(l), function (i) nrow(read.table(paste0("./tubes/",l[i])))-2)
data.tube.label.long <- do.call(c, lapply(1:length(data.tube.label), function (i) rep(i, data.tube.label[i])) )
data.tube.label.long3000 <- do.call(c, lapply(1:3000, function (i) rep(i, data.tube.label[i])) )

### извлечение трубки
res12kmean$cluster[data.tube.label.long3000==132]

### уникальные переходы в трубке
data.tube.3000uniq <-  lapply(1:3000, function (i) unique(res12kmean$cluster[data.tube.label.long3000==i]))

data.tube3000.uniq.string <- sapply(1:3000, function(i) do.call(paste0, as.list((c(letters, LETTERS)[1:32])[data.tube.3000uniq[[i]]])) )


> table(data.tube3000.uniq.string)
data.tube3000.uniq.string
             Ec         EcvDaAB        EcvDbaAB        EcvDbazy          EcvDby 
            581               1               1               1               7 
        EcvDbzy          EcvDCi    EcvDCikednux     EcvDCikedqx       EcvDCipdf 
              6               4               1               1               1 
        EcvDCke          EcvDCy       EcvDCyanf      EcvDCyaqrh      EcvDCyzqnf 
              2               1               2               1               1 
        EcvDCzy         EcvDkdf          EcvDke       EcvDkedfh     EcvDkednqux 
             17               1              24               7               1 
     EcvDkednrh      EcvDkednux          EcvDlC         EcvDlCi        EcvDlCzy 
              2               3               1              53              13 
    EcvDlkedqAB         EcvDlzy          EcvDzy       EcvDzyanf     EcvDzyaqnrh 
              2               2              19               1               1 
       EcvgbaAB        Ecvgbazy         Ecvlpdf          Ecvlzy       Ecvlzyanf 
              1               3               1              44               7 
     Ecvlzyanrh      Ecvlzyaqnf     Ecvlzyaqnrh     Ecvlzyaqnux      Ecvlzyaqrh 
              1               2               2               1               4 
    Ecvlzypdrux       Ecvlzyqnf       Ecvlzyqrh      Ecvlzyqrut          Ecvmse 
              1               1               1               1              24 
      Ecvmsedfh      Ecvmsedfrh     EcvmsednqAB     Ecvmsednqux      Ecvmsednrh 
             12               1               4               3               1 
           Ecvo          EcvoCi         EcvoCke      EcvoCkedfh     EcvoCkednrh 
              1               1              13               3               4 
     EcvoCkedqB        EcvoCpdf     EcvoCpdfrux         EcvoCzy           Ecvoi 
              1               2               3               2             234 
      EcvoiCanf     EcvoiCapkdf      EcvoiCapnf      EcvoiCaqux       EcvoiCbdf 
              7               1               1               1               3 
      EcvoiCbke   EcvoiCbkednut      EcvoiCbpAB      EcvoiCbpdf      EcvoiCbpke 
              5               1               1               2               4 
   EcvoiCgsedqB     EcvoiCkdeqx       EcvoiCkdf      EcvoiCkdqB        EcvoiCke 
              1               1               6               4             245 
  EcvoiCkednqAB   EcvoiCkednqux    EcvoiCkednrh    EcvoiCkednux     EcvoiCkedqB 
              6               3              10              30              65 
 EcvoiCkedqBurh    EcvoiCkedqrh    EcvoiCkedquj   EcvoiCkedqurh    EcvoiCkedqux 
              5               1               1               7               8 
    EcvoiCkepAB      EcvoiCkpAB      EcvoiClDse      EcvoiClkdf       EcvoiClke 
              2               1               1               1               1 
      EcvoiCpdf     EcvoiCpdfrt    EcvoiCpdfruj    EcvoiCpdfrut    EcvoiCpdfrux 
             82               2               1               4              16 
    EcvoiCpdrux      EcvoiCpkdf       EcvoiCpke       EcvoiCpnf       EcvoiCzAB 
              2               1               1               1               3 
       Ecvoilke    Ecvoilkednux     EcvoilkedqB    Ecvoilkedqux     Ecvoilkedqx 
              2               2               3               1               1 
       Ecvoilse     EcvoilsedqB    Ecvoilsedqux        EcvolCzy         Ecvolke 
              7               2               2               1               4 
             Fw           FwCzy           Fwizy       FwizyaAux       Fwizyaqnf 
            444               1              14               1               3 
     Fwizyaqnrh       Fwizyaqux         FwizyAx          Fwlkdf           Fwlke 
              2               1              12               2               3 
          Fwlse      FwlsednqAB        FwlsedqB     FwlsedqBurh           FwoCy 
              8               1               2               1               1 
           FwoD         FwoDgby   FwoDgbyzAqndf        FwoDgbzy     FwoDgbzypnf 
              1               5               1               2               1 
          FwoDm        FwoDmgby     FwoDmgbyanf    FwoDmgbyanrh    FwoDmgbyaqrh 
            263               5               5               1               2 
   FwoDmgbyzanh       FwoDmlCzy      FwoDmsbaAB       FwoDmsbAB      FwoDmsbpdf 
              1               1               3               4               1 
       FwoDmsby     FwoDmsbyanf    FwoDmsbyanrh    FwoDmsbyanrt   FwoDmsbyanrux 
             73              16               2               1               1 
   FwoDmsbyaqnf    FwoDmsbyaqrh    FwoDmsbyaqux   FwoDmsbyzanrh    FwoDmsbyzpdf 
              3              14               2               1               1 
  FwoDmsbyzqnrh    FwoDmsbyzqrh       FwoDmsbzy    FwoDmsbzyanf FwoDmsbzyanfrux 
              3               3              94              19               1 
   FwoDmsbzyanh   FwoDmsbzyanrh   FwoDmsbzyanux   FwoDmsbzyaqnf  FwoDmsbzyaqnrh 
              2              12               1               2               1 
  FwoDmsbzyaqrh    FwoDmsbzypdf    FwoDmsbzyqrh       FwoDmsedf     FwoDmsgbazy 
             14               2               3               2               1 
      FwoDmsgby    FwoDmsgbyanf      FwoDmskaAB       FwoDmskAB    FwoDmskABurh 
              1               1               1               8               1 
   FwoDmskABurt      FwoDmskazy     FwoDmskbazy      FwoDmskpAB     FwoDmskpazy 
              1               4               1               2               3 
   FwoDmskpbaAB    FwoDmskpbazy     FwoDmskpqAB      FwoDmskqAB       FwoDmspAB 
              2               4               1               6              53 
    FwoDmspABuj    FwoDmspABurh         FwoDpAB           FwoDs        FwoDsbzy 
              2              10               1               1               4 
     FwoDsbzyAx          FwoDse     FwoDsednqAB     FwoDsednqrh      FwoDsednux 
              1              46               3               1               2 
      FwoDsedqB     FwoDsedqBuj          FwoDsm        FwoDspAB     FwoDspABurh 
              4               1               5               2               1 
         Fwogse          Fwolby      Fwolbyaqrh      Fwolbyaqux       FwolbyzAx 
              1               7               1               2               3 
        Fwolbzy    Fwolbzyaqnrh     Fwolbzyaqrh       FwolbzyAx          FwolDm 
             11               1               2               2               3 
        Fwolkdf          Fwolke         FwolpAB          Fwolse     Fwolsednqux 
              1               1               3              11               1 
          Fwose           Fwovm       FwovmspAB 
              8               2               1 


сейчас внутреннюю структуру этих строчек с помощью library(kernlab) посмотрим

вот как то так

f<-kpca(as.list(data.tube3000.uniq.string), features=2, kernel="stringdot", kpar=list( type="constant"))
psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

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

anonymous
()
Ответ на: комментарий от anonymous

ещё нет, пока чистая геометрия идет.

вот kpca похоже разобрал симметричные случаи траекторий


> pairs(f1@rotated, pch=".")
> str(data.tube3000.uniq.string[f@rotated[,1]<0])
 chr [1:1700] "Ec" "Ec" "Ec" "Ecvoi" "EcvoiCke" "EcvoiCke" ...
> str(data.tube3000.uniq.string[f@rotated[,1]>0])
 chr [1:1300] "Fw" "FwoDm" "Fw" "FwoDm" "FwoDgby" "Fw" ...
> str(data.tube3000.uniq.string)

тогда внутри каждой из групп тоже своё


f1F<-kpca(as.list(data.tube3000.uniq.string[f@rotated[,1]>0]), features=4, kernel="stringdot", kpar=list(type="exponential" ))

f1E<-kpca(as.list(data.tube3000.uniq.string[f@rotated[,1]<0]), features=4, kernel="stringdot", kpar=list(type="exponential" ))

pairs(f1E@rotated)
pairs(f1F@rotated)

это полностью симметричные варианты как видно из первых двух фич извлеченных kpca

вот если теперь на pairs(f1F@rotated) указать «хорошие» случаи или «плохие» (смотря что проще), то будет видно можно ли обобщить на рядом расположенные случаи выводы.

psv1967 ★★★★★
()
Ответ на: комментарий от anonymous

шаги 100-109: http://i39.tinypic.com/126ecyc.png

Это как раз «прокол», на второй снизу призме.

шаги 195-203: http://i44.tinypic.com/et9x7b.png

Это судя по всему «крест» (два луча пересекаются), но м.б. и прокол, просто лучи проходят близко.

шаги 204-208: http://i42.tinypic.com/wjf9qd.jpg

Тоже прокол, то ли вторая то ли третья призма. В этом ракурсе невидно, м.б. это как раз сложный прокол, когда грань призмы оказывается вывернутой - вот в таких местах алгоритм и ошибается.

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

Вашу идею насчет плоскости я пока до конца не осознал. Вроде же смешанные произведения дают то же самое?

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

например

> plot(f1E@rotated[,1:2])
### частая траектория
> str(data.tube3000.uniq.string[f@rotated[,1]<0][f1E@rotated[,1]<0])
 chr [1:581] "Ec" "Ec" "Ec" "Ec" "Ec" "Ec" "Ec" "Ec" "Ec" ...
### вторя частая траектория
> str(data.tube3000.uniq.string[f@rotated[,1]<0][f1E@rotated[,2]>15])
 chr [1:234] "Ecvoi" "Ecvoi" "Ecvoi" "Ecvoi" "Ecvoi" "Ecvoi" ...

оставшаяся кучка траекторий как видно на плот три кластера похожих даёт.

psv1967 ★★★★★
()
Ответ на: комментарий от anonymous

Тьфу, виноват коллеги. Я вам выгрузил данные, где I3 вполне себе бывают;-(

По той трубке - там все четко, два прокола, один крест.

Данные, где I3 гарантированно ошибочны вот http://a-iv.ru/trash/tubes-G0.tgz

В http://a-iv.ru/trash/tubes-G1.tgz ошибок больше, но их искать замучаешься.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Это это «tubes\\pos0x16-I3-rank4-10.dat», я позже подписал.

Вы сказали просто, что трех проколов быть не может, но вот тут их, выходит, три, или я как-то неправильно считаю?

Чем они отличаются, кстати, тоже не понял - по-моему, во всех трех случаях совершенно одинаково одна из точек треугольника проходила через основание. И ни по какому из критериев эти случаи как-то разделить нельзя. Почему в первом случае «прокол», во втором «крест», а в третьем - «сложный прокол», если динамика лучей абсолютно одинакова? В чем отличие тут?

Вашу идею насчет плоскости я пока до конца не осознал. Вроде же смешанные произведения дают то же самое?

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

anonymous
()
Ответ на: комментарий от AIv

(я такие штуки тоже строю, только еще лучи разными цветами рисую и крутить их могу;-)).

Черт, вот я дурак. Действительно - можно же лучи разными цветами раскрасить, а я все крестики с кружочками разглядываю :)

anonymous
()
Ответ на: комментарий от AIv

Вашу идею насчет плоскости я пока до конца не осознал. Вроде же смешанные произведения дают то же самое?

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

anonymous
()
Ответ на: комментарий от anonymous

если есть проблемы с запуском скрипта, то напишите, я вам результаты работы скрипта выложу.

Выложи

anonymous
()
Ответ на: комментарий от anonymous

Вы сказали просто, что трех проколов быть не может,

Я ошибся, не о тех данных говорил. В тех - может.

Чем они отличаются, кстати, тоже не понял

В 1м и 3м случае луч проходит между двумя другими. Во втором два луча пересекаются в одной точке, такое вообще редко бывает.

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

вот тот скрипт что говорит по этому поводу:

108 2.18 1
199 4 2
207 4.16 1
count: 3
вот картинки: 108, 199 и 207

anonymous
()
Ответ на: комментарий от AIv

В 1м и 3м случае луч проходит между двумя другими. Во втором два луча пересекаются в одной точке

Ага, ясно.

такое вообще редко бывает

странно, мне как раз часто попадалось :) Попадались даже случаи, когда лучи попарно подряд пересекаются (например, А с В, а на следующем шаге - В с С).

anonymous
()
Ответ на: комментарий от AIv

а я их (и похожих на них) только извлек :)

 str(l[1:3000][f@rotated[,1]<0][!(f1E@rotated[,1]< -10 & f1E@rotated[,2]>15)])
 chr [1:1700] "pos0x0-I0-rank4-1.dat" "pos0x10-I0-rank4-0.dat" ...
 str(l[1:3000][f@rotated[,1]>0][!(f1F@rotated[,1]< 10 & f1F@rotated[,2]> -10)])
 chr [1:707] "pos0x0-I0-rank4-0.dat" "pos0x10-I1-rank4-3.dat" ...

вот среди первых 3000 из листинга в l (это f1all.csv), те кто ведет себя так как I3 (два файла с разной симметрией f1E и f1F соответственно)

https://docs.google.com/file/d/0ByeNun2qEtnuSDFEdG9qLUtRZjg/edit?usp=sharing
https://docs.google.com/file/d/0ByeNun2qEtnuWE5EVUhqU3dDX1k/edit?usp=sharing
https://docs.google.com/file/d/0ByeNun2qEtnuRG5nRmNRZFVTd0E/edit?usp=sharing
psv1967 ★★★★★
()
Ответ на: комментарий от anonymous

У тебя в случаях, когда при проходе точки через основание есть шаг в котором треугольник почти вырождается в прямую, считает по два раза, по-моему. Как в 142 на tubes-G1.tgz/pos0x13-I3-rank4-1.dat, например.

anonymous
()
Ответ на: комментарий от anonymous

Вот здесь ведь не было выворота?

Тут их было сразу два, в одной призме. Это фокус.

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну сразу смотрите на трубки, у которых цифирь после I не совпадает с числом выворотов.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

пока получается, что когда у меня выворотов на 1 меньше, чем у вас - правильный вариант мой, а когда на 2 - правильный ваш (ориентация треугольника в случае фокуса не меняется, соответственно алгоритм это не ловит. надо этот конкретный кейз ловить отдельным костылем) :)

anonymous
()
Ответ на: комментарий от AIv

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

anonymous
()
Ответ на: комментарий от psv1967

в общем типы траекторий по пресловутым первым двум компонентам пересчитанным в кластеры различает в 100% (и похоже без переобучения, поскольку кроссвалидация 0), но нужно тупо указать что от чего отличать :)

весь код

l <- system2("ls", "./tubes", stdout = T)

read.table(paste0("./tubes/",l[1]))

schift.3.data <- function(data) {
  cbind(data[1:(nrow(data)-2),],
        data[2:(nrow(data)-1),],
        data[3:nrow(data),])
}


data <- do.call(rbind, lapply(1:length(l), function(i) schift.3.data(read.table(paste0("./tubes/",l[i]))[,2:11]) )) 

### кластерное разбиение пространства первых двух компонент для обобщения траектории трубок
data12plot<-unique(result$x[,1:2])
plot(data12plot)
res12kmean<-kmeans(result$x[,1:2], 32, nstart=50)
points(res12kmean$centers, col="blue")

data.tube.label <- sapply(1:length(l), function (i) nrow(read.table(paste0("./tubes/",l[i])))-2)
data.tube.label.long <- do.call(c, lapply(1:length(data.tube.label), function (i) rep(i, data.tube.label[i])) )
data.tube.label.long3000 <- do.call(c, lapply(1:3000, function (i) rep(i, data.tube.label[i])) )

### извлечение трубки
res12kmean$cluster[data.tube.label.long3000==132]

### уникальные переходы в трубке
data.tube.3000uniq <-  lapply(1:3000, function (i) unique(res12kmean$cluster[data.tube.label.long3000==i]))

data.tube3000.uniq.string <- sapply(1:3000, function(i) do.call(paste0, as.list((c(letters, LETTERS)[1:32])[data.tube.3000uniq[[i]]])) )

library(kernlab)

 I3<-rep(0,3000)
 I3[grep("-I3-", l)]<-1



> f.svm.I3 <- ksvm(as.list(data.tube3000.uniq.string), factor(I3[1:3000]), kernel="stringdot", kpar=list(type="exponential" ), cross=5, cache=200)
> f.svm.I3
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 1 

String kernel function.  Type =  exponential 
 Hyperparameters :  lambda =  1.1 
 Normalized 

Number of Support Vectors : 161 

Objective Function Value : -41.6456 
Training error : 0 
Cross validation error : 0 

просто классифицировать трубки без обучения я забарался :) судя по картинке kpca по последовательностям «вывертов» трубок там много переходных случаев, их лучше классифицировать по образцу.

нужен вектор с признаком «явно хороших» + признаком «явно плохих» тогда вручную пилить не придется (но сначала «манамана» с созданием вектора для обучения по образцу :) )

psv1967 ★★★★★
()
Ответ на: комментарий от anonymous

Если бы вы выложили номера шагов

Я сам их ловлю на смене знаков смешанного произведения. Но там все нетривиально , скажем фокус алгоритм ловит на двух шагах, хотя реально там все на одном происходит.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

1. читаю все файлы беря из них только «произведения»

2. делаю в каждом из файлов скользящее окно — «предыдущее, текущее, следующее».

3. сворачиваю PCA все тройки «предыдущее, текущее, следующее» по всем файлам данных в плоскость (график собственных значений в PCA говорит, что вся вариация укладывается в плоскость)

4. на плоскости забавная симметричная картина точек которые посещает по некой траектории каждая трубка-файл_данных.

5. разбиваю эту область кластерным анализом на зоны которые посещает траектория трубки-файла_данных. цель преобразовать траекторию к некой последовательности небольшого числа состояний.

6. Полученные последовательности-фразы описывают переходы в каждой трубке-файле данных. Обрабатываем это методом, вычисляющим расстояние между разными последовательностями-фразами по вхождению в них одинаковых подстрок...

7. попытка просто вслепую классифицировать эти подстроки весьма утомительной получается «их реально много разных"ТМ :). Но метод с обучением „по образцу“ прекрасно различает эти траектории выделяя скорее всего нечто общее в подстроках описывающих траектории. если задать вектор который показывает бяки-небяки, то ksvm имеет неплохии шансы (судя по моей попытке отличить *I3* с нулевой ошибкой кросвалидации) разделить бяк от небяк. (если появятся совпадения можно увеличить длину окна на входе в анализ)

PS возможно Ваши расчеты уже дали предварительную классификацию если ее представить в виде вектора к входным файлам, то можно попробовать применить для получения искомого классификатора.

psv1967 ★★★★★
()
Последнее исправление: psv1967 (всего исправлений: 2)
Ответ на: комментарий от anonymous

Произведения чего с чем? ориентация-то при фокусе остается той же.

Пусть нижнее основание призмы это вектора a1, a2, a3, верхнее основание это вектора b1, b2, b3. Смешанных произведений там можно много разных придумать, я пока использую

(a2-a1)%(b2-a2)*(b3-b2) и еще два таких же получаемых циклической перестановкой, и (b2-b1)%(b3-b2)*(b2-a2) и еще два таких же получаемых циклической перестановкой.

При фокусе первая тройка дружно меняет знаки туда и на след шаге обратно, при этом знаки второй тройки не меняются. С проколами и крестами все гораздо запутанней...

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

При фокусе первая тройка дружно меняет знаки туда и на след шаге обратно

Это странно. А на сколько вообще может треугольник провернуться вокруг отложенной от центра нормали за шаг? Есть какая-нибудь оценка? Фокус же от этого поворота ничем не отличается, значит должны быть ложные срабатывания при «скручивании»...

С проколами и крестами все гораздо запутанней...

Ни одного случая, когда смена сонаправленности скорости и нормали не срабатывает с крестами/проколами так и не нашел пока.

anonymous
()
Ответ на: комментарий от anonymous

и давайте объясню новые столбцы результата, скажем возьмем файл tubes-G1.tgz/pos1x17-I4-rank4-20.dat:

102 2.06 4 4 4
214 4.3 4 0 4
215 4.32 0 4 0
count: 3
последние 3 столбца означают три луча описанных в исходном файле, значения в этих столбцах означают следующее: 0 - луч с очень малой вероятностью проходил через призму, отличное от нуля - высокая вероятность прохода через призму. случай 4 4 4 - призма развернулась на этом шаге.

и ошибка в этом же файле - 214 и 215 (вопрос правда ошибка ли это). если смотреть, то кажется что такой же разворот должен быть, что и на 102 шаге, но большая вероятность утянула 4-ки с 215 шага на 214. в файле отладки это видно следующим образом:

102 2.06  -1 -1 -1 -1  -1 -1 -1 -1  -1 -1 -1 -1 : 4 4 4
214 4.3   2 -1 -1 -1   2  2  2  2  -1  2 -1 -1 : 3 0 3
215 4.32   2  2 -1  2  -1 -1 -1 -1   2  2  2 -1 : 4 4 4
объяснение файла отладки: 3 сгруппированных столбца означают соответствующие лучи и положение точки относительно плоскостей (2 точки, 2 плоскости - 4 цифры), значения - "-1" - вероятное пересечение, «0» - очень малое пересечение (вероятно грань треугольника в одну точку свелась), «2» - нет пересечения (2 - для наглядности, что-бы отличалась от -1).

в итоге, файл отладки показал на 214 шаге большую вероятность перехода через призму 1-вого и 3-его лучей, и подтвердилось на 215 шаге, у 215 шага (кроме 1 и 3-его лучей) появилась очень высокая вероятность прохода через призму 2-ого луча.

anonymous
()
Ответ на: комментарий от anonymous

я бы сказал что я просто точки особенные посчитал, но пересчитать теперь на что угодно не составляет труда думаю

anonymous
()
Ответ на: комментарий от anonymous

вот тут объяснение было написано. если будет непонятно, ещё раз спроси, постараюсь по подробней описать.

anonymous
()
Ответ на: комментарий от anonymous

если хочется другой язык программирования, то тоже называйте язык. а хоть результат то правильный?

anonymous
()
Ответ на: комментарий от anonymous

ещё, правда недостаток нашелся, заключается в эффекте «поглощения» предыдущих шагов. если две призмы идущие одна за другой имеют «прокол» по одной и той же грани, то в файл результата будет записан только последний прокол, хотя в файл отладки будет записана вероятность и предпоследнего прокола. если такие вещи нужно разделять, то код несложно переписывается под это дело.

anonymous
()
Ответ на: комментарий от psv1967

и ebantrop, Manhunt - спасибо за обсуждение.

Решение как ни странно оказалось совершенно другим (все беды из за лени). Берем одну призму, параметризуем (линейно) координаты лучей на шаге, параметр t в диапазоне [0,1). В итоге получаем параметризованную нормаль к сечению призмы как векторное произведение сторон треугольника-сечения призмы (при изменении t от 0 до 1 сечение переходит из одного в другое основание призмы), это квадратичная форма от t.

Считаем сумму нормалей лучей (нормаль это направление распространения луча) на одной грани и на другой, получаем средни нормали. Параметризуем линейно среднюю нормаль по t, перемножаем скалярно на нормаль сечения получаем кубическую форму. Число «выворачивания» для данной призмы это число корней в интервале [0,1), решать кубическое уравнение не обязательно - число корней ищется и без непосредственного решения.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

спасибо что не забыли упомянуть и отписались о результатах, пишите, если снова появятся интересные задачи.

anonymous
()
Ответ на: комментарий от AIv

ждем следующих задач, может где нибудь машинное обучение более пригодится.

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.