Algoritmo para combinar faixas de um segmento - ajuda a criar

 

Por favor, ajude-me a criar um algoritmo que combine peças (faixas) de um segmento em um segmento sem interseção de segmentos, com uma possível lacuna a ser preenchida posteriormente.

Inicialmente temos uma matriz de números em um determinado intervalo, os números podem ser repetidos, essa matriz é dividida em segmentos por fronteiras. As fronteiras são geradas por diferentes algoritmos, geralmente os limites não são uniformes, de modo que se verifica que o conjunto de números cortados por diferentes métodos e cada faixa tem um tamanho diferente. Em seguida, uma avaliação de cada um desses segmentos por três critérios, cada critério tem seu próprio limite, cuja inobservância elimina uma parte da faixa. Como resultado, obtemos uma tabela com o seguinte conteúdo.

i - número seqüencial da faixa;

S - limite de início de alcance;

F - limite final da faixa;

%R - critério #1;

%dP - critério número 2;

%K_SCO - critério número 3;

K_Svod - avaliação sumária de todos os critérios.

A figura abaixo mostra como os pedaços (segmentos) podem ser colocados no avião:

As 3 cores das marcas de controle ao lado das peças são soluções potenciais para o problema.

O algoritmo deve fornecer diferentes combinações de soluções para o problema, de modo que a condição seja cumprida:

1. os segmentos são combinados sem cruzar os intervalos (S>=A && F<B);

2. É impossível adicionar mais um segmento dos disponíveis - ou seja, alguma completude e densidade máxima procedentes de variantes escolhidas e disponíveis;

3. A seqüência de segmentos é ordenada - para eliminar combinações similares;

4. Pelo menos uma das melhores barras é usada, dos30% melhores de acordo comK_Svod- para reduzir as combinações e para manter a prioridade da melhor pontuação.

O ideal seria que a estimativa de qualidade fosse para maximizar a soma de todos os segmentos de acordo com K_Svod, mas poderia ser necessário corrigi-la um pouco para estimar o espaço/espaços de preenchimento.

Talvez eu tenha usado terminologia errada e meu problema já tenha sido resolvido há muito tempo - não julgue - me esclarece.

 
Aleksey Vyazmikin:


1) K_Svod - avaliação resumida de todos os critérios.

2) A figura abaixo mostra como as peças (segmentos) podem ser colocadas no plano:

3) Os segmentos são combinados sem interseções de faixa (S>=A && F<B);

1) o que é isto? por que x's?

2) mostrar melhor com uma imagem o que está certo e o que está errado

3) o que é "A" e o que é "B" ?

4) Faça também um "mock-up" da tabela de dados e mostre o que você quer ver como uma solução satisfatória
 
Possivelmente resolvido em termos de teoria gráfica. Os vértices de um gráfico são segmentos, as setas do gráfico conectam cada vértice a todos os possíveis vértices subseqüentes (os segmentos permitidos mais próximos). Cada vértice e flecha é marcado com pesos e uma regra é definida pela qual o peso de cada caminho é contado. Algum algoritmo para encontrar o caminho ótimo no gráfico é aplicado. Não estou pronto para investigar a questão com mais detalhes)
 
mytarmailS:

1) o que é isso? por que X?

2) é melhor mostrar com uma imagem o que está certo e o que está errado ?

3) o que é "A" e o que é "B" ?

4) faça também uma "maquete" da tabela de dados e mostre o que você quer ver como uma solução satisfatória

1. é um derivado de todas as 3 avaliações, X do fato de ainda não ter decidido sobre pesos, não é essencial.

2. A solução correta é preencher o espaço com segmentos (uma linha com provável espaço não preenchido entre segmentos) - na figura acima eu assinalei as cores para cada uma das 3 soluções possíveis. É possível pensar em heurística adicional, digamos que a soma da faixa alocada de todos os segmentos é a maior possível, mas além da soma o valor K_Svod também é importante.

3) Este é um valor de números dentro do segmento, seria melhor escrever A1>=S1 && A1<F1 && F1<S2.

4. A solução seria uma matriz com índices. Ou eu não entendia a pergunta. Algoritmo, como fazer melhor, eu não sei.

 
Aleksey Nikolayev:
Provavelmente resolvido em termos de teoria gráfica. Os vértices de um gráfico são segmentos, as setas do gráfico conectam cada vértice com todos os possíveis vértices subseqüentes (os segmentos permissíveis mais próximos). Cada vértice e flecha é marcado com pesos e uma regra é definida pela qual o peso de cada caminho é contado. Algum algoritmo para encontrar o caminho ótimo no gráfico é aplicado. Não estou pronto para investigar a questão com mais detalhes)

