Olá! Estou tentando fazer o algoritmo do caixeiro viajante em java para um trabalho da faculdade. Porém, estou preso na hora de fazer a matriz de adjacência! A idéia é pegar os valores dos jtextfield em que o usuário colocou os custos de cada aresta e passá-los para uma matriz de inteiro (esta é a matriz de adjacência). Segue o código:
public class CV extends JFrame {
private JPanel contentPane;
private JTextField BD;
private JTextField AB;
private JTextField AC;
private JTextField CD;
private JTextField BE;
private JTextField BF;
private JTextField CF;
private JTextField FG;
private JTextField DG;
private JTextField EG;
private JTextField CE;
private JPanel panel;
private JTextPane textPane;
private ArrayList<String> valores;
// Variavel global para definir o numero de cidades
public static int NUMERO_CIDADES = 7;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CV frame = new CV();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public CV() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 780, 553);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
setLocationRelativeTo(null);
setResizable(false);
panel = new JPanel();
textPane = new JTextPane();
textPane.setEditable(false);
textPane.setBorder(new LineBorder(new Color(0, 0, 0), 2));
JToggleButton btnCalcular = new JToggleButton("Calcular");
btnCalcular.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (btnCalcular.isSelected()) {
Calcular();
} else {
Resetar();
}
}
});
JLabel lblCalcularMenorRota = new JLabel("Calcular Menor Rota!");
lblCalcularMenorRota.setFont(new Font("Tahoma", Font.PLAIN, 12));
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(gl_contentPane.createParallelGroup(Alignment.LEADING).addGroup(gl_contentPane
.createSequentialGroup().addContainerGap()
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(textPane, GroupLayout.PREFERRED_SIZE, 612, GroupLayout.PREFERRED_SIZE)
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(panel, GroupLayout.PREFERRED_SIZE, 620, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(lblCalcularMenorRota, GroupLayout.PREFERRED_SIZE, 127,
GroupLayout.PREFERRED_SIZE)
.addComponent(btnCalcular, GroupLayout.PREFERRED_SIZE, 98,
GroupLayout.PREFERRED_SIZE))))
.addContainerGap(49, Short.MAX_VALUE)));
gl_contentPane.setVerticalGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(panel, GroupLayout.PREFERRED_SIZE, 374, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(textPane, GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE))
.addGroup(gl_contentPane.createSequentialGroup().addGap(10)
.addComponent(btnCalcular, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(lblCalcularMenorRota, GroupLayout.PREFERRED_SIZE, 23, GroupLayout.PREFERRED_SIZE)
.addGap(435)));
JLabel label = new JLabel("");
label.setBounds(0, 10, 614, 354);
panel.setLayout(null);
label.setIcon(new ImageIcon("src/CaixeiroViajante.png"));
label.setBorder(new LineBorder(new Color(0, 0, 0), 2, true));
panel.add(label);
BD = new JTextField();
BD.setForeground(Color.BLACK);
BD.setBackground(Color.WHITE);
BD.setBounds(259, 32, 27, 30);
panel.add(BD);
BD.setColumns(10);
AB = new JTextField();
AB.setColumns(10);
AB.setBounds(88, 109, 27, 30);
panel.add(AB);
AC = new JTextField();
AC.setColumns(10);
AC.setBounds(88, 233, 27, 30);
panel.add(AC);
CD = new JTextField();
CD.setColumns(10);
CD.setBounds(320, 84, 27, 30);
panel.add(CD);
BE = new JTextField();
BE.setColumns(10);
BE.setBounds(307, 139, 27, 30);
panel.add(BE);
BF = new JTextField();
BF.setColumns(10);
BF.setBounds(295, 261, 27, 30);
panel.add(BF);
CF = new JTextField();
CF.setColumns(10);
CF.setBounds(247, 321, 27, 30);
panel.add(CF);
FG = new JTextField();
FG.setColumns(10);
FG.setBounds(468, 266, 27, 30);
panel.add(FG);
DG = new JTextField();
DG.setColumns(10);
DG.setBounds(468, 69, 27, 30);
panel.add(DG);
EG = new JTextField();
EG.setColumns(10);
EG.setBounds(445, 139, 27, 30);
panel.add(EG);
CE = new JTextField();
CE.setColumns(10);
CE.setBounds(285, 193, 27, 30);
panel.add(CE);
contentPane.setLayout(gl_contentPane);
}
protected void Resetar() {
for (Component c : panel.getComponents()) {
if (c instanceof JTextField) {
((JTextField) c).setText(null);
((JTextField) c).setEditable(true);
textPane.setText(null);
}
}
}
private void Calcular() {
valores = new ArrayList<String>();
for (Component c : panel.getComponents()) {
if (c instanceof JTextField) {
JTextField textfield = JTextField.class.cast(c);
textfield.setEditable(false);
valores.add(textfield.getText());
}
}
// Vetor para atribuir uma letra do alfabeto em ordem crescente as cidades
String[] cidades = new String[NUMERO_CIDADES];
// Vetor para atribuir letras do alfabeto as cidades em ordem crescente
String[] alfabeto = { "A", "B", "C", "D", "E", "F", "G" };
// Popula o vetor de cidades com as letras em ordem crescente
for (int i = 0; i < NUMERO_CIDADES; i++) {
cidades[i] = alfabeto[i];
}
// Cria a matriz de adjecencia do tamanho dos caminhos entre as cidades
int mapa[][] = new int[11][11];
// Inicializa a matriz de adjencia em 0
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
mapa[i][j] = 0;
}
}
// Popula a matriz de adjecencia com os valores informados pelo usuario
// (replica o triangulo inferior de acordo com o triangulo superior)
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (i == j) {
mapa[i][j] = 0;
} else if (mapa[i][j] == 0) {
Iterator<String> it = valores.iterator();
while (it.hasNext()) {
mapa[i][j] = Integer.parseInt(it.next());
mapa[j][i] = mapa[i][j];
}
}
}
}
// Mostra a matriz no textPane
for (int i = 0; i < 11; i++) {
System.out.println();
for (int j = 0; j < 11; j++) {
System.out.printf("%d ", mapa[i][j]);
textPane.setText(String.valueOf(mapa[i][j]));
}
}
}
}
Inserindo alguns valores assim:
A matriz resultante fica assim:
0 20 20 20 20 20 20 20 20 20 20
20 0 20 20 20 20 20 20 20 20 20
20 20 0 20 20 20 20 20 20 20 20
20 20 20 0 20 20 20 20 20 20 20
20 20 20 20 0 20 20 20 20 20 20
20 20 20 20 20 0 20 20 20 20 20
20 20 20 20 20 20 0 20 20 20 20
20 20 20 20 20 20 20 0 20 20 20
20 20 20 20 20 20 20 20 0 20 20
20 20 20 20 20 20 20 20 20 0 20
20 20 20 20 20 20 20 20 20 20 0
O que está errado!
Alguém pode me a ajudar a achar o erro e/ou entender como deveria funcionar esse algoritmo por favor?
Agradeço a atenção desde já!