Obrigado pela idéia, acho que é possível começar a construir a seqüência a partir do topo de cada índice i e depois avaliar as combinações resultantes. Tudo o que precisamos é de um critério de seleção ou vários critérios para obter diferentes combinações. Ou randomizar critérios.... ainda não está claro.

 
Aleksey Vyazmikin:

1. é um derivado de todas as 3 avaliações, os X do fato de ainda não ter decidido sobre os pesos - não é essencial.

2. A solução correta é preencher o espaço com segmentos (uma linha com provável espaço não preenchido entre segmentos) - na figura acima, eu assinalei as cores para cada uma das 3 soluções possíveis. É possível pensar em heurística adicional, digamos que a soma da faixa alocada de todos os segmentos é a maior possível, mas além da soma, o valor K_Svod também é importante.

3) Este é um valor de números dentro do segmento, seria melhor escrever A1>=S1 && A1<F1 && F1<S2.

4. A solução seria uma matriz com índices. Ou eu não entendia a pergunta. O algoritmo, como fazê-lo melhor, eu não sei.

Eu ainda não entendi.

 
Aleksey Vyazmikin:

Obrigado pela idéia, acho que é possível começar a construir a seqüência a partir do topo de cada índice i e depois avaliar as combinações resultantes. Tudo o que precisamos é de um critério de seleção ou vários critérios para obter diferentes combinações. Ou randomizar critérios.... ainda não está claro.

E onde estão os carrapatos, eles têm algum tipo de critério de que o segmento pertence a esse carrapato?
Basicamente, você recebe três carrapatos. Azul, vermelho, verde.
Portanto, neste exemplo, três identificadores.
Se você atribuir estes identificadores de alguma forma, você pode concatená-los em três arrays principais.
Usando o identificador, obtemos o tamanho do segmento resultante,
use o identificador para definir a matriz principal de recepção eaumentar sua capacidade por este tamanho,
use o identificador para inserir o segmento no final da matriz.
Portanto, precisamos definir algum critério para que o segmento pertença a esta caixa de seleção (identificador).

 
mytarmailS:

Eu ainda não entendo

Por favor, esclareça o que você não entende - vou tentar explicar em outras palavras.

 
Roman:

Mas onde estão os carrapatos, eles têm algum tipo de critério de que o segmento pertence a esse carrapato?
Basicamente, você tem três carrapatos. Azul, vermelho, verde.
Portanto, neste exemplo, três identificadores.
Se você atribuir estes identificadores de alguma forma, você pode concatená-los em três arrays principais.
Por identificador obtemos o tamanho do segmento resultante,
por identificador definimos uma matriz de recepção básica eaumentamos sua capacidade por este tamanho,
por identificador inserimos o segmento ao final da matriz.
Portanto, precisamos definir algum critério para que o segmento pertença a esta caixa de seleção (identificador).

Eu desenhei os segmentos, depois pensei em mostrar a opção de combiná-los - eu olhei as combinações que não se sobrepõem e juntos ocupam uma grande área. Observe que alguns dos segmentos têm dois carrapatos, o que significa que é possível ter o segmento em mais de uma combinação.

Ou seja, não há identificador antes do início do processamento de dados.
 
Aleksey Vyazmikin:

Eu desenhei os segmentos, depois pensei em mostrar a opção de combiná-los - olhei para as combinações que não se cruzam e que juntas ocupam uma área maior. Observe que alguns dos segmentos têm dois carrapatos, o que significa que é possível ter o segmento em mais de uma combinação.

Isto é, não há identificador antes do início do processamento de dados.

Talvez com base em seu algoritmo, cada segmento possa ser identificado por algum critério e atribuído um identificador.
E o fato de um segmento poder estarem mais de uma combinação depende se ele precisa ser adicionado à matriz principal novamente ou não.
Use operadoresternários ou condicionais para brincar com a lógica.

 
Roman:

Talvez com base em seu algoritmo, cada segmento possa ser identificado por algum critério e atribuído um identificador.
E o fato de um segmento poder estarem mais de uma combinação depende se ele precisa ser adicionado à matriz principal novamente ou não.
Use operadoresternários ou condicionais para brincar com a lógica.

Portanto, não há algoritmo para começar :) Cada segmento é identificado por um número ordinal e tem informações sobre coordenadas (eixo X) e algum tipo de estimativa de utilidade nessas coordenadas.

Até agora, apenas uma idéia vem à mente - escolher o segmento mais próximo da idéia inicial. Talvez desta forma possamos escolher os 3 primeiros mais próximos, dependendo do número de segmentos, o número de combinações crescerá.